-- |Description: Polysemy Effects for Concurrency
module Polysemy.Conc (
  -- * Introduction
  -- $intro

  -- * Queues
  -- $queue
  Queue,
  QueueResult,
  resultToMaybe,

  -- ** Interpreters
  interpretQueueTBM,
  interpretQueueTB,
  interpretQueueListReadOnlyAtomic,
  interpretQueueListReadOnlyAtomicWith,
  interpretQueueListReadOnlyState,
  interpretQueueListReadOnlyStateWith,

  -- * MVars
  -- $mvar
  Sync,

  -- ** Interpreters
  interpretSync,

  -- * Racing
  -- $race
  Race,
  race,
  race_,
  timeout,
  timeout_,

  -- ** Interpreters
  interpretRace,

  -- * Signal Handling
  -- $signal
  Interrupt,

  -- ** Interpreters
  interpretInterrupt,
) where

import Polysemy.Conc.Data.Interrupt (Interrupt)
import Polysemy.Conc.Data.Queue (Queue)
import Polysemy.Conc.Data.QueueResult (QueueResult)
import Polysemy.Conc.Data.Race (Race, race, timeout)
import Polysemy.Conc.Data.Sync (Sync)
import Polysemy.Conc.Interrupt (interpretInterrupt)
import Polysemy.Conc.Queue (
  interpretQueueListReadOnlyAtomic,
  interpretQueueListReadOnlyAtomicWith,
  interpretQueueListReadOnlyState,
  interpretQueueListReadOnlyStateWith,
  )
import Polysemy.Conc.Queue.Result (resultToMaybe)
import Polysemy.Conc.Queue.TB (interpretQueueTB)
import Polysemy.Conc.Queue.TBM (interpretQueueTBM)
import Polysemy.Conc.Race (interpretRace, race_, timeout_)
import Polysemy.Conc.Sync (interpretSync)

-- $intro
-- This library provides an assortment of tools for concurrency-related tasks:
--
-- - [STM queues](#queue)
-- - [MVars](#mvar)
-- - [Racing](#race)
-- - [Signal handling](#signal)

-- $queue
-- #queue#

-- $mvar
-- #mvar#
-- An 'MVar' is abstracted as 'Sync' since it can be used to synchronize threads.

-- $race
-- #race#
-- Racing works like this:
--
-- @
-- prog =
--  Polysemy.Conc.race (httpRequest "hackage.haskell.org") (readFile "\/path\/to\/file") >>= \\case
--    Left _ -> putStrLn "hackage was faster"
--    Right _ -> putStrLn "file was faster"
-- @
--
-- When the first thunk finishes, the other will be killed.

-- $signal
-- #signal#