module Control.Flipper.Adapters.Memory
( FlipperT(..)
, evalFlipperT
, execFlipperT
, runFlipperT
) where
import Control.Monad.State
import qualified Data.Map.Strict as Map
import Control.Flipper.Types
newtype FlipperT m a = FlipperT { unFlipperT :: StateT Features m a }
deriving ( Functor
, Applicative
, Monad
, MonadIO
, MonadState Features
, MonadTrans
)
instance (Monad m) => HasFeatureFlags (FlipperT m) where
getFeatures = get
getFeature fname = do
features <- unFeatures <$> getFeatures
return (Map.lookup fname features)
instance (Monad m) => ModifiesFeatureFlags (FlipperT m) where
updateFeatures = put
updateFeature fname feature = update fname (\_ -> Just feature)
evalFlipperT :: (Monad m) => Features -> FlipperT m a -> m a
evalFlipperT features f = evalStateT (unFlipperT f) features
execFlipperT :: (Monad m) => Features -> FlipperT m a -> m Features
execFlipperT features f = execStateT (unFlipperT f) features
runFlipperT :: (Monad m) => Features -> FlipperT m a -> m (a, Features)
runFlipperT features f = runStateT (unFlipperT f) features