module Database.Perdure.Ref (
Ref(..),
ref,
refLens
) where
import System.IO.Unsafe
import Database.Perdure.Deref
import Data.Lens
import Database.Perdure.Persistent
import Control.Applicative
class Deref r => Ref r where
refIO :: a -> IO (r a)
ref :: Ref r => a -> r a
ref = unsafePerformIO . refIO
refLens :: Ref r => Lens (r a) a
refLens = lens deref $ const . ref
instance Ref r => Ref (IRef r) where refIO = (IRef <$>) . refIO
instance Ref Ref0 where refIO = return . Ref0
instance Deref r => Ref (CRef r) where refIO = return . ToRef
instance Deref r => Functor (CRef r) where fmap f = ref . f . deref