module Event where import Data.IORef (modifyIORef) import qualified Data.List as L import qualified Data.Lens.Strict as LE import qualified Gamgine.Math.Vect as V import qualified Gamgine.Math.Box as B import qualified GameData.Entity as E import qualified GameData.Level as LV data Event = MkLevelEvent LevelEvent | MkEntityEvent EntityEvent | MkMultiEvent [Event] data LevelEvent = UpdateLevel (LV.Level -> LV.Level) data EntityEvent = UpdateEntity (E.Entity -> E.Entity) handleEvents :: [Event] -> LV.Level -> LV.Level handleEvents events lv = L.foldl' (flip handleEvent) lv events handleEvent :: Event -> LV.Level -> LV.Level handleEvent (MkLevelEvent (UpdateLevel f)) lv = f lv handleEvent (MkEntityEvent (UpdateEntity f)) lv = E.eMap f lv handleEvent (MkMultiEvent es) lv = L.foldl' (flip handleEvent) lv es