-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Read-Copy-Update for Haskell
--   
--   Read-Copy-Update for Haskell.
@package rcu
@version 0.2.3


module Control.Concurrent.RCU.Class
class Monad m => MonadNew s m | m -> s

-- | Build a new shared reference
newSRef :: MonadNew s m => a -> m (s a)

-- | Build a new shared reference
newSRef :: (MonadNew s m, m ~ t n, MonadTrans t, MonadNew s n) => a -> m (s a)

-- | This is a read-side critical section
class MonadNew s m => MonadReading s m | m -> s

-- | Read a shared reference.
readSRef :: MonadReading s m => s a -> m a

-- | Read a shared reference.
readSRef :: (MonadReading s m, m ~ t n, MonadTrans t, MonadReading s n) => s a -> m a

-- | This is a write-side critical section
class MonadReading s m => MonadWriting s m | m -> s

-- | Write to a shared reference.
writeSRef :: MonadWriting s m => s a -> a -> m ()

-- | Write to a shared reference.
writeSRef :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => s a -> a -> m ()

-- | Synchronize with other writers.
--   
--   No other writer can straddle this time bound. It will either see
--   writes from before, or writes after, but never some of both!
synchronize :: MonadWriting s m => m ()

-- | Synchronize with other writers.
--   
--   No other writer can straddle this time bound. It will either see
--   writes from before, or writes after, but never some of both!
synchronize :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => m ()

-- | This is the executor service that can fork, join and execute critical
--   sections.
class (MonadReading s (Reading m), MonadWriting s (Writing m), MonadNew s m) => MonadRCU s m | m -> s where {
    
    -- | A read-side critical section
    type family Reading m :: * -> *;
    
    -- | A write-side critical section
    type family Writing m :: * -> *;
    
    -- | Threads we can fork and join
    type family Thread m :: * -> *;
}

-- | Fork a thread
forking :: MonadRCU s m => m a -> m (Thread m a)

-- | Join a thread
joining :: MonadRCU s m => Thread m a -> m a

-- | Run a read-side critical section
reading :: MonadRCU s m => Reading m a -> m a

-- | Run a write-side critical section
writing :: MonadRCU s m => Writing m a -> m a

