@@ -1,112 +1,135 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3−module Type.Constrain.Effects (constrain) where
3+module Type.Constrain.Effects
9+import Control.Monad (replicateM)
5import qualified Data.Map.Strict as Map
10import qualified Data.Map.Strict as Map
7−import qualified AST.Effects as Effects
12+import qualified AST.Expression.Canonical as Can
8import qualified AST.Module.Name as ModuleName
13import qualified AST.Module.Name as ModuleName
9−import qualified AST.Variable as Var
14+import qualified AST.Type as T
10−import qualified Reporting.Annotation as A
15+import qualified Elm.Name as N
11import qualified Reporting.Error.Type as Error
16import qualified Reporting.Error.Type as Error
17+import qualified Reporting.Region as R
12import Type.Constraint (Constraint(..), Scheme(Scheme))
18import Type.Constraint (Constraint(..), Scheme(Scheme))
13−import Type.Type (Variable, Type(AppN,VarN), (==>), mkFlexVar)
19+import Type.Type (Type(..), Variable, (==>), fromFlexSrcType, mkFlexVar)
17−-- CONSTRAIN EFFECTS
23+-- CONSTRAIN
20−constrain :: ModuleName.Canonical -> Effects.Canonical -> IO Constraint
26+constrain :: ModuleName.Canonical -> Can.Effects -> IO ( Map.Map N.Name Type, Constraint )
21−constrain moduleName effects =
27+constrain home effects =
22 case effects of
28 case effects of
23− Effects.None ->
29+ Can.NoEffects ->
24− return CSaveEnv
30+ return (Map.empty, CSaveEnv)
26− Effects.Port _ ->
32+ Can.Ports ports ->
34+ <$> traverse fromSrcType (Map.map deport ports)
27− return CSaveEnv
35+ <*> return CSaveEnv
29− Effects.Manager _ info ->
37+ Can.Manager r0 r1 r2 manager ->
30− constrainHelp moduleName info
38+ case manager of
40+ do cmd <- command home cmdName
41+ con <- constrainEffects r0 r1 r2 $ \msg result ->
42+ effectList home cmdName msg ==> result
43+ return (Map.singleton "command" cmd, con)
46+ do sub <- subscription home subName
47+ con <- constrainEffects r0 r1 r2 $ \msg result ->
48+ effectList home subName msg ==> result
49+ return (Map.singleton "subscription" sub, con)
51+ Can.Fx cmdName subName ->
52+ do cmd <- command home cmdName
53+ sub <- subscription home subName
54+ con <- constrainEffects r0 r1 r2 $ \msg result ->
55+ effectList home cmdName msg ==> effectList home subName msg ==> result
56+ return (Map.fromList [("command", cmd),("subscription", sub)], con)
63+deport :: Can.Port -> T.Canonical
73+fromSrcType :: T.Canonical -> IO Type
75+ fst <$> fromFlexSrcType tipe
78+command :: ModuleName.Canonical -> N.Name -> IO Type
79+command home typeName =
82+ (T.Type home typeName [T.Var "msg"])
83+ (T.Type ModuleName.cmd N.cmd [T.Var "msg"])
38−constrainHelp :: ModuleName.Canonical -> Effects.Info -> IO Constraint
85+
39−constrainHelp moduleName (Effects.Info tagRegion r0 r1 r2 managerType) =
86+subscription :: ModuleName.Canonical -> N.Name -> IO Type
87+subscription home typeName =
90+ (T.Type home typeName [T.Var "msg"])
91+ (T.Type ModuleName.sub N.sub [T.Var "msg"])
95+-- CONSTRAINTS FOR EFFECT MANAGER STUFF
98+constrainEffects :: R.Region -> R.Region -> R.Region -> (Variable -> Type -> Type) -> IO Constraint
99+constrainEffects r0 r1 r2 toFinalArgs =
42− AppN Var.task [ never, VarN t ]
102+ AppN ModuleName.platform N.task [ never, VarN t ]
44 router msg selfMsg =
104 router msg selfMsg =
45− AppN Var.router [ VarN msg, VarN selfMsg ]
105+ AppN ModuleName.platform N.router [ VarN msg, VarN selfMsg ]
58− selfMsg1 <- mkFlexVar
59− selfMsg2 <- mkFlexVar
63− [v0, v1, v2, state0, state1, state2, msg1, msg2, selfMsg1, selfMsg2]
107+ do vars@[v0,v1,v2,s0,s1,s2,msg1,msg2,selfMsg1,selfMsg2] <- replicateM 10 mkFlexVar
65− onEffectsType =
109+ let
66− router msg1 selfMsg1
110+ onEffectsType = router msg1 selfMsg1 ==> toFinalArgs msg1 (VarN s1 ==> task s1)
67− ==> addEffectArgs moduleName managerType msg1
68− (VarN state1 ==> task state1)
71− router msg2 selfMsg2 ==> VarN selfMsg2 ==> VarN state2 ==> task state2
111+ onSelfMsgType = router msg2 selfMsg2 ==> VarN selfMsg2 ==> VarN s2 ==> task s2
73− constrains =
112+ constrains =
74− [ CInstance tagRegion "init" (VarN v0)
113+ [ CInstance r0 "init" (VarN v0)
75− , CInstance tagRegion "onEffects" (VarN v1)
114+ , CInstance r1 "onEffects" (VarN v1)
76− , CInstance tagRegion "onSelfMsg" (VarN v2)
115+ , CInstance r2 "onSelfMsg" (VarN v2)
77− , CEqual (Error.Manager "init") r0 (VarN v0) (task state0)
116+ , CEqual (Error.Manager "init") r0 (VarN v0) (task s0)
78− , CEqual (Error.Manager "onEffects") r1 (VarN v1) onEffectsType
117+ , CEqual (Error.Manager "onEffects") r1 (VarN v1) onEffectsType
79− , CEqual (Error.Manager "onSelfMsg") r2 (VarN v2) onSelfMsgType
118+ , CEqual (Error.Manager "onSelfMsg") r2 (VarN v2) onSelfMsgType
80− , CEqual (Error.State "onEffects") r1 (VarN state0) (VarN state1)
119+ , CEqual (Error.State "onEffects") r1 (VarN s0) (VarN s1)
81− , CEqual (Error.State "onSelfMsg") r2 (VarN state0) (VarN state2)
120+ , CEqual (Error.State "onSelfMsg") r2 (VarN s0) (VarN s2)
82− , CEqual Error.SelfMsg r2 (VarN selfMsg1) (VarN selfMsg2)
121+ , CEqual Error.SelfMsg r2 (VarN selfMsg1) (VarN selfMsg2)
86− CLet [Scheme [] vars (CAnd constrains) Map.empty] CSaveEnv
124+ return $ CLet [ Scheme [] vars (CAnd constrains) Map.empty ] CSaveEnv
89−addEffectArgs
127+{-# NOINLINE never #-}
90− :: ModuleName.Canonical
130+ AppN ModuleName.basics "Never" []
91− -> Effects.RawManagerType
95−addEffectArgs moduleName managerType msg result =
98− Var.fromModule moduleName name
101− AppN Var.list [AppN (toVar fxName) [VarN msg]]
104− Effects.CmdManager cmd ->
105− effectList cmd ==> result
107− Effects.SubManager sub ->
108− effectList sub ==> result
110− Effects.FxManager cmd sub ->
111− effectList cmd ==> effectList sub ==> result
133+effectList :: ModuleName.Canonical -> N.Name -> Variable -> Type
134+effectList home name msg =
135+ AppN ModuleName.list N.list [AppN home name [VarN msg]]