(original) (raw)

{-# LANGUAGE Unsafe #-} {-# LANGUAGE NoImplicitPrelude, MagicHash, UnboxedTuples, RankNTypes #-} {-# OPTIONS_HADDOCK not-home #-}

module GHC.ST ( ST(..), STret(..), STRep, runST,

    [liftST](GHC.ST.html#liftST), [unsafeInterleaveST](GHC.ST.html#unsafeInterleaveST), [unsafeDupableInterleaveST](GHC.ST.html#unsafeDupableInterleaveST)
) where

import GHC.Base import GHC.Show import Control.Monad.Fail

default ()

newtype ST s a = ST (STRep s a) type STRep s a = State# s -> (# State# s, a #)

instance Functor (ST s) where fmap :: forall a b. (a -> b) -> ST s a -> ST s b fmap a -> b f (ST STRep s a m) = STRep s b -> ST s b forall s a. STRep s a -> ST s a ST (STRep s b -> ST s b) -> STRep s b -> ST s b forall a b. (a -> b) -> a -> b $ \ State# s s -> case (STRep s a m State# s s) of { (# State# s new_s, a r #) -> (# State# s new_s, a -> b f a r #) }

instance Applicative (ST s) where {-# INLINE pure #-} {-# INLINE (*>) #-} pure :: forall a. a -> ST s a pure a x = STRep s a -> ST s a forall s a. STRep s a -> ST s a ST (\ State# s s -> (# State# s s, a x #)) ST s a m *> :: forall a b. ST s a -> ST s b -> ST s b *> ST s b k = ST s a m ST s a -> (a -> ST s b) -> ST s b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= \ a _ -> ST s b k <*> :: forall a b. ST s (a -> b) -> ST s a -> ST s b (<*>) = ST s (a -> b) -> ST s a -> ST s b forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b ap liftA2 :: forall a b c. (a -> b -> c) -> ST s a -> ST s b -> ST s c liftA2 = (a -> b -> c) -> ST s a -> ST s b -> ST s c forall (m :: * -> *) a1 a2 r. Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r liftM2

instance Monad (ST s) where {-# INLINE (>>=) #-} >> :: forall a b. ST s a -> ST s b -> ST s b (>>) = ST s a -> ST s b -> ST s b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b (*>) (ST STRep s a m) >>= :: forall a b. ST s a -> (a -> ST s b) -> ST s b >>= a -> ST s b k = STRep s b -> ST s b forall s a. STRep s a -> ST s a ST (\ State# s s -> case (STRep s a m State# s s) of { (# State# s new_s, a r #) -> case (a -> ST s b k a r) of { ST STRep s b k2 -> (STRep s b k2 State# s new_s) }})

instance MonadFail (ST s) where fail :: forall a. String -> ST s a fail String s = String -> ST s a forall a. String -> a errorWithoutStackTrace String s

instance Semigroup a => Semigroup (ST s a) where <> :: ST s a -> ST s a -> ST s a (<>) = (a -> a -> a) -> ST s a -> ST s a -> ST s a forall (f :: * -> *) a b c. Applicative f => (a -> b -> c) -> f a -> f b -> f c liftA2 a -> a -> a forall a. Semigroup a => a -> a -> a (<>)

instance Monoid a => Monoid (ST s a) where mempty :: ST s a mempty = a -> ST s a forall (f :: * -> *) a. Applicative f => a -> f a pure a forall a. Monoid a => a mempty

data STret s a = STret (State# s) a

liftST :: ST s a -> State# s -> STret s a liftST :: forall s a. ST s a -> State# s -> STret s a liftST (ST STRep s a m) = \State# s s -> case STRep s a m State# s s of (# State# s s', a r #) -> State# s -> a -> STret s a forall s a. State# s -> a -> STret s a STret State# s s' a r

noDuplicateST :: ST s () noDuplicateST :: forall s. ST s () noDuplicateST = STRep s () -> ST s () forall s a. STRep s a -> ST s a ST (STRep s () -> ST s ()) -> STRep s () -> ST s () forall a b. (a -> b) -> a -> b $ \State# s s -> (# State# s -> State# s forall d. State# d -> State# d noDuplicate# State# s s, () #)

{-# INLINE unsafeInterleaveST #-} unsafeInterleaveST :: ST s a -> ST s a unsafeInterleaveST :: forall s a. ST s a -> ST s a unsafeInterleaveST ST s a m = ST s a -> ST s a forall s a. ST s a -> ST s a unsafeDupableInterleaveST (ST s () forall s. ST s () noDuplicateST ST s () -> ST s a -> ST s a forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> ST s a m)

{-# NOINLINE unsafeDupableInterleaveST #-}

unsafeDupableInterleaveST :: ST s a -> ST s a unsafeDupableInterleaveST :: forall s a. ST s a -> ST s a unsafeDupableInterleaveST (ST STRep s a m) = STRep s a -> ST s a forall s a. STRep s a -> ST s a ST ( \ State# s s -> let r :: a r = case STRep s a m State# s s of (# State# s _, a res #) -> a res in (# State# s s, a r #) )

instance Show (ST s a) where showsPrec :: Int -> ST s a -> ShowS showsPrec Int _ ST s a _ = String -> ShowS showString String "<>" showList :: [ST s a] -> ShowS showList = (ST s a -> ShowS) -> [ST s a] -> ShowS forall a. (a -> ShowS) -> [a] -> ShowS showList__ (Int -> ST s a -> ShowS forall a. Show a => Int -> a -> ShowS showsPrec Int 0)

{-# INLINE runST #-}

runST :: (forall s. ST s a) -> a runST :: forall a. (forall s. ST s a) -> a runST (ST STRep RealWorld a st_rep) = case STRep RealWorld a -> (# State# RealWorld, a #) forall o. (State# RealWorld -> o) -> o runRW# STRep RealWorld a st_rep of (# State# RealWorld _, a a #) -> a a