diffing dir...
Mon Apr 1 22:02:34 BST 2013 Daniel Wagner <da...@wa...>
* don't emit overlapping patterns when generating toEnum
Ignore-this: f1134171659d07bb3ddf88b17ee1eafc
hunk ./tools/c2hs/gen/GenBind.hs 116
-import Data.List (deleteBy, intersperse, isPrefixOf, find)
+import Data.List (deleteBy, intersperse, isPrefixOf, find, nubBy)
hunk ./tools/c2hs/gen/GenBind.hs 632
- "instance Enum " ++ ident ++ " where\n" [_$_]
- ++ fromDef list 0 ++ "\n" ++ toDef list 0 ++ "\n"
+ "instance Enum " ++ ident ++ " where\n"
+ ++ fromDef flatList ++ "\n" ++ toDef flatList ++ "\n"
hunk ./tools/c2hs/gen/GenBind.hs 638
- fromDef [] _ = ""
- fromDef ((ide, exp):list) n = [_$_]
- " fromEnum " ++ ide ++ " = " ++ show' val ++ "\n" [_$_]
- ++ fromDef list (val + 1)
+ flatList = flatten list 0
+
+ flatten [] n = []
+ flatten ((ide, exp):list) n = (ide, val) : flatten list (val + 1)
hunk ./tools/c2hs/gen/GenBind.hs 644
- Nothing -> n
- Just (CConst (CIntConst m _) _) -> m
- Just _ -> [_$_]
- interr "GenBind.enumInst: Integer constant expected!"
- --
- show' x = if x < 0 then "(" ++ show x ++ ")" else show x
- --
- toDef [] _ = [_$_]
- " toEnum unmatched = error (\"" ++ ident [_$_]
+ Nothing -> n
+ Just (CConst (CIntConst m _) _) -> m
+ Just _ -> interr "GenBind.enumInst: Integer constant expected!"
+
+ show' x = if x < 0 then "(" ++ show x ++ ")" else show x
+ fromDef list = concat
+ [ " fromEnum " ++ ide ++ " = " ++ show' val ++ "\n"
+ | (ide, val) <- list
+ ]
+ toDef list = concat
+ [ " toEnum " ++ show' val ++ " = " ++ ide ++ "\n"
+ | (ide, val) <- nubBy (\x y -> snd x == snd y) list
+ ]
+ ++ " toEnum unmatched = error (\"" ++ ident
hunk ./tools/c2hs/gen/GenBind.hs 659
- toDef ((ide, exp):list) n = [_$_]
- " toEnum " ++ show' val ++ " = " ++ ide ++ "\n" [_$_]
- ++ toDef list (val + 1)
- where
- val = case exp of
- Nothing -> n
- Just (CConst (CIntConst m _) _) -> m
- Just _ -> [_$_]
- interr "GenBind.enumInst: Integer constant expected!"
- --
- show' x = if x < 0 then "(" ++ show x ++ ")" else show x
+
|