{-# 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 m a -> m a
readReference (Getter m a
x) = m a
x

instance Monad m => WriteRef (Setter m a) m a where
    writeReference :: Setter m a -> a -> m ()
writeReference (Setter a -> m ()
f) = a -> m ()
f

instance Monad m => ReadRef (Accessor m a) m a where
    readReference :: Accessor m a -> m a
readReference (Accessor (Getter m a
x, Setter m a
_)) = m a
x
instance Monad m => WriteRef (Accessor m a) m a where
    writeReference :: Accessor m a -> a -> m ()
writeReference (Accessor (Getter m a
_, Setter a -> m ()
f)) = a -> m ()
f