summaryrefslogtreecommitdiff
path: root/events/src/Events/Types.hs
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2016-04-17 01:12:23 +0200
committerGregor Kleen <gkleen@yggdrasil.li>2016-04-17 01:12:23 +0200
commita4645fa4bfe346dca048c946b8a2122ddcb6bf57 (patch)
tree8f4708a61c895201783a1eb6682042b189bb1d0d /events/src/Events/Types.hs
parent5ddabb4a837e9aa7568043433ebf2d64f2838a38 (diff)
downloadevents-a4645fa4bfe346dca048c946b8a2122ddcb6bf57.tar
events-a4645fa4bfe346dca048c946b8a2122ddcb6bf57.tar.gz
events-a4645fa4bfe346dca048c946b8a2122ddcb6bf57.tar.bz2
events-a4645fa4bfe346dca048c946b8a2122ddcb6bf57.tar.xz
events-a4645fa4bfe346dca048c946b8a2122ddcb6bf57.zip
Seperated non-value rec. into own layer of state
Fixes lack of fixpoint
Diffstat (limited to 'events/src/Events/Types.hs')
-rw-r--r--events/src/Events/Types.hs34
1 files changed, 21 insertions, 13 deletions
diff --git a/events/src/Events/Types.hs b/events/src/Events/Types.hs
index 19fccdf..3414b68 100644
--- a/events/src/Events/Types.hs
+++ b/events/src/Events/Types.hs
@@ -6,7 +6,8 @@
6module Events.Types 6module Events.Types
7 ( TimeRange(..), rangeStart, rangeDuration 7 ( TimeRange(..), rangeStart, rangeDuration
8 , Event(..), payload, occursWithin 8 , Event(..), payload, occursWithin
9 , EvalCtx(..), ctxVars, ctxEvents, ctxEvent, ctxOccurs 9 , EvalCtx(..), ctxVars, ctxEvents
10 , ObjCtx(..), objOccurs, objPayload
10 , Eval, evaluate 11 , Eval, evaluate
11 , module Data.Aeson 12 , module Data.Aeson
12 , module Data.Time.Clock 13 , module Data.Time.Clock
@@ -29,7 +30,6 @@ import Data.Monoid
29import Control.Monad.Fix 30import Control.Monad.Fix
30import Control.Lens 31import Control.Lens
31import Data.Maybe 32import Data.Maybe
32import Data.Bool
33 33
34import Debug.Trace 34import Debug.Trace
35 35
@@ -48,8 +48,6 @@ makeLenses ''Event
48data EvalCtx = EvalCtx 48data EvalCtx = EvalCtx
49 { _ctxVars :: Object 49 { _ctxVars :: Object
50 , _ctxEvents :: [Object] 50 , _ctxEvents :: [Object]
51 , _ctxEvent :: Maybe Object
52 , _ctxOccurs :: Bool
53 } deriving (Show) 51 } deriving (Show)
54makeLenses ''EvalCtx 52makeLenses ''EvalCtx
55 53
@@ -57,20 +55,30 @@ instance Default EvalCtx where
57 def = EvalCtx 55 def = EvalCtx
58 { _ctxVars = mempty 56 { _ctxVars = mempty
59 , _ctxEvents = mempty 57 , _ctxEvents = mempty
60 , _ctxEvent = Nothing
61 , _ctxOccurs = False
62 } 58 }
63 59
64type Eval m a = ListT (StateT EvalCtx m) a 60data ObjCtx = ObjCtx
61 { _objOccurs :: Bool
62 , _objPayload :: Maybe Object
63 }
64makeLenses ''ObjCtx
65
66instance Default ObjCtx where
67 def = ObjCtx
68 { _objOccurs = False
69 , _objPayload = Nothing
70 }
71
72objCtx :: ObjCtx -> Maybe Object
73objCtx (ObjCtx False _) = Nothing
74objCtx (ObjCtx True o) = o
75
76type Eval m a = StateT ObjCtx (ListT (StateT EvalCtx m)) a
65 77
66evaluate :: MonadFix m => Eval m () -> m [Object] 78evaluate :: MonadFix m => Eval m () -> m [Object]
67evaluate x = (^. ctxEvents) <$> mfix x' 79evaluate x = catMaybes <$> mfix x'
68 where 80 where
69 x' = execStateT (ListT.toList x) . resetState -- flip (set ctxEvents) def . catMaybes 81 x' = evalStateT (ListT.toList (objCtx <$> execStateT x def)) . flip (set ctxEvents) def . catMaybes
70 resetState = execState $ do
71 ctxEvents <~ bool const (\x y -> x ++ maybe [] pure y) <$> use ctxOccurs <*> use ctxEvents <*> use ctxEvent
72 ctxEvent .= def ^. ctxEvent
73 ctxOccurs .= def ^. ctxOccurs
74 82
75instance MonadState s m => MonadState s (ListT m) where 83instance MonadState s m => MonadState s (ListT m) where
76 get = lift get 84 get = lift get