{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-} 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