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. }