module Data.Accessor where
import Data.StateRef.Types
newtype Getter m a = Getter (m a)
newtype Setter m a = Setter (a -> m ())
newtype Accessor m a = Accessor (Getter m a, Setter m a)
instance Monad m => ReadRef (Getter m a) m a where
readReference (Getter x) = x
instance Monad m => WriteRef (Setter m a) m a where
writeReference (Setter f) = f
instance Monad m => ReadRef (Accessor m a) m a where
readReference (Accessor (Getter x, _)) = x
instance Monad m => WriteRef (Accessor m a) m a where
writeReference (Accessor (_, Setter f)) = f