{-# LANGUAGE MultiParamTypeClasses, TypeFamilies, FlexibleContexts #-}
module Control.Effects.State where

import Control.Effects

get :: (c ~ ContT (s -> m r) m, AutoLift c n, Monad m) => Proxy c -> n s
get p = operation p $ \k -> return $ \s -> do r <- k s; r s

put :: (c ~ ContT (s -> m r) m, AutoLift c n, Monad m) => Proxy c -> s -> n ()
put p s' = operation p $ \k -> return $ \_ -> do r <- k (); r s'

ref :: Monad m => s -> Handler (s -> m a) m a a
ref s_init = Handler
  { ret = return . return . return
  , fin = \f -> f s_init
  }