{-# OPTIONS_GHC -Wno-warnings-deprecations #-}
{-# LANGUAGE OverloadedStrings #-}
module Capataz.HowTo.DynamicWorker
  (
    -- * Description
    -- $description

    -- * Code
    -- $code
    main
  ) where

import RIO
import Capataz
  (
    forkCapataz
  , forkWorker
  , terminateCapataz_
  , buildWorkerOptions
  , workerRestartStrategyL
  , WorkerRestartStrategy(..)
  , onSystemEventL
  )

{- $description

The following example:

* creates a capataz system
* forks a worker process dynamically
* terminates capataz system

-}

{- $code

@
module Capataz.HowTo.DynamicWorker

myUselessWorker :: IO ()
myUselessWorker = return ()

main :: IO ()
main = do
  bracket
    ('forkCapataz' \"dynamic-worker-example\"
                 (set 'onSystemEventL' traceDisplayIO))
    'terminateCapataz_'
    (\\capataz -> do
      void $ 'forkWorker'
        ( 'buildWorkerOptions' \"useless-worker\"
                             myUselessWorker
                             (set 'workerRestartStrategyL' 'Transient')
        )
        capataz
      threadDelay 1001000)
@

-}

myUselessWorker :: IO ()
myUselessWorker = return ()

-- | Function that runs the example
main :: IO ()
main = do
  bracket
    (forkCapataz "dynamic-worker-example"
                 (set onSystemEventL traceDisplayIO))
    terminateCapataz_
    (\capataz -> do
      void $ forkWorker
        ( buildWorkerOptions "useless-worker"
                             myUselessWorker
                             (set workerRestartStrategyL Transient)
        )
        capataz
      threadDelay 1001000)