module UniqueLogic.ST.TF.System.Simple (
   -- * Preparation
   Variable,
   globalVariable,
   -- * Posing statements
   T,
   localVariable,
   constant,
   Sys.assignment2,
   Sys.assignment3,
   Sys.Apply, Sys.arg, Sys.runApply,
   -- * Solution
   solve,
   query,
   ) where

import qualified UniqueLogic.ST.TF.System as Sys

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 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

solve :: T s a -> ST s a
solve = runIdentityT . Sys.solve

query :: Variable s a -> ST s (Maybe a)
query = Sys.query