-- |
-- Module     : Simulation.Aivika.Distributed.Optimistic.Event
-- Copyright  : Copyright (c) 2015-2016, David Sorokin <david.sorokin@gmail.com>
-- License    : BSD3
-- Maintainer : David Sorokin <david.sorokin@gmail.com>
-- Stability  : experimental
-- Tested with: GHC 7.10.3
--
-- This module defines additional functions for the 'Event' computation.
--
module Simulation.Aivika.Distributed.Optimistic.Event
       (syncEvent,
        syncEventInStopTime) where

import Simulation.Aivika.Trans

import Simulation.Aivika.Distributed.Optimistic.Internal.Event
import Simulation.Aivika.Distributed.Optimistic.DIO

-- | Synchronize the simulation in all nodes and call
-- the specified computation in the stop time.
--
-- The modeling time must be initial when calling this function.
-- Also this call must be last in your part of the model.
--
-- It is rather safe to call 'liftIO' within this function.
syncEventInStopTime :: Event DIO () -> Simulation DIO ()
syncEventInStopTime h =
  do t0 <- liftParameter stoptime
     runEventInStartTime $
       syncEvent t0 h
     runEventInStopTime $
       return ()