packages feed

eventloop-0.5.0.0: src/Eventloop/System/InitializationThread.hs

module Eventloop.System.InitializationThread
    ( startInitializing
    ) where

import Control.Exception
import Control.Concurrent.MVar

import Eventloop.System.ThreadActions
import Eventloop.Types.Exception
import Eventloop.Types.System


startInitializing :: EventloopSystemConfiguration progstateT
                  -> IO ()
startInitializing systemConfig
    = mapM_ (initializeModule sharedIOStateM_) moduleConfigs_
    where
        sharedIOStateM_ = sharedIOStateM systemConfig
        moduleConfigs_ = moduleConfigs systemConfig
        

initializeModule :: MVar SharedIOState 
                 -> EventloopModuleConfiguration
                 -> IO ()
initializeModule sharedIOStateM_ moduleConfig
    = case (initializerM moduleConfig) of
        Nothing            -> return ()
        (Just initializer) -> do
            initializeIOState sharedIOStateM_ iostateM_
                ( \exception ->
                    throwIO (InitializationException moduleId_ exception)
                )
                initializer
    where
        moduleId_ = moduleId moduleConfig
        iostateM_ = iostateM moduleConfig