-- | Copy a shared reference.
copySRef :: MonadReading s m => s a -> m (s a)
instance Control.Concurrent.RCU.Class.MonadRCU s m => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Reader.ReaderT e m)
instance Control.Concurrent.RCU.Class.MonadRCU s m => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Identity.IdentityT m)
instance Control.Concurrent.RCU.Class.MonadRCU s m => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Except.ExceptT e m)
instance Control.Concurrent.RCU.Class.MonadRCU s m => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Maybe.MaybeT m)
instance (Control.Concurrent.RCU.Class.MonadRCU s m, GHC.Base.Monoid e) => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Writer.Strict.WriterT e m)
instance (Control.Concurrent.RCU.Class.MonadRCU s m, GHC.Base.Monoid e) => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Writer.Lazy.WriterT e m)
instance Control.Concurrent.RCU.Class.MonadWriting s m => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Reader.ReaderT e m)
instance (Control.Concurrent.RCU.Class.MonadWriting s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Writer.Strict.WriterT w m)
instance (Control.Concurrent.RCU.Class.MonadWriting s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Writer.Lazy.WriterT w m)
instance Control.Concurrent.RCU.Class.MonadWriting s' m => Control.Concurrent.RCU.Class.MonadWriting s' (Control.Monad.Trans.State.Strict.StateT s m)
instance Control.Concurrent.RCU.Class.MonadWriting s' m => Control.Concurrent.RCU.Class.MonadWriting s' (Control.Monad.Trans.State.Lazy.StateT s m)
instance (Control.Concurrent.RCU.Class.MonadWriting s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadWriting s' (Control.Monad.Trans.RWS.Strict.RWST r w s m)
instance (Control.Concurrent.RCU.Class.MonadWriting s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadWriting s' (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
instance Control.Concurrent.RCU.Class.MonadWriting s m => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Identity.IdentityT m)
instance Control.Concurrent.RCU.Class.MonadWriting s m => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Except.ExceptT e m)
instance Control.Concurrent.RCU.Class.MonadWriting s m => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Maybe.MaybeT m)
instance Control.Concurrent.RCU.Class.MonadReading s m => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Reader.ReaderT e m)
instance (Control.Concurrent.RCU.Class.MonadReading s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Writer.Strict.WriterT w m)
instance (Control.Concurrent.RCU.Class.MonadReading s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Writer.Lazy.WriterT w m)
instance Control.Concurrent.RCU.Class.MonadReading s' m => Control.Concurrent.RCU.Class.MonadReading s' (Control.Monad.Trans.State.Strict.StateT s m)
instance Control.Concurrent.RCU.Class.MonadReading s' m => Control.Concurrent.RCU.Class.MonadReading s' (Control.Monad.Trans.State.Lazy.StateT s m)
instance (Control.Concurrent.RCU.Class.MonadReading s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadReading s' (Control.Monad.Trans.RWS.Strict.RWST r w s m)
instance (Control.Concurrent.RCU.Class.MonadReading s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadReading s' (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
instance Control.Concurrent.RCU.Class.MonadReading s m => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Except.ExceptT e m)
instance Control.Concurrent.RCU.Class.MonadReading s m => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Maybe.MaybeT m)
instance Control.Concurrent.RCU.Class.MonadReading s m => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Identity.IdentityT m)
instance Control.Concurrent.RCU.Class.MonadNew s m => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Reader.ReaderT e m)
instance (Control.Concurrent.RCU.Class.MonadNew s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Writer.Strict.WriterT w m)
instance (Control.Concurrent.RCU.Class.MonadNew s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Writer.Lazy.WriterT w m)
instance Control.Concurrent.RCU.Class.MonadNew s' m => Control.Concurrent.RCU.Class.MonadNew s' (Control.Monad.Trans.State.Strict.StateT s m)
instance Control.Concurrent.RCU.Class.MonadNew s' m => Control.Concurrent.RCU.Class.MonadNew s' (Control.Monad.Trans.State.Lazy.StateT s m)
instance (Control.Concurrent.RCU.Class.MonadNew s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadNew s' (Control.Monad.Trans.RWS.Strict.RWST r w s m)
instance (Control.Concurrent.RCU.Class.MonadNew s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadNew s' (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
instance Control.Concurrent.RCU.Class.MonadNew s m => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Except.ExceptT e m)
instance Control.Concurrent.RCU.Class.MonadNew s m => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Maybe.MaybeT m)
instance Control.Concurrent.RCU.Class.MonadNew s m => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Identity.IdentityT m)


-- | QSBR-based RCU
module Control.Concurrent.RCU.GC.Internal

-- | Shared references
newtype SRef s a
SRef :: IORef a -> SRef s a
[unSRef] :: SRef s a -> IORef a

