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