----------------------------------------------------------- -- | -- Module : Control.Imperative.Var -- Copyright : (C) 2015, Yu Fukuzawa -- License : BSD3 -- Maintainer : minpou.primer@email.com -- Stability : experimental -- Portability : portable -- ----------------------------------------------------------- {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE TypeFamilies #-} module Control.Imperative.Var ( MonadVar , var ) where import Control.Imperative.Internal import Control.Imperative.Var.Class import Control.Monad.Base -- | Useful constraint synonym for variable operation. type MonadVar m = (MonadBase (BaseEff m) m, MVar (BaseEff m)) -- | Create a new mutable variable. var :: MonadVar m => a -> m (Ref (BaseEff m) a) var x = do v <- liftBase $ newVar x return Ref { get = readVar v , set = writeVar v } {-# INLINE var #-}