-- | This is a basic <a>RCU</a> thread. It may be embellished when running
--   in a more exotic context.
data RCUThread s a
RCUThread :: {-# UNPACK #-} !ThreadId -> {-# UNPACK #-} !MVar a -> RCUThread s a
[rcuThreadId] :: RCUThread s a -> {-# UNPACK #-} !ThreadId
[rcuThreadVar] :: RCUThread s a -> {-# UNPACK #-} !MVar a

-- | This is an RCU computation. It can use <a>forking</a> and
--   <a>joining</a> to form new threads, and then you can use
--   <a>reading</a> and <a>writing</a> to run classic read-side and
--   write-side RCU computations. Writers are serialized using an MVar,
--   readers are able to proceed while writers are updating.
newtype RCU s a
RCU :: (RCUState -> IO a) -> RCU s a
[unRCU] :: RCU s a -> RCUState -> IO a

-- | Run an RCU computation.
runRCU :: (forall s. RCU s a) -> IO a

-- | Run an RCU computation in a thread pinned to a particular core.
runOnRCU :: Int -> (forall s. RCU s a) -> IO a

-- | This is the basic read-side critical section for an RCU computation
newtype ReadingRCU s a
ReadingRCU :: (RCUState -> IO a) -> ReadingRCU s a
[runReadingRCU] :: ReadingRCU s a -> RCUState -> IO a

-- | This is the basic write-side critical section for an RCU computation
newtype WritingRCU s a
WritingRCU :: (RCUState -> IO a) -> WritingRCU s a
[runWritingRCU] :: WritingRCU s a -> RCUState -> IO a

-- | State for an RCU computation.
data RCUState
RCUState :: {-# UNPACK #-} !Counter -> {-# UNPACK #-} !IORef Version -> {-# UNPACK #-} !MVar [Counter] -> {-# UNPACK #-} !MVar () -> {-# UNPACK #-} !Counter -> !Maybe Int -> RCUState

-- | Global state
[rcuStateGlobalCounter] :: RCUState -> {-# UNPACK #-} !Counter
[rcuStateGlobalVersion] :: RCUState -> {-# UNPACK #-} !IORef Version
[rcuStateThreadCountersV] :: RCUState -> {-# UNPACK #-} !MVar [Counter]
[rcuStateWriterLockV] :: RCUState -> {-# UNPACK #-} !MVar ()

-- | Thread state
[rcuStateMyCounter] :: RCUState -> {-# UNPACK #-} !Counter
[rcuStatePinned] :: RCUState -> !Maybe Int
instance GHC.Base.Functor (Control.Concurrent.RCU.GC.Internal.RCU s)
instance GHC.Base.Functor (Control.Concurrent.RCU.GC.Internal.WritingRCU s)
instance GHC.Base.Functor (Control.Concurrent.RCU.GC.Internal.ReadingRCU s)
instance GHC.Classes.Eq (Control.Concurrent.RCU.GC.Internal.SRef s a)
instance Control.Concurrent.RCU.Class.MonadRCU (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.RCU s)
instance GHC.Base.Applicative (Control.Concurrent.RCU.GC.Internal.RCU s)
instance GHC.Base.Monad (Control.Concurrent.RCU.GC.Internal.RCU s)
instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.RCU s)
instance Control.Monad.IO.Class.MonadIO (Control.Concurrent.RCU.GC.Internal.RCU s)
instance GHC.Base.Applicative (Control.Concurrent.RCU.GC.Internal.WritingRCU s)
instance GHC.Base.Monad (Control.Concurrent.RCU.GC.Internal.WritingRCU s)
instance Control.Monad.Fail.MonadFail (Control.Concurrent.RCU.GC.Internal.WritingRCU s)
instance GHC.Base.Alternative (Control.Concurrent.RCU.GC.Internal.WritingRCU s)
instance GHC.Base.MonadPlus (Control.Concurrent.RCU.GC.Internal.WritingRCU s)
instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.WritingRCU s)
instance Control.Concurrent.RCU.Class.MonadReading (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.WritingRCU s)
instance Control.Concurrent.RCU.Class.MonadWriting (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.WritingRCU s)
instance GHC.Base.Applicative (Control.Concurrent.RCU.GC.Internal.ReadingRCU s)
instance GHC.Base.Monad (Control.Concurrent.RCU.GC.Internal.ReadingRCU s)
instance Control.Monad.Fail.MonadFail (Control.Concurrent.RCU.GC.Internal.ReadingRCU s)
instance GHC.Base.Alternative (Control.Concurrent.RCU.GC.Internal.ReadingRCU s)
instance GHC.Base.MonadPlus (Control.Concurrent.RCU.GC.Internal.ReadingRCU s)
instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.ReadingRCU s)
instance Control.Concurrent.RCU.Class.MonadReading (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.ReadingRCU s)
instance GHC.Classes.Eq Control.Concurrent.RCU.GC.Internal.Counter


-- | Unfenced QSBR w/ Finalizer-Based Fallback Reclamation
module Control.Concurrent.RCU.GC

-- | Shared references
data SRef s a

-- | This is an RCU computation. It can use <a>forking</a> and
--   <a>joining</a> to form new threads, and then you can use
--   <a>reading</a> and <a>writing</a> to run classic read-side and
--   write-side RCU computations. Writers are serialized using an MVar,
--   readers are able to proceed while writers are updating.
data RCU s a

-- | Run an RCU computation.
runRCU :: (forall s. RCU s a) -> IO a
class Monad m => MonadNew s m | m -> s

-- | Build a new shared reference
newSRef :: MonadNew s m => a -> m (s a)

-- | Build a new shared reference
newSRef :: (MonadNew s m, m ~ t n, MonadTrans t, MonadNew s n) => a -> m (s a)

-- | This is a read-side critical section
class MonadNew s m => MonadReading s m | m -> s

-- | Read a shared reference.
readSRef :: MonadReading s m => s a -> m a

-- | Read a shared reference.
readSRef :: (MonadReading s m, m ~ t n, MonadTrans t, MonadReading s n) => s a -> m a

-- | This is a write-side critical section
class MonadReading s m => MonadWriting s m | m -> s

-- | Write to a shared reference.
writeSRef :: MonadWriting s m => s a -> a -> m ()

-- | Write to a shared reference.
writeSRef :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => s a -> a -> m ()

-- | Synchronize with other writers.
--   
--   No other writer can straddle this time bound. It will either see
--   writes from before, or writes after, but never some of both!
synchronize :: MonadWriting s m => m ()

-- | Synchronize with other writers.
--   
--   No other writer can straddle this time bound. It will either see
--   writes from before, or writes after, but never some of both!
synchronize :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => m ()

-- | This is the executor service that can fork, join and execute critical
--   sections.
class (MonadReading s (Reading m), MonadWriting s (Writing m), MonadNew s m) => MonadRCU s m | m -> s where {
    
    -- | A read-side critical section
    type family Reading m :: * -> *;
    
    -- | A write-side critical section
    type family Writing m :: * -> *;
    
    -- | Threads we can fork and join
    type family Thread m :: * -> *;
}

-- | Fork a thread
forking :: MonadRCU s m => m a -> m (Thread m a)

-- | Join a thread
joining :: MonadRCU s m => Thread m a -> m a

-- | Run a read-side critical section
reading :: MonadRCU s m => Reading m a -> m a

-- | Run a write-side critical section
writing :: MonadRCU s m => Writing m a -> m a

-- | This is the basic read-side critical section for an RCU computation
data ReadingRCU s a

-- | This is the basic write-side critical section for an RCU computation
data WritingRCU s a

-- | This is a basic <a>RCU</a> thread. It may be embellished when running
--   in a more exotic context.
data RCUThread s a


-- | QSBR-based RCU
module Control.Concurrent.RCU.QSBR.Internal

-- | Shared references
newtype SRef s a
SRef :: IORef a -> SRef s a
[unSRef] :: SRef s a -> IORef a

-- | This is a basic <a>RCU</a> thread. It may be embellished when running
--   in a more exotic context.
data RCUThread s a
RCUThread :: {-# UNPACK #-} !ThreadId -> {-# UNPACK #-} !MVar a -> RCUThread s a
[rcuThreadId] :: RCUThread s a -> {-# UNPACK #-} !ThreadId
[rcuThreadVar] :: RCUThread s a -> {-# UNPACK #-} !MVar a

-- | This is an RCU computation. It can use <a>forking</a> and
--   <a>joining</a> to form new threads, and then you can use
--   <a>reading</a> and <a>writing</a> to run classic read-side and
--   write-side RCU computations. Writers are serialized using an MVar,
--   readers are able to proceed while writers are updating.
newtype RCU s a
RCU :: (RCUState -> IO a) -> RCU s a
[unRCU] :: RCU s a -> RCUState -> IO a

-- | Run an RCU computation.
runRCU :: (forall s. RCU s a) -> IO a

-- | Run an RCU computation in a thread pinned to a particular core.
runOnRCU :: Int -> (forall s. RCU s a) -> IO a

-- | This is the basic read-side critical section for an RCU computation
newtype ReadingRCU s a
ReadingRCU :: (RCUState -> IO a) -> ReadingRCU s a
[runReadingRCU] :: ReadingRCU s a -> RCUState -> IO a

-- | This is the basic write-side critical section for an RCU computation
newtype WritingRCU s a
WritingRCU :: (RCUState -> IO a) -> WritingRCU s a
[runWritingRCU] :: WritingRCU s a -> RCUState -> IO a

-- | State for an RCU computation.
data RCUState
RCUState :: {-# UNPACK #-} !Counter -> {-# UNPACK #-} !IORef [Counter] -> {-# UNPACK #-} !MVar () -> {-# UNPACK #-} !MVar () -> {-# UNPACK #-} !Counter -> !Maybe Int -> RCUState

-- | Global state
[rcuStateGlobalCounter] :: RCUState -> {-# UNPACK #-} !Counter
[rcuStateThreadCountersR] :: RCUState -> {-# UNPACK #-} !IORef [Counter]
[rcuStateThreadCountersLockV] :: RCUState -> {-# UNPACK #-} !MVar ()
[rcuStateWriterLockV] :: RCUState -> {-# UNPACK #-} !MVar ()

-- | Thread state
[rcuStateMyCounter] :: RCUState -> {-# UNPACK #-} !Counter
[rcuStatePinned] :: RCUState -> !Maybe Int
instance GHC.Base.Functor (Control.Concurrent.RCU.QSBR.Internal.RCU s)
instance GHC.Base.Functor (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s)
instance GHC.Base.Functor (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s)
instance GHC.Classes.Eq (Control.Concurrent.RCU.QSBR.Internal.SRef s a)
instance Control.Concurrent.RCU.Class.MonadRCU (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.RCU s)
instance GHC.Base.Applicative (Control.Concurrent.RCU.QSBR.Internal.RCU s)
instance GHC.Base.Monad (Control.Concurrent.RCU.QSBR.Internal.RCU s)
instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.RCU s)
instance Control.Monad.IO.Class.MonadIO (Control.Concurrent.RCU.QSBR.Internal.RCU s)
instance GHC.Base.Applicative (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s)
instance GHC.Base.Monad (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s)
instance Control.Monad.Fail.MonadFail (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s)
instance GHC.Base.Alternative (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s)
instance GHC.Base.MonadPlus (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s)
instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s)
instance Control.Concurrent.RCU.Class.MonadReading (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s)
instance Control.Concurrent.RCU.Class.MonadWriting (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s)
instance GHC.Base.Applicative (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s)
instance GHC.Base.Monad (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s)
instance Control.Monad.Fail.MonadFail (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s)
instance GHC.Base.Alternative (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s)
instance GHC.Base.MonadPlus (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s)
instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s)
instance Control.Concurrent.RCU.Class.MonadReading (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s)
instance GHC.Classes.Eq Control.Concurrent.RCU.QSBR.Internal.Counter


-- | Quiescent-State-Based Reclamation
module Control.Concurrent.RCU.QSBR

-- | Shared references
data SRef s a

-- | This is an RCU computation. It can use <a>forking</a> and
--   <a>joining</a> to form new threads, and then you can use
--   <a>reading</a> and <a>writing</a> to run classic read-side and
--   write-side RCU computations. Writers are serialized using an MVar,
--   readers are able to proceed while writers are updating.
data RCU s a

-- | Run an RCU computation.
runRCU :: (forall s. RCU s a) -> IO a
class Monad m => MonadNew s m | m -> s

-- | Build a new shared reference
newSRef :: MonadNew s m => a -> m (s a)

-- | Build a new shared reference
newSRef :: (MonadNew s m, m ~ t n, MonadTrans t, MonadNew s n) => a -> m (s a)

-- | This is a read-side critical section
class MonadNew s m => MonadReading s m | m -> s

-- | Read a shared reference.
readSRef :: MonadReading s m => s a -> m a

-- | Read a shared reference.
readSRef :: (MonadReading s m, m ~ t n, MonadTrans t, MonadReading s n) => s a -> m a

-- | This is a write-side critical section
class MonadReading s m => MonadWriting s m | m -> s

-- | Write to a shared reference.
writeSRef :: MonadWriting s m => s a -> a -> m ()

-- | Write to a shared reference.
writeSRef :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => s a -> a -> m ()

-- | Synchronize with other writers.
--   
--   No other writer can straddle this time bound. It will either see
--   writes from before, or writes after, but never some of both!
synchronize :: MonadWriting s m => m ()

-- | Synchronize with other writers.
--   
--   No other writer can straddle this time bound. It will either see
--   writes from before, or writes after, but never some of both!
synchronize :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => m ()

-- | This is the executor service that can fork, join and execute critical
--   sections.
class (MonadReading s (Reading m), MonadWriting s (Writing m), MonadNew s m) => MonadRCU s m | m -> s where {
    
    -- | A read-side critical section
    type family Reading m :: * -> *;
    
    -- | A write-side critical section
    type family Writing m :: * -> *;
    
    -- | Threads we can fork and join
    type family Thread m :: * -> *;
}

-- | Fork a thread
forking :: MonadRCU s m => m a -> m (Thread m a)

-- | Join a thread
joining :: MonadRCU s m => Thread m a -> m a

-- | Run a read-side critical section
reading :: MonadRCU s m => Reading m a -> m a

-- | Run a write-side critical section
writing :: MonadRCU s m => Writing m a -> m a

-- | This is the basic read-side critical section for an RCU computation
data ReadingRCU s a

-- | This is the basic write-side critical section for an RCU computation
data WritingRCU s a

-- | This is a basic <a>RCU</a> thread. It may be embellished when running
--   in a more exotic context.
data RCUThread s a
