module UniqueLogic.ST.System.Simple (
Variable,
globalVariable,
T,
localVariable,
constant,
Sys.assignment2,
Sys.assignment3,
Sys.Apply, Sys.arg, Sys.runApply,
solve,
query,
) where
import qualified UniqueLogic.ST.System as Sys
import qualified UniqueLogic.ST.Duplicate as Duplicate
import Control.Monad.Trans.Identity (IdentityT, runIdentityT, )
import Control.Monad.ST (ST, )
type T = Sys.T IdentityT
type Variable s a = Sys.Variable IdentityT s (Duplicate.Ignore a)
globalVariable :: ST s (Variable s a)
globalVariable =
Sys.globalVariable Sys.simpleUpdate
localVariable :: T s (Variable s a)
localVariable = Sys.localVariable
constant :: a -> T s (Variable s a)
constant = Sys.constant . Duplicate.Ignore
solve :: T s a -> ST s a
solve = runIdentityT . Sys.solve
query :: Variable s a -> ST s (Maybe a)
query = fmap (fmap (\(Duplicate.Ignore a) -> a)) . Sys.query