diff options
| -rw-r--r-- | events/src/Events/Spec.hs | 24 | ||||
| -rw-r--r-- | events/src/Events/Spec/Eval.hs | 23 | ||||
| -rw-r--r-- | events/src/Events/Spec/Types.hs | 35 | 
3 files changed, 38 insertions, 44 deletions
diff --git a/events/src/Events/Spec.hs b/events/src/Events/Spec.hs index c2a84ac..f0b1456 100644 --- a/events/src/Events/Spec.hs +++ b/events/src/Events/Spec.hs  | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | {-# LANGUAGE GADTs, DataKinds, TypeOperators #-} | 1 | {-# LANGUAGE RankNTypes #-} | 
| 2 | 2 | ||
| 3 | module Events.Spec | 3 | module Events.Spec | 
| 4 | ( interpret | 4 | ( interpret | 
| 5 | , Spec, Cmnd(..), Expr(..), Elem(..) | 5 | , Spec, Expr(..), Elem(..) | 
| 6 | , module Events.Spec.Parse | 6 | , module Events.Spec.Parse | 
| 7 | , module Events.Spec.Eval | 7 | , module Events.Spec.Eval | 
| 8 | ) where | 8 | ) where | 
| @@ -12,20 +12,14 @@ import Events.Spec.Eval | |||
| 12 | 12 | ||
| 13 | import Events.Spec.Parse | 13 | import Events.Spec.Parse | 
| 14 | 14 | ||
| 15 | import Control.Monad ((<=<)) | ||
| 16 | import Control.Monad.IO.Class | ||
| 17 | import Control.Monad.State.Lazy | ||
| 18 | 15 | ||
| 19 | import Data.Monoid | 16 | import Data.Conduit | 
| 20 | import Data.Foldable | ||
| 21 | import Control.Lens | ||
| 22 | 17 | ||
| 23 | import Debug.Trace | 18 | import Data.Text (Text) | 
| 19 | import qualified Data.Text as T | ||
| 24 | 20 | ||
| 25 | interpret :: MonadIO m => Spec m -> Eval m () | 21 | import Control.Monad.Catch (MonadThrow) | 
| 26 | interpret = join . fmap interpretCmnd . evalExpr | ||
| 27 | 22 | ||
| 28 | interpretCmnd :: MonadIO m => Cmnd -> Eval m () | 23 | |
| 29 | interpretCmnd (COverride obj) = objPayload ?= obj | 24 | interpret :: MonadThrow m => Producer m Text -> Eval m () | 
| 30 | interpretCmnd (COccurs b) = objOccurs .= b | 25 | interpret source = evalExpr =<< lift (connect source parse) | 
| 31 | interpretCmnd _ = return () | ||
diff --git a/events/src/Events/Spec/Eval.hs b/events/src/Events/Spec/Eval.hs index 9cfb7c1..fdc18c8 100644 --- a/events/src/Events/Spec/Eval.hs +++ b/events/src/Events/Spec/Eval.hs  | |||
| @@ -1,10 +1,7 @@ | |||
| 1 | {-# LANGUAGE GADTs, DataKinds, TypeFamilies, TypeOperators, RankNTypes, ScopedTypeVariables #-} | 1 | {-# LANGUAGE GADTs, DataKinds, TypeFamilies, TypeOperators, RankNTypes, ScopedTypeVariables #-} | 
| 2 | {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-} | ||
| 3 | {-# LANGUAGE InstanceSigs #-} | ||
| 4 | 2 | ||
| 5 | module Events.Spec.Eval | 3 | module Events.Spec.Eval | 
| 6 | ( evalExpr | 4 | ( evalExpr | 
| 7 | , Bindable(..) | ||
| 8 | ) where | 5 | ) where | 
| 9 | 6 | ||
| 10 | import Events.Spec.Types | 7 | import Events.Spec.Types | 
| @@ -42,23 +39,3 @@ evalExpr (EVal a) = a | |||
| 42 | evalExpr (ELam a) = a | 39 | evalExpr (ELam a) = a | 
| 43 | evalExpr (EApp (ELam (EPri f)) a) = evalExpr . f $ evalExpr a | 40 | evalExpr (EApp (ELam (EPri f)) a) = evalExpr . f $ evalExpr a | 
| 44 | evalExpr (EApp f a) = evalExpr $ beta a (evalExpr f) | 41 | evalExpr (EApp f a) = evalExpr $ beta a (evalExpr f) | 
| 45 | |||
| 46 | type family Ctx m f where | ||
| 47 | Ctx m (m a -> b) = (a ': Ctx m b) | ||
| 48 | Ctx m a = '[] | ||
| 49 | |||
| 50 | type family Fin m f where | ||
| 51 | Fin m (m a -> b) = Fin m b | ||
| 52 | Fin m (m a) = a | ||
| 53 | Fin m a = a | ||
| 54 | |||
| 55 | class Bindable m b where | ||
| 56 | liftE :: (Val m a -> b) -> Expr m (a ': Ctx m b) (Fin m b) | ||
| 57 | |||
| 58 | instance ((Val m b) ~ (m b), Applicative m, Bindable m c) => Bindable m (m b -> c) where | ||
| 59 | liftE :: (Val m a -> m b -> c) -> Expr m (a ': b ': Ctx m c) (Fin m c) | ||
| 60 | liftE f = (EPri :: (Val m a -> Expr m (b ': Ctx m c) (Fin m c)) -> Expr m (a ': b ': Ctx m c) (Fin m c)) . ((liftE :: (Val m b -> c) -> Expr m (b ': Ctx m c) (Fin m c)) . ) $ f | ||
| 61 | |||
| 62 | instance {-# OVERLAPPABLE #-} (Val m b ~ m b, Ctx m (m b) ~ '[], Fin m (m b) ~ b) => Bindable m (m b) where | ||
| 63 | liftE :: (Val m a -> Val m b) -> Expr m '[a] b | ||
| 64 | liftE = EPri . (EVal .) | ||
diff --git a/events/src/Events/Spec/Types.hs b/events/src/Events/Spec/Types.hs index c7fd058..af99f55 100644 --- a/events/src/Events/Spec/Types.hs +++ b/events/src/Events/Spec/Types.hs  | |||
| @@ -1,10 +1,12 @@ | |||
| 1 | {-# LANGUAGE GADTs, DataKinds, PolyKinds, TypeOperators, KindSignatures, TypeFamilies, ExplicitNamespaces #-} | 1 | {-# LANGUAGE GADTs, DataKinds, PolyKinds, TypeOperators, KindSignatures, TypeFamilies, ExplicitNamespaces #-} | 
| 2 | {-# LANGUAGE ScopedTypeVariables, MultiParamTypeClasses, FlexibleInstances #-} | ||
| 3 | {-# LANGUAGE InstanceSigs #-} | ||
| 2 | 4 | ||
| 3 | module Events.Spec.Types | 5 | module Events.Spec.Types | 
| 4 | ( Expr(..) | 6 | ( Expr(..) | 
| 5 | , Val(..) | 7 | , Val(..) | 
| 8 | , Bindable(..) | ||
| 6 | , Spec | 9 | , Spec | 
| 7 | , Cmnd(..) | ||
| 8 | , Elem(..) | 10 | , Elem(..) | 
| 9 | , Length(..) | 11 | , Length(..) | 
| 10 | , type (++)(..) | 12 | , type (++)(..) | 
| @@ -26,12 +28,33 @@ type family Val m a where | |||
| 26 | Val m (a -> b) = Expr m '[a] b | 28 | Val m (a -> b) = Expr m '[a] b | 
| 27 | Val m a = m a | 29 | Val m a = m a | 
| 28 | 30 | ||
| 29 | type Spec m = Expr (Eval m) '[] Cmnd | 31 | type family Ctx m f where | 
| 32 | Ctx m (m a -> b) = (a ': Ctx m b) | ||
| 33 | Ctx m a = '[] | ||
| 34 | |||
| 35 | type family Fin m f where | ||
| 36 | Fin m (m a -> b) = Fin m b | ||
| 37 | Fin m (m a) = a | ||
| 38 | Fin m a = a | ||
| 39 | |||
| 40 | class Bindable m a where | ||
| 41 | liftE :: a -> Expr m (Ctx m a) (Fin m a) | ||
| 42 | |||
| 43 | instance (Val m a ~ m a, Bindable m b) => Bindable m (m a -> b) where | ||
| 44 | liftE :: (m a -> b) -> Expr m (a ': Ctx m b) (Fin m b) | ||
| 45 | liftE = (EPri :: (Val m a -> Expr m (Ctx m b) (Fin m b)) -> Expr m (a ': Ctx m b) (Fin m b)) . ((liftE :: b -> Expr m (Ctx m b) (Fin m b)) . ) | ||
| 46 | |||
| 47 | instance {-# OVERLAPPABLE #-} (Val m a ~ m a, Val m b ~ m b, Ctx m (m b) ~ '[], Fin m (m b) ~ b) => Bindable m (m a -> m b) where | ||
| 48 | liftE :: (m a -> m b) -> Expr m '[a] b | ||
| 49 | liftE = EPri . (EVal .) | ||
| 50 | |||
| 51 | instance (Val m a ~ m a, Fin m (m a) ~ a, Ctx m (m a) ~ '[]) => Bindable m (m a) where | ||
| 52 | liftE :: m a -> Expr m '[] a | ||
| 53 | liftE = EVal | ||
| 54 | |||
| 55 | |||
| 56 | type Spec m = Expr (Eval m) '[] () | ||
| 30 | 57 | ||
| 31 | data Cmnd = COverride Object | ||
| 32 | | COccurs Bool | ||
| 33 | | CNop | ||
| 34 | deriving (Show) | ||
| 35 | 58 | ||
| 36 | data Elem :: a -> [a] -> * where | 59 | data Elem :: a -> [a] -> * where | 
| 37 | EZ :: Elem x (x ': xs) | 60 | EZ :: Elem x (x ': xs) | 
