module Control.Reaper.Internal (Reaper (..)) where

-- | A data structure to hold reaper APIs.
data Reaper workload item = Reaper
    { forall workload item. Reaper workload item -> item -> IO ()
reaperAdd :: item -> IO ()
    -- ^ Adding an item to the workload
    , forall workload item. Reaper workload item -> IO workload
reaperRead :: IO workload
    -- ^ Reading workload.
    , forall workload item.
Reaper workload item -> (workload -> workload) -> IO workload
reaperModify :: (workload -> workload) -> IO workload
    -- ^ Modify the workload. The resulting workload is returned.
    --
    --   If there is no reaper thread, the modifier will not be applied and
    --   'reaperEmpty' will be returned.
    --
    --   If the reaper is currently executing jobs, those jobs will not be in
    --   the given workload and the workload might appear empty.
    --
    --   If all jobs are removed by the modifier, the reaper thread will not be
    --   killed. The reaper thread will only terminate if 'reaperKill' is called
    --   or the result of 'reaperAction' satisfies 'reaperNull'.
    --
    --  @since 0.2.0
    , forall workload item. Reaper workload item -> IO workload
reaperStop :: IO workload
    -- ^ Stopping the reaper thread if exists.
    --   The current workload is returned.
    , forall workload item. Reaper workload item -> IO ()
reaperKill :: IO ()
    -- ^ Killing the reaper thread immediately if exists.
    }