module Control.Concurrent.PooledIO.InOrder (
T, run, runLimited, fork,
) where
import qualified Control.Concurrent.PooledIO.Monad as Pool
import Control.DeepSeq (NFData)
import qualified System.Unsafe as Unsafe
import Control.Monad.IO.Class (liftIO)
import Control.Applicative (Applicative, pure, (<*>))
newtype T a = Cons {forall a. T a -> T a
decons :: Pool.T a}
instance Functor T where
fmap :: forall a b. (a -> b) -> T a -> T b
fmap a -> b
f (Cons T a
m) = forall a. T a -> T a
Cons forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f T a
m
instance Applicative T where
pure :: forall a. a -> T a
pure = forall a. T a -> T a
Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
Cons T (a -> b)
f <*> :: forall a b. T (a -> b) -> T a -> T b
<*> Cons T a
a = forall a. T a -> T a
Cons forall a b. (a -> b) -> a -> b
$ T (a -> b)
f forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> T a
a
instance Monad T where
return :: forall a. a -> T a
return = forall a. T a -> T a
Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => a -> m a
return
Cons T a
x >>= :: forall a b. T a -> (a -> T b) -> T b
>>= a -> T b
k = forall a. T a -> T a
Cons forall a b. (a -> b) -> a -> b
$ forall a. T a -> T a
decons forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> T b
k forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< T a
x
fork :: (NFData a) => IO a -> T a
fork :: forall a. NFData a => IO a -> T a
fork IO a
act =
forall a. T a -> T a
Cons forall a b. (a -> b) -> a -> b
$
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IO a -> IO a
Unsafe.interleaveIO forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall a. NFData a => IO a -> T (IO a)
Pool.fork IO a
act
run :: T a -> IO a
run :: forall a. T a -> IO a
run = forall a b. (Int -> a -> IO b) -> a -> IO b
Pool.withNumCapabilities forall a. Int -> T a -> IO a
runLimited
runLimited :: Int -> T a -> IO a
runLimited :: forall a. Int -> T a -> IO a
runLimited Int
maxThreads (Cons T a
m) =
forall a. Int -> T a -> IO a
Pool.runLimited Int
maxThreads T a
m