on f4401ac help sign in
126 lines 2.3 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module AST.Utils.Type
4 ( delambda
5 , dealias
6 , deepDealias
7 , iteratedDealias
8 )
9 where
12import qualified Data.Map as Map
13import qualified Data.Name as Name
15import AST.Canonical (Type(..), AliasType(..), FieldType(..))
19-- DELAMBDA
22delambda :: Type -> [Type]
23delambda tipe =
24 case tipe of
25 TLambda arg result ->
26 arg : delambda result
28 _ ->
29 [tipe]
33-- DEALIAS
36dealias :: [(Name.Name, Type)] -> AliasType -> Type
37dealias args aliasType =
38 case aliasType of
39 Holey tipe ->
40 dealiasHelp (Map.fromList args) tipe
42 Filled tipe ->
43 tipe
46dealiasHelp :: Map.Map Name.Name Type -> Type -> Type
47dealiasHelp typeTable tipe =
48 case tipe of
49 TLambda a b ->
50 TLambda
51 (dealiasHelp typeTable a)
52 (dealiasHelp typeTable b)
54 TVar x ->
55 Map.findWithDefault tipe x typeTable
57 TRecord fields ext ->
58 TRecord (Map.map (dealiasField typeTable) fields) ext
60 TAlias home name args t' ->
61 TAlias home name (map (fmap (dealiasHelp typeTable)) args) t'
63 TType home name args ->
64 TType home name (map (dealiasHelp typeTable) args)
66 TUnit ->
67 TUnit
69 TTuple a b maybeC ->
70 TTuple
71 (dealiasHelp typeTable a)
72 (dealiasHelp typeTable b)
73 (fmap (dealiasHelp typeTable) maybeC)
76dealiasField :: Map.Map Name.Name Type -> FieldType -> FieldType
77dealiasField typeTable (FieldType index tipe) =
78 FieldType index (dealiasHelp typeTable tipe)
82-- DEEP DEALIAS
85deepDealias :: Type -> Type
86deepDealias tipe =
87 case tipe of
88 TLambda a b ->
89 TLambda (deepDealias a) (deepDealias b)
91 TVar _ ->
92 tipe
94 TRecord fields ext ->
95 TRecord (Map.map deepDealiasField fields) ext
97 TAlias _ _ args tipe' ->
98 deepDealias (dealias args tipe')
100 TType home name args ->
101 TType home name (map deepDealias args)
103 TUnit ->
104 TUnit
106 TTuple a b c ->
107 TTuple (deepDealias a) (deepDealias b) (fmap deepDealias c)
110deepDealiasField :: FieldType -> FieldType
111deepDealiasField (FieldType index tipe) =
112 FieldType index (deepDealias tipe)
116-- ITERATED DEALIAS
119iteratedDealias :: Type -> Type
120iteratedDealias tipe =
121 case tipe of
122 TAlias _ _ args realType ->
123 iteratedDealias (dealias args realType)
125 _ ->
126 tipe