From 8581ade929fafc68d1c3e5adde420071f3e0d949 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Sat, 16 Apr 2016 17:19:59 +0200 Subject: Introduced some types --- events/src/Events/Types.hs | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 events/src/Events/Types.hs (limited to 'events/src/Events/Types.hs') diff --git a/events/src/Events/Types.hs b/events/src/Events/Types.hs new file mode 100644 index 0000000..55e7a5a --- /dev/null +++ b/events/src/Events/Types.hs @@ -0,0 +1,59 @@ +{-# LANGUAGE TemplateHaskell #-} + +module Events.Types + ( TimeRange(..), rangeStart, rangeDuration + , Event(..), payload, occursWithin + , SpecCtx(..), ctxVars + , Spec + , module Data.Aeson + , module Data.Time.Clock + , module Data.Default.Class + ) where + +import Control.Lens.TH + +import Data.Aeson (Object) + +import Data.Time.Clock + +import Control.Monad.Reader +import ListT (ListT) +import qualified ListT as ListT + +import Data.Default.Class + +import Data.Monoid +import Control.Monad.Fix +import Control.Lens +import Data.Maybe + +data TimeRange = TimeRange + { _rangeStart :: UTCTime + , _rangeDuration :: NominalDiffTime + } +makeLenses ''TimeRange + +data Event = Event + { _payload :: Object + , _occursWithin :: TimeRange -> Bool + } +makeLenses ''Event + +data SpecCtx = SpecCtx + { _ctxVars :: Object + , _ctxEvents :: [Event] + } +makeLenses ''SpecCtx + +instance Default SpecCtx where + def = SpecCtx + { _ctxVars = mempty + , _ctxEvents = mempty + } + +type Spec m a = ListT (ReaderT SpecCtx m) a + +interpret :: MonadFix m => Spec m (Maybe Event) -> m [Event] +interpret x = catMaybes <$> mfix x' + where + x' = runReaderT (ListT.toList x) . flip (set ctxEvents) def . catMaybes -- cgit v1.2.3