module Gamgine.Lens.IORef where
#include "Gamgine/Utils.cpp"
IMPORT_LENS_AS_LE
import Control.Applicative ((<$>))
import Control.Monad (void)
import qualified Control.Monad.State as ST
import qualified Data.IORef as R
type StateIORef a = ST.StateT (R.IORef a) IO
mapIORef :: R.IORef a -> (a -> b) -> IO b
mapIORef ref f = f <$> R.readIORef ref
get :: StateIORef a a
get = do
ref <- ST.get
ST.liftIO $ R.readIORef ref
gets :: (a -> b) -> StateIORef a b
gets f = do
ref <- ST.get
ST.liftIO $ mapIORef ref f
getsL :: LE.Lens a b -> StateIORef a b
getsL lens = do
ref <- ST.get
ST.liftIO $ getL ref lens
put :: a -> StateIORef a ()
put value = do
ref <- ST.get
ST.liftIO $ R.writeIORef ref value
putL :: LE.Lens a b -> b -> StateIORef a ()
putL lens value = do
ref <- ST.get
void $ ST.liftIO $ setL ref lens value
modify :: (a -> a) -> StateIORef a ()
modify f = do
ref <- ST.get
ST.liftIO $ R.modifyIORef ref f
modifyL :: LE.Lens a b -> (b -> b) -> StateIORef a ()
modifyL lens f = do
ref <- ST.get
ST.liftIO $ modL ref lens f
getL :: R.IORef a -> LE.Lens a b -> IO b
getL ref lens = mapIORef ref $ LE.getL lens
setL :: R.IORef a -> LE.Lens a b -> b -> IO ()
setL ref lens value = R.modifyIORef ref $ (LE.setL lens value)
modL :: R.IORef a -> LE.Lens a b -> (b -> b) -> IO ()
modL ref lens f = R.modifyIORef ref $ LE.modL lens f