1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
5 , Canonical(..), Aliased(..)
7 , deepDealias, iteratedDealias, dealias
13import Control.Arrow (second)
14import Control.Monad (liftM, liftM2, liftM3, replicateM)
16import qualified Data.Map as Map
17import Data.Text (Text)
19import qualified AST.Helpers as Help
20import qualified AST.Module.Name as ModuleName
21import qualified AST.Variable as Var
22import qualified Reporting.Annotation as A
23import qualified Reporting.Region as R
37 | RType (A.Located Var.Raw) [Raw]
38 | RRecord [(A.Located Text, Raw)] (Maybe Raw)
42 = Lambda Canonical Canonical
44 | Type Var.Canonical [Canonical]
45 | Record [(Text, Canonical)] (Maybe Canonical)
46 | Aliased Var.Canonical [(Text, Canonical)] (Aliased Canonical)
65-- CONSTRUCT USEFUL TYPES
68tuple :: R.Region -> [Raw] -> Raw
72 Var.Raw (Help.makeTuple (length types))
74 A.A region (RType (A.A region name) types)
77cmd :: ModuleName.Canonical -> Text -> Canonical
82sub :: ModuleName.Canonical -> Text -> Canonical
87effect :: Var.Canonical -> ModuleName.Canonical -> Text -> Canonical
88effect effectName moduleName tipe =
90 (Type (Var.fromModule moduleName tipe) [Var "msg"])
91 (Type effectName [Var "msg"])
98deepDealias :: Canonical -> Canonical
102 Lambda (deepDealias a) (deepDealias b)
108 Record (map (second deepDealias) fields) (fmap deepDealias ext)
110 Aliased _name args tipe' ->
111 deepDealias (dealias args tipe')
114 Type name (map deepDealias args)
117iteratedDealias :: Canonical -> Canonical
118iteratedDealias tipe =
120 Aliased _ args realType ->
121 iteratedDealias (dealias args realType)
127dealias :: [(Text, Canonical)] -> Aliased Canonical -> Canonical
128dealias args aliasType =
131 dealiasHelp (Map.fromList args) tipe
137dealiasHelp :: Map.Map Text Canonical -> Canonical -> Canonical
138dealiasHelp typeTable tipe =
141 dealiasHelp typeTable
148 Map.findWithDefault tipe x typeTable
151 Record (map (second go) fields) (fmap go ext)
153 Aliased original args t' ->
154 Aliased original (map (second go) args) t'
157 Type name (map go args)
164collectLambdas :: Canonical -> [Canonical]
168 arg : collectLambdas result
178instance Binary Canonical where
182 putWord8 0 >> put t1 >> put t2
188 putWord8 2 >> put fs >> put ext
190 Aliased var args t ->
191 putWord8 3 >> put var >> put args >> put t
198 if potentialWord <= fromIntegral (maxBound :: Word8) then
199 do putWord8 (fromIntegral potentialWord)
203 putWord8 4 >> put name >> put ts
208 0 -> liftM2 Lambda get get
210 2 -> liftM2 Record get get
211 3 -> liftM3 Aliased get get get
212 4 -> liftM2 Type get get
213 n -> liftM2 Type get (replicateM (fromIntegral (n - 5)) get)
216instance Binary t => Binary (Aliased t) where
220 putWord8 0 >> put tipe
223 putWord8 1 >> put tipe
229 1 -> liftM Filled get
230 _ -> 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