isperse :: a [[a] -> [a]] [a] -> [a]
isperse s m c = foldr id c $ intersperse (\c->[s:c]) m
-gTypeToType :: GType -> Maybe Type
-gTypeToType (GTyBasic a) = pure $ TyBasic a
-gTypeToType (GTyRef a) = pure $ TyRef a
-gTypeToType (GTyArrow l r) = TyArrow <$> gTypeToType l <*> gTypeToType r
-gTypeToType (GTyArray s a) = TyArray s <$> gTypeToType a
-gTypeToType (GTyUList s a) = TyUList s <$> gTypeToType a
-gTypeToType (GTyRecord i t) = TyRecord i <$> gtrec t
+gTypeToType :: GType -> Type
+gTypeToType (GTyBasic a) = TyBasic a
+gTypeToType (GTyRef a) = TyRef a
+gTypeToType (GTyArrow l r) = TyArrow (gTypeToType l) (gTypeToType r)
+gTypeToType (GTyArray s a) = TyArray s (gTypeToType a)
+gTypeToType (GTyUList s a) = TyUList s (gTypeToType a)
+gTypeToType (GTyRecord i t) = TyRecord i (gtrec t [])
where
- gtrec (GTyField i t) = (\x->[(i, x)]) <$> gTypeToType t
- gtrec (GTyPair l r) = (++) <$> gtrec l <*> gtrec r
- gtrec _ = Nothing
+ gtrec :: GType [(GenericFieldDescriptor, Type)] -> [(GenericFieldDescriptor, Type)]
+ gtrec (GTyField i t) c = [(i, gTypeToType t):c]
+ gtrec (GTyPair l r) c = gtrec l $ gtrec r c
+ gtrec _ c = c
gTypeToType (GTyObject i=:{gtd_num_conses=0} t)
- = TyNewType i (hd i.gtd_conses) <$> gTypeToType t
-gTypeToType (GTyObject i t) = TyObject i <$> gtobj t
+ = TyNewType i (hd i.gtd_conses) (gTypeToType t)
+gTypeToType (GTyObject i t) = TyObject i (gtobj t [])
where
- gtobj :: GType -> Maybe [(GenericConsDescriptor, [Type])]
- gtobj (GTyEither l r) = (++) <$> gtobj l <*> gtobj r
- gtobj (GTyCons i a) = (\x->[(i, x)]) <$> gtcons a
- gtobj _ = Nothing
+ gtobj :: GType [(GenericConsDescriptor, [Type])] -> [(GenericConsDescriptor, [Type])]
+ gtobj (GTyEither l r) c = gtobj l $ gtobj r c
+ gtobj (GTyCons i a) c = [(i, gtcons a []):c]
+ gtobj _ c = c
- gtcons :: GType -> Maybe [Type]
- gtcons GTyUnit = pure []
- gtcons (GTyPair l r) = (++) <$> gtcons l <*> gtcons r
- gtcons t = (\x->[x]) <$> gTypeToType t
+ gtcons :: GType [Type] -> [Type]
+ gtcons GTyUnit c = c
+ gtcons (GTyPair l r) c = gtcons l $ gtcons r c
+ gtcons t c = [gTypeToType t:c]
:: FlatMonad :== State FMState GType
:: FMState = { objects :: [String], types :: [GType], otypes :: [GType], depth :: Int }