monad-interleave-0.1: Control/Monad/Interleave.hs
-----------------------------------------------------------------------------
-- |
-- Module : Control.Monad.Interleave
-- Copyright : Copyright (c) , Patrick Perry <patperry@stanford.edu>
-- License : BSD3
-- Maintainer : Patrick Perry <patperry@stanford.edu>
-- Stability : experimental
--
-- Monads with an unsaveInterleaveIO-like operation.
--
module Control.Monad.Interleave (
MonadInterleave(..),
) where
import Control.Monad.ST
import qualified Control.Monad.ST.Lazy as Lazy
import System.IO.Unsafe
-- | Monads that have an operation like 'unsafeInterleaveIO'.
class Monad m => MonadInterleave m where
-- | Get the baton from the monad without doing any computation.
unsafeInterleave :: m a -> m a
instance MonadInterleave IO where
unsafeInterleave = unsafeInterleaveIO
{-# INLINE unsafeInterleave #-}
instance MonadInterleave (ST s) where
unsafeInterleave = unsafeInterleaveST
{-# INLINE unsafeInterleave #-}
instance MonadInterleave (Lazy.ST s) where
unsafeInterleave = Lazy.unsafeInterleaveST
{-# INLINE unsafeInterleave #-}