on 0bdfd73 help sign in
elk/src/AST/Utils/Type.hs
116 lines 2.0 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
14import AST.Canonical (Type(..), AliasType(..))
15import qualified Elm.Name as N
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 :: [(N.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 N.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 (dealiasHelp 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)
77-- DEEP DEALIAS
80deepDealias :: Type -> Type
81deepDealias tipe =
82 case tipe of
83 TLambda a b ->
84 TLambda (deepDealias a) (deepDealias b)
86 TVar _ ->
87 tipe
89 TRecord fields ext ->
90 TRecord (Map.map deepDealias fields) ext
92 TAlias _ _ args tipe' ->
93 deepDealias (dealias args tipe')
95 TType home name args ->
96 TType home name (map deepDealias args)
98 TUnit ->
99 TUnit
101 TTuple a b c ->
102 TTuple (deepDealias a) (deepDealias b) (fmap deepDealias c)
106-- ITERATED DEALIAS
109iteratedDealias :: Type -> Type
110iteratedDealias tipe =
111 case tipe of
112 TAlias _ _ args realType ->
113 iteratedDealias (dealias args realType)
115 _ ->
116 tipe