module Control.Imperative
( var
, val
, ref
, assign
, (=:)
, MonadImperative
, BaseEff
, Indexable(..)
, whenR
, unlessR
, ifR
, whileR
, untilR
, doWhileR
, Ref
, Size(..)
, dim1
, dim2
, dim3
, module Control.Monad.Trans.Loop
, module Control.Monad.Base
) where
import Control.Monad.Base
import Control.Imperative.Hash (MonadHash)
import Control.Imperative.Operators
import Control.Imperative.Internal
import Control.Imperative.Var (MonadVar, var)
import Control.Imperative.Vector.Base
import Control.Monad
import Control.Monad.Trans.Loop
type MonadImperative m = (MonadVar m, MonadVector m, MonadHash m)
whenR :: MonadBase (BaseEff m) m => Ref (BaseEff m) Bool -> m () -> m ()
whenR v m = ref v >>= flip when m
unlessR :: MonadBase (BaseEff m) m => Ref (BaseEff m) Bool -> m () -> m ()
unlessR v = whenR (notR v)
ifR :: MonadBase (BaseEff m) m => Ref (BaseEff m) Bool -> m a -> m a -> m a
ifR v t f = do
b <- ref v
if b then t else f
whileR :: MonadBase (BaseEff m) m => Ref (BaseEff m) Bool -> LoopT c () m c -> m ()
whileR v = while (ref v)
untilR :: MonadBase (BaseEff m) m => Ref (BaseEff m) Bool -> LoopT c () m c -> m ()
untilR v = while (ref (notR v))
doWhileR :: MonadBase (BaseEff m) m => LoopT a a m a -> Ref (BaseEff m) Bool -> m a
doWhileR m v = doWhile m (ref v)