1{-# OPTIONS_GHC -Wall #-}
2module Canonicalize.Body (flatten) where
4import qualified Data.Maybe as Maybe
6import qualified AST.Declaration as Decl
7import qualified AST.Effects as Effects
8import qualified AST.Expression.General as E
9import qualified AST.Expression.Canonical as Canonical
10import qualified AST.Module.Name as ModuleName
11import qualified AST.Pattern as P
12import qualified AST.Type as Type
13import qualified AST.Variable as Var
14import qualified Canonicalize.Sort as Sort
15import qualified Reporting.Annotation as A
16import qualified Reporting.Region as R
20flatten :: ModuleName.Canonical -> Decl.Canonical -> Effects.Canonical -> Canonical.Expr
21flatten moduleName (Decl.Decls defs unions aliases _) effects =
25 [ concatMap (unionToDefs moduleName) unions
26 , Maybe.mapMaybe (aliasToDefs moduleName) aliases
27 , effectsToDefs moduleName effects
32 A.A (error "this annotation should never be needed")
34 Sort.definitions $ loc $
35 E.Let allDefs (loc $ E.SaveEnv moduleName effects)
42unionToDefs :: ModuleName.Canonical -> A.Commented (Decl.Union Type.Canonical) -> [Canonical.Def]
43unionToDefs moduleName (A.A (region,_) (Decl.Type name tvars constructors)) =
45 tagToDef (tag, tipes) =
48 take (length tipes) infiniteArgs
52 (Type.Type (Var.fromModule moduleName name))
57 E.Data tag (map (A.A region . E.localVar) vars)
59 definition tag (buildFunction vars body) region (foldr Type.Lambda tbody tipes)
61 map tagToDef constructors
64aliasToDefs :: ModuleName.Canonical -> A.Commented (Decl.Alias Type.Canonical) -> Maybe Canonical.Def
65aliasToDefs moduleName (A.A (region,_) (Decl.Type name tvars tipe)) =
67 Type.Record fields Nothing ->
71 (Var.fromModule moduleName name)
72 (zip tvars (map Type.Var tvars))
79 take (length args) infiniteArgs
83 E.Record (zip (map fst fields) (map (A.A region . E.localVar) vars))
85 Just $ definition name (buildFunction vars record) region (foldr Type.Lambda resultType args)
91infiniteArgs :: [String]
93 map (:[]) ['a'..'z'] ++ map (\n -> "_" ++ show (n :: Int)) [1..]
96buildFunction :: [String] -> Canonical.Expr -> Canonical.Expr
97buildFunction vars body@(A.A ann _) =
99 (\pattern expr -> A.A ann (E.Lambda pattern expr))
101 (map (A.A ann . P.Var) vars)
104definition :: String -> Canonical.Expr -> R.Region -> Type.Canonical -> Canonical.Def
105definition name expr@(A.A ann _) region tipe =
108 (A.A ann (P.Var name))
110 (Just (A.A region tipe))
117effectsToDefs :: ModuleName.Canonical -> Effects.Canonical -> [Canonical.Def]
118effectsToDefs moduleName effects =
123 Effects.Port ports ->
126 Effects.Manager _ info ->
128 cmdToDef (A.A region name) =
131 (A.A region (E.Cmd moduleName))
133 (Type.cmd moduleName name)
135 subToDef (A.A region name) =
138 (A.A region (E.Sub moduleName))
140 (Type.sub moduleName name)
142 case Effects._managerType info of
143 Effects.CmdManager cmd ->
147 Effects.SubManager sub ->
151 Effects.FxManager cmd sub ->
157portToDef :: A.Commented Effects.PortCanonical -> Canonical.Def
158portToDef (A.A (region, _) (Effects.PortCanonical name kind tipe)) =
159 definition name (A.A region (toPortExpr name kind)) region tipe
162toPortExpr :: String -> Effects.Kind -> Canonical.Expr'
163toPortExpr name kind =
165 Effects.Outgoing tipe ->
166 E.OutgoingPort name tipe
168 Effects.Incoming tipe ->
169 E.IncomingPort name tipe
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