1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
5 , Canonical(..), Aliased(..)
6 , deepDealias, iteratedDealias, dealias
12import Control.Arrow (second)
13import Control.Monad (liftM, liftM2, liftM3, replicateM)
15import qualified Data.Map as Map
16import Data.Text (Text)
18import qualified AST.Helpers as Help
19import qualified AST.Module.Name as ModuleName
20import qualified AST.Variable as Var
21import qualified Reporting.Annotation as A
22import qualified Reporting.Region as R
36 | RType (A.Located Var.Raw) [Raw]
37 | RRecord [(A.Located Text, Raw)] (Maybe Raw)
41 = Lambda Canonical Canonical
43 | Type Var.Canonical [Canonical]
44 | Record [(Text, Canonical)] (Maybe Canonical)
45 | Aliased Var.Canonical [(Text, Canonical)] (Aliased Canonical)
56-- CONSTRUCT USEFUL TYPES
59tuple :: R.Region -> [Raw] -> Raw
63 Var.Raw (Help.makeTuple (length types))
65 A.A region (RType (A.A region name) types)
68cmd :: ModuleName.Canonical -> Text -> Canonical
73sub :: ModuleName.Canonical -> Text -> Canonical
78effect :: Var.Canonical -> ModuleName.Canonical -> Text -> Canonical
79effect effectName moduleName tipe =
81 (Type (Var.fromModule moduleName tipe) [Var "msg"])
82 (Type effectName [Var "msg"])
89deepDealias :: Canonical -> Canonical
93 Lambda (deepDealias a) (deepDealias b)
99 Record (map (second deepDealias) fields) (fmap deepDealias ext)
101 Aliased _name args tipe' ->
102 deepDealias (dealias args tipe')
105 Type name (map deepDealias args)
108iteratedDealias :: Canonical -> Canonical
109iteratedDealias tipe =
111 Aliased _ args realType ->
112 iteratedDealias (dealias args realType)
118dealias :: [(Text, Canonical)] -> Aliased Canonical -> Canonical
119dealias args aliasType =
122 dealiasHelp (Map.fromList args) tipe
128dealiasHelp :: Map.Map Text Canonical -> Canonical -> Canonical
129dealiasHelp typeTable tipe =
132 dealiasHelp typeTable
139 Map.findWithDefault tipe x typeTable
142 Record (map (second go) fields) (fmap go ext)
144 Aliased original args t' ->
145 Aliased original (map (second go) args) t'
148 Type name (map go args)
155collectLambdas :: Canonical -> [Canonical]
159 arg : collectLambdas result
169instance Binary Canonical where
173 putWord8 0 >> put t1 >> put t2
179 putWord8 2 >> put fs >> put ext
181 Aliased var args t ->
182 putWord8 3 >> put var >> put args >> put t
189 if potentialWord <= fromIntegral (maxBound :: Word8) then
190 do putWord8 (fromIntegral potentialWord)
194 putWord8 4 >> put name >> put ts
199 0 -> liftM2 Lambda get get
201 2 -> liftM2 Record get get
202 3 -> liftM3 Aliased get get get
203 4 -> liftM2 Type get get
204 n -> liftM2 Type get (replicateM (fromIntegral (n - 5)) get)
207instance Binary t => Binary (Aliased t) where
211 putWord8 0 >> put tipe
214 putWord8 1 >> put tipe
220 1 -> liftM Filled get
221 _ -> error "Error reading a valid type from serialized string"
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list