@@ -1,5 +1,6 @@
11module AST.Type
2− ( Type(..), RawType, CanonicalType
2+ ( Type(..), AliasType(..)
3+ , RawType, CanonicalType
34 , PortType(..), PortDirection(..)
45 , fieldMap, recordOf, listOf, tupleOf
56 , deepDealias, dealias
@@ -26,7 +27,13 @@ data Type var
2627 | Type var
2728 | App (Type var) [Type var]
2829 | Record [(String, Type var)] (Maybe (Type var))
29− | Aliased Var.Canonical [(String, Type var)] (Type var)
30+ | Aliased Var.Canonical [(String, Type var)] (AliasType var)
31+ deriving (Eq,Show)
32+
33+
34+data AliasType var
35+ = Holey (Type var)
36+ | Filled (Type var)
3037 deriving (Eq,Show)
3138
3239
@@ -102,9 +109,14 @@ deepDealias tipe =
102109 App (go f) (map go args)
103110
104111
105−dealias :: [(String, Type v)] -> Type v -> Type v
106−dealias args tipe =
107− dealiasHelp (Map.fromList args) tipe
112+dealias :: [(String, Type v)] -> AliasType v -> Type v
113+dealias args aliasType =
114+ case aliasType of
115+ Holey tipe ->
116+ dealiasHelp (Map.fromList args) tipe
117+
118+ Filled tipe ->
119+ tipe
108120
109121
110122dealiasHelp :: Map.Map String (Type var) -> Type var -> Type var
@@ -188,13 +200,6 @@ instance (Var.ToString var, Pretty var) => Pretty (Type var) where
188200 prettyField (field, tipe) =
189201 P.text field <+> P.text ":" <+> pretty tipe
190202
191− Aliased name [] t ->
192− let t' = pretty t
193− in
194− if show t' `elem` ["Int", "Float", "String", "Char", "Bool"]
195− then t'
196− else pretty name
197−
198203 Aliased name args _ ->
199204 P.hang (pretty name) 2 (P.sep (map (prettyParens . snd) args))
200205
@@ -246,8 +251,8 @@ flattenRecord tipe =
246251 in
247252 (fields' ++ fields, ext')
248253
249− Aliased _ _ tipe' ->
250− flattenRecord tipe'
254+ Aliased _ args tipe' ->
255+ flattenRecord (dealias args tipe')
251256
252257 _ ->
253258 error "Trying to flatten ill-formed record."
@@ -286,3 +291,20 @@ instance Binary var => Binary (Type var) where
286291 4 -> Record <$> get <*> get
287292 5 -> Aliased <$> get <*> get <*> get
288293 _ -> error "Error reading a valid type from serialized string"
294+
295+
296+instance Binary var => Binary (AliasType var) where
297+ put aliasType =
298+ case aliasType of
299+ Holey tipe ->
300+ putWord8 0 >> put tipe
301+
302+ Filled tipe ->
303+ putWord8 1 >> put tipe
304+
305+ get = do
306+ n <- getWord8
307+ case n of
308+ 0 -> Holey <$> get
309+ 1 -> Filled <$> get
310+ _ -> error "Error reading a valid type from serialized string"