-- | Atomic monads.
module Game.LambdaHack.Atomic.MonadAtomic
  ( MonadAtomic(..)
  , broadcastUpdAtomic,  broadcastSfxAtomic
  ) where

import Data.Key (mapWithKeyM_)

import Game.LambdaHack.Atomic.CmdAtomic
import Game.LambdaHack.Common.MonadStateRead
import Game.LambdaHack.Common.Faction
import Game.LambdaHack.Common.State

class MonadStateRead m => MonadAtomic m where
  execAtomic    :: CmdAtomic -> m ()
  execUpdAtomic :: UpdAtomic -> m ()
  execUpdAtomic = execAtomic . UpdAtomic
  execSfxAtomic :: SfxAtomic -> m ()
  execSfxAtomic = execAtomic . SfxAtomic

broadcastUpdAtomic :: MonadAtomic m
                   => (FactionId -> UpdAtomic) -> m ()
broadcastUpdAtomic fcmd = do
  factionD <- getsState sfactionD
  mapWithKeyM_ (\fid _ -> execUpdAtomic $ fcmd fid) factionD

broadcastSfxAtomic :: MonadAtomic m
                   => (FactionId -> SfxAtomic) -> m ()
broadcastSfxAtomic fcmd = do
  factionD <- getsState sfactionD
  mapWithKeyM_ (\fid _ -> execSfxAtomic $ fcmd fid) factionD