{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
module Examples.Ltl.Simple where
import Control.Applicative
import Control.Monad
import Control.Monad.Except
import Control.Monad.State
import Data.Map (Map)
import qualified Data.Map as Map
import Effect.Error
import Effect.Error.Passthrough ()
import Effect.TH
import Logic.Ltl
import Logic.SingleStep
class (Monad m) => MonadKeyValue m where
storeValue :: String -> Integer -> m ()
getValue :: String -> m Integer
deleteValue :: String -> m ()
swapTrace :: (MonadKeyValue m) => m (Integer, Integer)
swapTrace :: forall (m :: * -> *). MonadKeyValue m => m (Integer, Integer)
swapTrace = do
String -> Integer -> m ()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"a" Integer
1
String -> Integer -> m ()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"b" Integer
2
Integer
a <- String -> m Integer
forall (m :: * -> *). MonadKeyValue m => String -> m Integer
getValue String
"a"
Integer
b <- String -> m Integer
forall (m :: * -> *). MonadKeyValue m => String -> m Integer
getValue String
"b"
String -> Integer -> m ()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"a" Integer
b
String -> Integer -> m ()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"b" Integer
a
Integer
a' <- String -> m Integer
forall (m :: * -> *). MonadKeyValue m => String -> m Integer
getValue String
"a"
Integer
b' <- String -> m Integer
forall (m :: * -> *). MonadKeyValue m => String -> m Integer
getValue String
"b"
(Integer, Integer) -> m (Integer, Integer)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer
a', Integer
b')
deleteTrace :: (MonadKeyValue m) => m Integer
deleteTrace :: forall (m :: * -> *). MonadKeyValue m => m Integer
deleteTrace = do
String -> Integer -> m ()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"a" Integer
1
String -> Integer -> m ()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"b" Integer
2
String -> m ()
forall (m :: * -> *). MonadKeyValue m => String -> m ()
deleteValue String
"a"
String -> Integer -> m ()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"a" Integer
2
String -> m Integer
forall (m :: * -> *). MonadKeyValue m => String -> m Integer
getValue String
"a"
newtype KeyValueError = NoSuchKey String deriving (Int -> KeyValueError -> ShowS
[KeyValueError] -> ShowS
KeyValueError -> String
(Int -> KeyValueError -> ShowS)
-> (KeyValueError -> String)
-> ([KeyValueError] -> ShowS)
-> Show KeyValueError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> KeyValueError -> ShowS
showsPrec :: Int -> KeyValueError -> ShowS
$cshow :: KeyValueError -> String
show :: KeyValueError -> String
$cshowList :: [KeyValueError] -> ShowS
showList :: [KeyValueError] -> ShowS
Show)
type KeyValueT m = ExceptT KeyValueError (StateT (Map String Integer) m)
runKeyValueT :: Map String Integer -> KeyValueT m a -> m (Either KeyValueError a, Map String Integer)
runKeyValueT :: forall (m :: * -> *) a.
Map String Integer
-> KeyValueT m a -> m (Either KeyValueError a, Map String Integer)
runKeyValueT Map String Integer
s0 = (StateT (Map String Integer) m (Either KeyValueError a)
-> Map String Integer
-> m (Either KeyValueError a, Map String Integer))
-> Map String Integer
-> StateT (Map String Integer) m (Either KeyValueError a)
-> m (Either KeyValueError a, Map String Integer)
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT (Map String Integer) m (Either KeyValueError a)
-> Map String Integer
-> m (Either KeyValueError a, Map String Integer)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT Map String Integer
s0 (StateT (Map String Integer) m (Either KeyValueError a)
-> m (Either KeyValueError a, Map String Integer))
-> (KeyValueT m a
-> StateT (Map String Integer) m (Either KeyValueError a))
-> KeyValueT m a
-> m (Either KeyValueError a, Map String Integer)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. KeyValueT m a
-> StateT (Map String Integer) m (Either KeyValueError a)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT
instance (Monad m) => MonadKeyValue (KeyValueT m) where
storeValue :: String -> Integer -> KeyValueT m ()
storeValue String
k Integer
v = (Map String Integer -> Map String Integer) -> KeyValueT m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((Map String Integer -> Map String Integer) -> KeyValueT m ())
-> (Map String Integer -> Map String Integer) -> KeyValueT m ()
forall a b. (a -> b) -> a -> b
$ String -> Integer -> Map String Integer -> Map String Integer
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert String
k Integer
v
getValue :: String -> KeyValueT m Integer
getValue String
k = do
Map String Integer
m <- ExceptT
KeyValueError (StateT (Map String Integer) m) (Map String Integer)
forall s (m :: * -> *). MonadState s m => m s
get
case String -> Map String Integer -> Maybe Integer
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup String
k Map String Integer
m of
Maybe Integer
Nothing -> KeyValueError -> KeyValueT m Integer
forall a.
KeyValueError
-> ExceptT KeyValueError (StateT (Map String Integer) m) a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (KeyValueError -> KeyValueT m Integer)
-> KeyValueError -> KeyValueT m Integer
forall a b. (a -> b) -> a -> b
$ String -> KeyValueError
NoSuchKey String
k
Just Integer
v -> Integer -> KeyValueT m Integer
forall a.
a -> ExceptT KeyValueError (StateT (Map String Integer) m) a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
deleteValue :: String -> KeyValueT m ()
deleteValue String
_ = () -> KeyValueT m ()
forall a.
a -> ExceptT KeyValueError (StateT (Map String Integer) m) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
defineEffectType ''MonadKeyValue
makeEffect ''MonadKeyValue ''MonadKeyValueEffect
data KeyValueMod = KeyValueMod
{ KeyValueMod -> Bool
noOverwrite :: Bool,
KeyValueMod -> ShowS
renameKey :: String -> String
}
instance (MonadError KeyValueError m, MonadKeyValue m) => InterpretMod KeyValueMod m MonadKeyValueEffect where
interpretMod :: forall (dummy :: [(* -> *) -> * -> *]) a.
MonadKeyValueEffect (AST dummy) a -> ModInterp KeyValueMod m a
interpretMod (StoreValue String
key Integer
val) =
(KeyValueMod -> m (Maybe a)) -> ModInterp KeyValueMod m a
forall mod (m :: * -> *) a.
(mod -> m (Maybe a)) -> ModInterp mod m a
Visible ((KeyValueMod -> m (Maybe a)) -> ModInterp KeyValueMod m a)
-> (KeyValueMod -> m (Maybe a)) -> ModInterp KeyValueMod m a
forall a b. (a -> b) -> a -> b
$ \KeyValueMod
modif -> do
Maybe Integer
oldVal <- m (Maybe Integer)
-> (KeyValueError -> m (Maybe Integer)) -> m (Maybe Integer)
forall a. m a -> (KeyValueError -> m a) -> m a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
catchError (Integer -> Maybe Integer
forall a. a -> Maybe a
Just (Integer -> Maybe Integer) -> m Integer -> m (Maybe Integer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> m Integer
forall (m :: * -> *). MonadKeyValue m => String -> m Integer
getValue String
key) (\NoSuchKey {} -> Maybe Integer -> m (Maybe Integer)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Integer
forall a. Maybe a
Nothing)
case (Maybe Integer
oldVal, KeyValueMod -> Bool
noOverwrite KeyValueMod
modif) of
(Just Integer
_, Bool
True) -> Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Maybe a
forall a. a -> Maybe a
Just ())
(Maybe Integer
Nothing, Bool
True) -> Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
(Maybe Integer
_, Bool
False) -> a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Integer -> m ()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue (KeyValueMod -> ShowS
renameKey KeyValueMod
modif String
key) Integer
val
interpretMod (DeleteValue String
key) =
(KeyValueMod -> m (Maybe a)) -> ModInterp KeyValueMod m a
forall mod (m :: * -> *) a.
(mod -> m (Maybe a)) -> ModInterp mod m a
Visible ((KeyValueMod -> m (Maybe a)) -> ModInterp KeyValueMod m a)
-> (KeyValueMod -> m (Maybe a)) -> ModInterp KeyValueMod m a
forall a b. (a -> b) -> a -> b
$ \KeyValueMod
modif ->
if KeyValueMod -> Bool
noOverwrite KeyValueMod
modif
then Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
else a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> m ()
forall (m :: * -> *). MonadKeyValue m => String -> m ()
deleteValue (KeyValueMod -> ShowS
renameKey KeyValueMod
modif String
key)
interpretMod (GetValue String
key) =
(KeyValueMod -> m (Maybe a)) -> ModInterp KeyValueMod m a
forall mod (m :: * -> *) a.
(mod -> m (Maybe a)) -> ModInterp mod m a
Visible ((KeyValueMod -> m (Maybe a)) -> ModInterp KeyValueMod m a)
-> (KeyValueMod -> m (Maybe a)) -> ModInterp KeyValueMod m a
forall a b. (a -> b) -> a -> b
$ \KeyValueMod
modif ->
if KeyValueMod -> Bool
noOverwrite KeyValueMod
modif
then Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
else a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> m Integer
forall (m :: * -> *). MonadKeyValue m => String -> m Integer
getValue (KeyValueMod -> ShowS
renameKey KeyValueMod
modif String
key)
renameKeys :: (String -> String) -> KeyValueMod
renameKeys :: ShowS -> KeyValueMod
renameKeys ShowS
f = KeyValueMod {noOverwrite :: Bool
noOverwrite = Bool
False, renameKey :: ShowS
renameKey = ShowS
f}
noStoreOverride :: KeyValueMod
noStoreOverride :: KeyValueMod
noStoreOverride = KeyValueMod {noOverwrite :: Bool
noOverwrite = Bool
True, renameKey :: ShowS
renameKey = ShowS
forall a. a -> a
id}
instance Semigroup KeyValueMod where
KeyValueMod
mod1 <> :: KeyValueMod -> KeyValueMod -> KeyValueMod
<> KeyValueMod
mod2 =
KeyValueMod
{ noOverwrite :: Bool
noOverwrite = KeyValueMod -> Bool
noOverwrite KeyValueMod
mod1 Bool -> Bool -> Bool
|| KeyValueMod -> Bool
noOverwrite KeyValueMod
mod2,
renameKey :: ShowS
renameKey = KeyValueMod -> ShowS
renameKey KeyValueMod
mod1 ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. KeyValueMod -> ShowS
renameKey KeyValueMod
mod2
}
instance {-# OVERLAPPING #-} (MonadPlus m) => Alternative (KeyValueT m) where
empty :: forall a. KeyValueT m a
empty = StateT (Map String Integer) m a
-> ExceptT KeyValueError (StateT (Map String Integer) m) a
forall (m :: * -> *) a. Monad m => m a -> ExceptT KeyValueError m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (StateT (Map String Integer) m a
-> ExceptT KeyValueError (StateT (Map String Integer) m) a)
-> StateT (Map String Integer) m a
-> ExceptT KeyValueError (StateT (Map String Integer) m) a
forall a b. (a -> b) -> a -> b
$ m a -> StateT (Map String Integer) m a
forall (m :: * -> *) a.
Monad m =>
m a -> StateT (Map String Integer) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m a
forall a. m a
forall (m :: * -> *) a. MonadPlus m => m a
mzero
ExceptT (StateT Map String Integer
-> m (Either KeyValueError a, Map String Integer)
a) <|> :: forall a. KeyValueT m a -> KeyValueT m a -> KeyValueT m a
<|> (ExceptT (StateT Map String Integer
-> m (Either KeyValueError a, Map String Integer)
b)) = StateT (Map String Integer) m (Either KeyValueError a)
-> ExceptT KeyValueError (StateT (Map String Integer) m) a
forall e (m :: * -> *) a. m (Either e a) -> ExceptT e m a
ExceptT (StateT (Map String Integer) m (Either KeyValueError a)
-> ExceptT KeyValueError (StateT (Map String Integer) m) a)
-> StateT (Map String Integer) m (Either KeyValueError a)
-> ExceptT KeyValueError (StateT (Map String Integer) m) a
forall a b. (a -> b) -> a -> b
$ (Map String Integer
-> m (Either KeyValueError a, Map String Integer))
-> StateT (Map String Integer) m (Either KeyValueError a)
forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT ((Map String Integer
-> m (Either KeyValueError a, Map String Integer))
-> StateT (Map String Integer) m (Either KeyValueError a))
-> (Map String Integer
-> m (Either KeyValueError a, Map String Integer))
-> StateT (Map String Integer) m (Either KeyValueError a)
forall a b. (a -> b) -> a -> b
$ \Map String Integer
x -> Map String Integer
-> m (Either KeyValueError a, Map String Integer)
a Map String Integer
x m (Either KeyValueError a, Map String Integer)
-> m (Either KeyValueError a, Map String Integer)
-> m (Either KeyValueError a, Map String Integer)
forall a. m a -> m a -> m a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` Map String Integer
-> m (Either KeyValueError a, Map String Integer)
b Map String Integer
x
instance {-# OVERLAPPING #-} (MonadPlus m) => MonadPlus (KeyValueT m)
interpretAndRun ::
LtlAST KeyValueMod '[MonadKeyValueEffect, MonadErrorEffect KeyValueError] a ->
[(Either KeyValueError a, Map String Integer)]
interpretAndRun :: forall a.
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> [(Either KeyValueError a, Map String Integer)]
interpretAndRun =
Map String Integer
-> KeyValueT [] a -> [(Either KeyValueError a, Map String Integer)]
forall (m :: * -> *) a.
Map String Integer
-> KeyValueT m a -> m (Either KeyValueError a, Map String Integer)
runKeyValueT Map String Integer
forall a. Monoid a => a
mempty
(KeyValueT [] a -> [(Either KeyValueError a, Map String Integer)])
-> (LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> KeyValueT [] a)
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> [(Either KeyValueError a, Map String Integer)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (tags :: [LtlInstanceKind]) mod (m :: * -> *)
(ops :: [(* -> *) -> * -> *]) a.
(Semigroup mod, MonadPlus m, InterpretEffectsLtl mod m tags ops) =>
LtlAST mod ops a -> m a
interpretLtlAST
@'[ InterpretModTag,
InterpretEffectStatefulTag
]
exampleSomewhereSwap :: [(Either KeyValueError (Integer, Integer), Map String Integer)]
exampleSomewhereSwap :: [(Either KeyValueError (Integer, Integer), Map String Integer)]
exampleSomewhereSwap = LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
-> [(Either KeyValueError (Integer, Integer), Map String Integer)]
forall a.
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> [(Either KeyValueError a, Map String Integer)]
interpretAndRun (LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
-> [(Either KeyValueError (Integer, Integer), Map String Integer)])
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
-> [(Either KeyValueError (Integer, Integer), Map String Integer)]
forall a b. (a -> b) -> a -> b
$ Ltl KeyValueMod
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
forall mod (ops :: [(* -> *) -> * -> *]) a.
Ltl mod -> LtlAST mod ops a -> LtlAST mod ops a
modifyLtl (KeyValueMod -> Ltl KeyValueMod
forall a. a -> Ltl a
somewhere KeyValueMod
noStoreOverride) LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
forall (m :: * -> *). MonadKeyValue m => m (Integer, Integer)
swapTrace
exampleSomewhereDelete :: [(Either KeyValueError Integer, Map String Integer)]
exampleSomewhereDelete :: [(Either KeyValueError Integer, Map String Integer)]
exampleSomewhereDelete =
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
-> [(Either KeyValueError Integer, Map String Integer)]
forall a.
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> [(Either KeyValueError a, Map String Integer)]
interpretAndRun (LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
-> [(Either KeyValueError Integer, Map String Integer)])
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
-> [(Either KeyValueError Integer, Map String Integer)]
forall a b. (a -> b) -> a -> b
$ Ltl KeyValueMod
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
forall mod (ops :: [(* -> *) -> * -> *]) a.
Ltl mod -> LtlAST mod ops a -> LtlAST mod ops a
modifyLtl (KeyValueMod -> Ltl KeyValueMod
forall a. a -> Ltl a
somewhere KeyValueMod
noStoreOverride) LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
forall (m :: * -> *). MonadKeyValue m => m Integer
deleteTrace
exampleEverywhereSwap :: [(Either KeyValueError (Integer, Integer), Map String Integer)]
exampleEverywhereSwap :: [(Either KeyValueError (Integer, Integer), Map String Integer)]
exampleEverywhereSwap =
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
-> [(Either KeyValueError (Integer, Integer), Map String Integer)]
forall a.
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> [(Either KeyValueError a, Map String Integer)]
interpretAndRun (LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
-> [(Either KeyValueError (Integer, Integer), Map String Integer)])
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
-> [(Either KeyValueError (Integer, Integer), Map String Integer)]
forall a b. (a -> b) -> a -> b
$ Ltl KeyValueMod
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
forall mod (ops :: [(* -> *) -> * -> *]) a.
Ltl mod -> LtlAST mod ops a -> LtlAST mod ops a
modifyLtl (KeyValueMod -> Ltl KeyValueMod
forall a. a -> Ltl a
everywhere KeyValueMod
noStoreOverride) LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
(Integer, Integer)
forall (m :: * -> *). MonadKeyValue m => m (Integer, Integer)
swapTrace
exampleEverywhereDelete :: [(Either KeyValueError Integer, Map String Integer)]
exampleEverywhereDelete :: [(Either KeyValueError Integer, Map String Integer)]
exampleEverywhereDelete =
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
-> [(Either KeyValueError Integer, Map String Integer)]
forall a.
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> [(Either KeyValueError a, Map String Integer)]
interpretAndRun (LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
-> [(Either KeyValueError Integer, Map String Integer)])
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
-> [(Either KeyValueError Integer, Map String Integer)]
forall a b. (a -> b) -> a -> b
$ Ltl KeyValueMod
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
forall mod (ops :: [(* -> *) -> * -> *]) a.
Ltl mod -> LtlAST mod ops a -> LtlAST mod ops a
modifyLtl (KeyValueMod -> Ltl KeyValueMod
forall a. a -> Ltl a
everywhere (KeyValueMod -> Ltl KeyValueMod) -> KeyValueMod -> Ltl KeyValueMod
forall a b. (a -> b) -> a -> b
$ ShowS -> KeyValueMod
renameKeys (String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"new")) LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
Integer
forall (m :: * -> *). MonadKeyValue m => m Integer
deleteTrace
exampleEverywhereEmpty :: [(Either KeyValueError (), Map String Integer)]
exampleEverywhereEmpty :: [(Either KeyValueError (), Map String Integer)]
exampleEverywhereEmpty =
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)]
forall a.
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> [(Either KeyValueError a, Map String Integer)]
interpretAndRun (LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)])
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)]
forall a b. (a -> b) -> a -> b
$ Ltl KeyValueMod
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall mod (ops :: [(* -> *) -> * -> *]) a.
Ltl mod -> LtlAST mod ops a -> LtlAST mod ops a
modifyLtl (KeyValueMod -> Ltl KeyValueMod
forall a. a -> Ltl a
everywhere KeyValueMod
noStoreOverride) (()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall a.
a
-> Fixpoint
Freer
(JoinedEffects
'[LtlEffect KeyValueMod, MonadKeyValueEffect,
MonadErrorEffect KeyValueError])
a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
exampleThere :: [(Either KeyValueError (), Map String Integer)]
exampleThere :: [(Either KeyValueError (), Map String Integer)]
exampleThere =
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)]
forall a.
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> [(Either KeyValueError a, Map String Integer)]
interpretAndRun (LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)])
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)]
forall a b. (a -> b) -> a -> b
$ Ltl KeyValueMod
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall mod (ops :: [(* -> *) -> * -> *]) a.
Ltl mod -> LtlAST mod ops a -> LtlAST mod ops a
modifyLtl (Integer -> Ltl KeyValueMod -> Ltl KeyValueMod
forall a. Integer -> Ltl a -> Ltl a
there Integer
2 (Ltl KeyValueMod -> Ltl KeyValueMod)
-> Ltl KeyValueMod -> Ltl KeyValueMod
forall a b. (a -> b) -> a -> b
$ KeyValueMod -> Ltl KeyValueMod
forall a. a -> Ltl a
somewhere (KeyValueMod -> Ltl KeyValueMod) -> KeyValueMod -> Ltl KeyValueMod
forall a b. (a -> b) -> a -> b
$ ShowS -> KeyValueMod
renameKeys (String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"new")) (LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
())
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall a b. (a -> b) -> a -> b
$ do
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"a" Integer
1
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"b" Integer
2
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"c" Integer
3
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"d" Integer
4
exampleNotThere :: [(Either KeyValueError (), Map String Integer)]
exampleNotThere :: [(Either KeyValueError (), Map String Integer)]
exampleNotThere =
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)]
forall a.
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> [(Either KeyValueError a, Map String Integer)]
interpretAndRun (LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)])
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)]
forall a b. (a -> b) -> a -> b
$ do
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"a" Integer
1
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"b" Integer
2
Ltl KeyValueMod
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall mod (ops :: [(* -> *) -> * -> *]) a.
Ltl mod -> LtlAST mod ops a -> LtlAST mod ops a
modifyLtl (KeyValueMod -> Ltl KeyValueMod
forall a. a -> Ltl a
somewhere (KeyValueMod -> Ltl KeyValueMod) -> KeyValueMod -> Ltl KeyValueMod
forall a b. (a -> b) -> a -> b
$ ShowS -> KeyValueMod
renameKeys (String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"new")) (LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
())
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall a b. (a -> b) -> a -> b
$ do
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"c" Integer
3
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"d" Integer
4
exampleCustom :: [(Either KeyValueError (), Map String Integer)]
exampleCustom :: [(Either KeyValueError (), Map String Integer)]
exampleCustom =
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)]
forall a.
LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
a
-> [(Either KeyValueError a, Map String Integer)]
interpretAndRun
(LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)])
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> [(Either KeyValueError (), Map String Integer)]
forall a b. (a -> b) -> a -> b
$ Ltl KeyValueMod
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall mod (ops :: [(* -> *) -> * -> *]) a.
Ltl mod -> LtlAST mod ops a -> LtlAST mod ops a
modifyLtl
( Ltl KeyValueMod -> Ltl KeyValueMod -> Ltl KeyValueMod
forall a. Ltl a -> Ltl a -> Ltl a
LtlAnd
(KeyValueMod -> Ltl KeyValueMod
forall a. a -> Ltl a
LtlAtom (KeyValueMod -> Ltl KeyValueMod) -> KeyValueMod -> Ltl KeyValueMod
forall a b. (a -> b) -> a -> b
$ ShowS -> KeyValueMod
renameKeys (String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"new"))
(Ltl KeyValueMod -> Ltl KeyValueMod
forall a. Ltl a -> Ltl a
LtlNext (Ltl KeyValueMod -> Ltl KeyValueMod)
-> Ltl KeyValueMod -> Ltl KeyValueMod
forall a b. (a -> b) -> a -> b
$ KeyValueMod -> Ltl KeyValueMod
forall a. a -> Ltl a
LtlAtom (KeyValueMod -> Ltl KeyValueMod) -> KeyValueMod -> Ltl KeyValueMod
forall a b. (a -> b) -> a -> b
$ ShowS -> KeyValueMod
renameKeys (String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"new"))
)
(LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
())
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall a b. (a -> b) -> a -> b
$ do
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"a" Integer
1
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"b" Integer
2
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"c" Integer
3
String
-> Integer
-> LtlAST
KeyValueMod
'[MonadKeyValueEffect, MonadErrorEffect KeyValueError]
()
forall (m :: * -> *). MonadKeyValue m => String -> Integer -> m ()
storeValue String
"d" Integer
4