| Safe Haskell | None |
|---|---|
| Language | GHC2021 |
Effectful.Concurrent.STM.TBQueue.Static
Description
TBQueue helpers for static Concurrent effect.
Since: 0.1
Synopsis
- readTBQueue' :: TBQueue a -> STM a
- tryReadTBQueue' :: TBQueue a -> STM (Maybe a)
- writeTBQueue' :: TBQueue a -> a -> STM ()
- flushTBQueue' :: TBQueue a -> STM [a]
- readTBQueueA' :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es a
- tryReadTBQueueA' :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es (Maybe a)
- writeTBQueueA' :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> a -> Eff es ()
- flushTBQueueA' :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es [a]
- newTBQueue :: Natural -> STM (TBQueue a)
- readTBQueue :: TBQueue a -> STM a
- tryReadTBQueue :: TBQueue a -> STM (Maybe a)
- writeTBQueue :: TBQueue a -> a -> STM ()
- flushTBQueue :: TBQueue a -> STM [a]
- newTBQueueA :: forall (es :: [Effect]) a. Concurrent :> es => Natural -> Eff es (TBQueue a)
- readTBQueueA :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es a
- tryReadTBQueueA :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es (Maybe a)
- writeTBQueueA :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> a -> Eff es ()
- flushTBQueueA :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es [a]
- data Concurrent (a :: Type -> Type) b
- runConcurrent :: forall (es :: [Effect]) a. (HasCallStack, IOE :> es) => Eff (Concurrent ': es) a -> Eff es a
- data TBQueue a
- data Natural
TBQueue
Strict
readTBQueue' :: TBQueue a -> STM a Source #
Since: 0.1
writeTBQueue' :: TBQueue a -> a -> STM () Source #
Since: 0.1
flushTBQueue' :: TBQueue a -> STM [a] Source #
Since: 0.1
Atomic
readTBQueueA' :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es a Source #
Since: 0.1
tryReadTBQueueA' :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es (Maybe a) Source #
Since: 0.1
writeTBQueueA' :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> a -> Eff es () Source #
Since: 0.1
flushTBQueueA' :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es [a] Source #
Since: 0.1
Lazy
Builds and returns a new instance of TBQueue.
readTBQueue :: TBQueue a -> STM a #
Read the next value from the TBQueue.
tryReadTBQueue :: TBQueue a -> STM (Maybe a) #
A version of readTBQueue which does not retry. Instead it
returns Nothing if no value is available.
writeTBQueue :: TBQueue a -> a -> STM () #
Write a value to a TBQueue; blocks if the queue is full.
flushTBQueue :: TBQueue a -> STM [a] #
Efficiently read the entire contents of a TBQueue into a list. This
function never retries.
Since: stm-2.4.5
Atomic
newTBQueueA :: forall (es :: [Effect]) a. Concurrent :> es => Natural -> Eff es (TBQueue a) Source #
Since: 0.1
readTBQueueA :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es a Source #
Since: 0.1
tryReadTBQueueA :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es (Maybe a) Source #
Since: 0.1
writeTBQueueA :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> a -> Eff es () Source #
Since: 0.1
flushTBQueueA :: forall (es :: [Effect]) a. Concurrent :> es => TBQueue a -> Eff es [a] Source #
Since: 0.1
Re-exports
data Concurrent (a :: Type -> Type) b Source #
Provide the ability to run Eff computations concurrently in multiple
threads and communicate between them.
Warning: unless you stick to high level functions from the
withAsync family, the Concurrent effect makes
it possible to escape the scope of any scoped effect operation. Consider the
following:
>>>import Effectful.Reader.Static qualified as R
>>>printAsk msg = liftIO . putStrLn . (msg ++) . (": " ++) =<< R.ask
>>>:{runEff . R.runReader "GLOBAL" . runConcurrent $ do a <- R.local (const "LOCAL") $ do a <- async $ do printAsk "child (first)" threadDelay 20000 printAsk "child (second)" threadDelay 10000 printAsk "parent (inside)" pure a printAsk "parent (outside)" wait a :} child (first): LOCAL parent (inside): LOCAL parent (outside): GLOBAL child (second): LOCAL
Note that the asynchronous computation doesn't respect the scope of
local, i.e. the child thread still behaves like
it's inside the local block, even though the parent
thread already got out of it.
This is because the value provided by the Reader
effect is thread local, i.e. each thread manages its own version of it. For
the Reader it is the only reasonable behavior, it
wouldn't be very useful if its "read only" value was affected by calls to
local from its parent or child threads.
However, the cut isn't so clear if it comes to effects that provide access to
a mutable state. That's why statically dispatched State and Writer
effects come in two flavors, local and shared:
>>>import Effectful.State.Static.Local qualified as SL>>>:{runEff . SL.execState "Hi" . runConcurrent $ do replicateConcurrently_ 3 $ SL.modify (++ "!") :} "Hi"
>>>import Effectful.State.Static.Shared qualified as SS>>>:{runEff . SS.execState "Hi" . runConcurrent $ do replicateConcurrently_ 3 $ SS.modify (++ "!") :} "Hi!!!"
In the first example state updates made concurrently are not reflected in the parent thread because the value is thread local, but in the second example they are, because the value is shared.
Instances
| type DispatchOf Concurrent Source # | |
Defined in Effectful.Concurrent.Effect | |
| data StaticRep Concurrent Source # | |
Defined in Effectful.Concurrent.Effect | |
runConcurrent :: forall (es :: [Effect]) a. (HasCallStack, IOE :> es) => Eff (Concurrent ': es) a -> Eff es a Source #
Run the Concurrent effect.
TBQueue is an abstract type representing a bounded FIFO channel.
Since: stm-2.4
Natural number
Invariant: numbers <= 0xffffffffffffffff use the NS constructor
Instances
| PrintfArg Natural # | Since: base-4.8.0.0 |
Defined in Text.Printf | |
| Num Natural # | Note that Since: base-4.8.0.0 |
| Eq Natural # | |
| Ord Natural # | |
| KnownNat n => HasResolution (n :: Nat) # | For example, |
Defined in Data.Fixed Methods resolution :: p n -> Integer # | |