Implementation of creature update using endofunctor monoid

This commit is contained in:
jgk
2021-08-18 00:59:35 +02:00
parent 5971fae5ec
commit cfb27d4a76
4 changed files with 18 additions and 7 deletions
+14 -3
View File
@@ -26,9 +26,11 @@ import Data.List
import Data.Maybe
import Data.Function
import qualified Data.Set as S
import qualified Data.IntMap.Strict as IM
import qualified Data.IntMap.Lazy as IM
import qualified Data.Map as M
import Control.Lens
import Data.Monoid
import System.Random
update :: World -> World
update = update' . pushSideEffects
@@ -129,12 +131,21 @@ updateParticles w = set particles (catMaybes ps) w'
where
(w',ps) = mapAccumR (\a b -> _ptUpdate' b a b) w $ _particles w
updateCreatures :: World -> World
updateCreatures w = f $ set randGen newG $ set creatures (IM.mapMaybe id crs) w
updateCreatures' :: World -> World
updateCreatures' w = f $ set randGen newG $ set creatures (IM.mapMaybe id crs) w
where
((f,newG),crs) =
IM.mapAccum (\g' cr -> _crUpdate cr w g' cr) (id,_randGen w) $ _creatures w
updateToTM :: (World -> (World -> World,StdGen) -> Creature -> ((World -> World,StdGen), Maybe Creature)) -> World -> Creature -> (Endo World, Maybe Creature)
updateToTM u w cr = case u w (id,_randGen w) cr of
((f,_),mcr) -> (Endo f,mcr)
updateCreatures :: World -> World
updateCreatures w = appEndo f $ creatures .~ IM.mapMaybe id m $ w
where
(f,m) = traverse (\cr -> updateToTM (_crUpdate cr) w cr) (_creatures w)
{- |
Apply door mechanisms. -}
updateWalls :: World -> World