Add datacons_for function to get the datacons for a TypedThing.
authorMatthijs Kooijman <matthijs@stdin.nl>
Wed, 16 Jun 2010 10:37:20 +0000 (12:37 +0200)
committerMatthijs Kooijman <matthijs@stdin.nl>
Wed, 16 Jun 2010 10:37:20 +0000 (12:37 +0200)
clash/CLasH/Utils/Core/CoreTools.hs

index c7bce65eeceabaa27b691ce929a8117014ff8e57..7d5423ccc16b39ccf2c96e8cd2ee8e4fc0eab242 100644 (file)
@@ -152,16 +152,23 @@ tfvec_elem ty = el_ty
 -- | Gets the index of the given datacon in the given typed thing.
 -- Errors out if it does not occur or if the type is not an ADT.
 datacon_index :: TypedThing t => t -> DataCon.DataCon -> Int
-datacon_index tt dc =
+datacon_index tt dc = case List.elemIndex dc dcs of
+    Nothing -> error $ "Datacon " ++ pprString dc ++ " does not occur in typed thing: " ++ pprString tt
+    Just i -> i
+  where
+    dcs = datacons_for tt
+
+-- | Gets all datacons for the given typed thing. Errors out if the
+-- typed thing is not ADT typed.
+datacons_for :: TypedThing t => t -> [DataCon.DataCon]
+datacons_for tt =
   case getType tt of
     Nothing -> error $ "Getting datacon index of untyped thing? " ++ pprString tt
     Just ty -> case Type.splitTyConApp_maybe ty of
       Nothing -> error $ "Trying to find datacon in a type without a tycon?" ++ pprString ty
       Just (tycon, _) -> case TyCon.tyConDataCons_maybe tycon of
         Nothing -> error $ "Trying to find datacon in a type without datacons?" ++ pprString ty
-        Just dcs -> case List.elemIndex dc dcs of
-          Nothing -> error $ "Datacon " ++ pprString dc ++ " does not occur in type: " ++ pprString ty
-          Just i -> i
+        Just dcs -> dcs
 
 -- Is the given core expression a lambda abstraction?
 is_lam :: CoreSyn.CoreExpr -> Bool