From: Daniel W. <dm...@lu...> - 2013-04-01 21:09:06
|
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 + |