{-|
  This module offers a `Bounded` supervisor variant,
  where `SupervisionEvent`(s) are written on a `TBQueue`,
  and simply discarded if the queue is full.
-}

{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DeriveDataTypeable #-}

module Control.Concurrent.Supervisor.Bounded
  ( SupervisorSpec
  , Supervisor
  , Child
  , newSupervisorSpec
  , newSupervisorSpecBounded
  , newSupervisor
  , module T
  ) where

import Control.Concurrent.Supervisor.Types as T hiding (newSupervisor, newSupervisorSpec)
import qualified Control.Concurrent.Supervisor.Types as Types
import           Control.Concurrent.STM

type SupervisorSpec = Types.SupervisorSpec0 TBQueue
type Supervisor = Types.Supervisor0 TBQueue

--------------------------------------------------------------------------------
type Child = Types.Child_ TBQueue

--------------------------------------------------------------------------------
-- | Creates a new 'SupervisorSpec'. The reason it doesn't return a
-- 'Supervisor' is to force you to call 'supervise' explicitly, in order to start the
-- supervisor thread.
newSupervisorSpec :: Types.RestartStrategy -> IO SupervisorSpec
newSupervisorSpec strategy = Types.newSupervisorSpec strategy defaultEventQueueSize

--------------------------------------------------------------------------------
-- | Like 'newSupervisorSpec', but give the user control over the size of the
-- event queue.
newSupervisorSpecBounded :: Types.RestartStrategy -> Int -> IO SupervisorSpec
newSupervisorSpecBounded = Types.newSupervisorSpec

--------------------------------------------------------------------------------
-- | The default size of the queue where `SupervisionEvent`(s) are written.
defaultEventQueueSize :: Int
defaultEventQueueSize = 10000

-- $supervise

--------------------------------------------------------------------------------
newSupervisor :: SupervisorSpec -> IO Supervisor
newSupervisor spec = Types.newSupervisor spec