module Wobsurv.Util.WorkerThread where

import BasePrelude hiding (fork)
import Wobsurv.Util.MasterThread
import Control.Concurrent.STM.TBQueue
import Control.Monad.Trans.Class


type WorkerThread =
  TBQueue (MT ())

new :: Int -> MT WorkerThread
new size =
  do
    queue <- lift $ atomically $ newTBQueue size
    fork $ do
      forever $ join $ lift $ atomically $ readTBQueue queue
    return queue

schedule :: MT () -> WorkerThread -> MT ()
schedule task queue =
  lift $ atomically $ writeTBQueue queue task