Add support for lists/frozensets in convert-constants
authorIustin Pop <iustin@google.com>
Fri, 23 Dec 2011 09:43:50 +0000 (10:43 +0100)
committerIustin Pop <iustin@google.com>
Fri, 13 Jan 2012 13:16:16 +0000 (14:16 +0100)
Unfortunately, we only support lists of simple types, and not even
lists of tuples. If we actually needed those, it would be possible to
implement them, with a bit more complexity in the converter.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: RenĂ© Nussbaumer <rn@google.com>

autotools/convert-constants

index 0bb1c64..89f9f00 100755 (executable)
@@ -109,6 +109,26 @@ def ConvertVariable(name, value):
       lines.append("%s = (%s)" % (hs_name, tvals))
     else:
       lines.append("-- Skipped tuple %s, cannot convert all elements" % name)
+  elif isinstance(value, (list, set, frozenset)):
+    # Lists and frozensets are handled the same in Haskell: as lists,
+    # since lists are immutable and we don't need for constants the
+    # high-speed of an actual Set type. However, we can only convert
+    # them if they have the same type for all elements (which is a
+    # normal expectation for constants, our code should be well
+    # behaved); note that this is different from the tuples case,
+    # where we always (for some values of always) can convert
+    tvs = [HaskellTypeVal(elem) for elem in value]
+    if compat.all(e is not None for e in tvs):
+      ttypes, tvals = zip(*tvs)
+      uniq_types = set(ttypes)
+      if len(uniq_types) == 1:
+        lines.append("-- | Converted from Python list or set %s" % name)
+        lines.append("%s :: [%s]" % (hs_name, uniq_types.pop()))
+        lines.append("%s = [%s]" % (hs_name, ", ".join(tvals)))
+      else:
+        lines.append("-- | Skipped list/set %s, is not homogeneous" % name)
+    else:
+      lines.append("-- | Skipped list/set %s, cannot convert all elems" % name)
   else:
     lines.append("-- Skipped %s, %s not handled" % (name, type(value)))
   return lines