module Control.Monad.Trans.Order.Lazy (
Order,
perform,
OrderT,
performT,
getOrderToken,
newMinimum,
newMaximum,
newAfter,
newBefore
) where
import Control.Applicative
import Control.Monad.Trans.Order.Lazy.Type
import qualified Control.Monad.Trans.Order.Representation as OrderTRep
import Data.Functor.Identity
import Data.Order.Pair.Type
import Data.Order.Element
type Order o = OrderT o Identity
perform :: (a -> Order o b) -> OrderPair o a -> OrderPair o b
perform fun pair = runIdentity (performT fun pair)
performT :: Functor f
=> (a -> OrderT o f b)
-> OrderPair o a
-> f (OrderPair o b)
performT fun (OrderPair ~(val, orderRep)) = output where
output = OrderTRep.performT (runOrderT . fun) val orderRep
getOrderToken :: Applicative f => OrderT o f ()
getOrderToken = OrderT $ OrderTRep.getOrderToken
newMinimum :: Applicative f => OrderT o f (Element o)
newMinimum = OrderT $ OrderTRep.newMinimum
newMaximum :: Applicative f => OrderT o f (Element o)
newMaximum = OrderT $ OrderTRep.newMaximum
newAfter :: Applicative f => Element o -> OrderT o f (Element o)
newAfter elem = OrderT $ OrderTRep.newAfter elem
newBefore :: Applicative f => Element o -> OrderT o f (Element o)
newBefore elem = OrderT $ OrderTRep.newBefore elem