module Data.Faceted.FIORef (
FIORef,
newFIORef,
readFIORef,
writeFIORef,
) where
import Data.Faceted.Internal
import Data.IORef
data FIORef a = FIORef (IORef (Faceted a))
newFIORef :: Faceted a -> FIO (FIORef a)
newFIORef init = FIO newFIORefForPC
where newFIORefForPC pc = do var <- newIORef (pcF pc init undefined)
return (FIORef var)
readFIORef :: FIORef a -> FIO (Faceted a)
readFIORef (FIORef var) = FIO readFIORefForPC
where readFIORefForPC pc = do faceted <- readIORef var
return faceted
writeFIORef :: FIORef a -> Faceted a -> FIO ()
writeFIORef (FIORef var) newValue = FIO writeFIORefForPC
where writeFIORefForPC pc = do oldValue <- readIORef var
writeIORef var (pcF pc newValue oldValue)