{-# LANGUAGE CPP #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Glazier.React.ReadIORef.Internal where
import Control.Applicative
import Data.IORef
#if MIN_VERSION_base(4,9,0) && !MIN_VERSION_base(4,10,0)
import Data.Semigroup
#endif
newtype ReadIORef a = ReadIORef (IO a)
deriving (Functor, Applicative, Monad)
instance Show (ReadIORef a) where
showsPrec _ (ReadIORef _) = showString "ReadIORef"
instance Semigroup a => Semigroup (ReadIORef a) where
ReadIORef f <> ReadIORef g = ReadIORef $ liftA2 (<>) f g
instance Monoid a => Monoid (ReadIORef a) where
mempty = ReadIORef $ pure mempty
#if !MIN_VERSION_base(4,11,0)
(ReadIORef f) `mappend` (ReadIORef g) = ReadIORef (liftA2 mappend f g)
#endif
unReadIORef :: ReadIORef a -> IO a
unReadIORef (ReadIORef m) = m
doReadIORef :: IORef a -> ReadIORef a
doReadIORef ref = ReadIORef $ readIORef $ ref