{-
 -      ``Data/Accessor''
 -      (c) 2008 Cook, J. MR  SSD, Inc.
 -}
{-# LANGUAGE
        MultiParamTypeClasses,
        FlexibleInstances
  #-}

module Data.Accessor where

import Data.StateRef.Classes

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
        readRef (Getter x) = x

instance Monad m => WriteRef (Setter m a) m a where
        writeRef (Setter f) = f

instance Monad m => ReadRef (Accessor m a) m a where
        readRef (Accessor (Getter x, _)) = x
instance Monad m => WriteRef (Accessor m a) m a where
        writeRef (Accessor (_, Setter f)) = f