packages feed

swarm-0.6.0.0: src/swarm-scenario/Swarm/Game/Land.hs

{-# LANGUAGE TemplateHaskell #-}

-- |
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Terrain and Entities
module Swarm.Game.Land (
  TerrainEntityMaps (TerrainEntityMaps),
  terrainMap,
  entityMap,
  loadEntitiesAndTerrain,
) where

import Control.Algebra (Has)
import Control.Effect.Lift (Lift)
import Control.Effect.Throw (Throw)
import Control.Lens (makeLenses)
import GHC.Generics (Generic)
import Swarm.Game.Entity
import Swarm.Game.Failure (SystemFailure)
import Swarm.Game.Terrain

data TerrainEntityMaps = TerrainEntityMaps
  { _terrainMap :: TerrainMap
  , _entityMap :: EntityMap
  }
  deriving (Show, Generic)

makeLenses ''TerrainEntityMaps

instance Semigroup TerrainEntityMaps where
  TerrainEntityMaps tm1 em1 <> TerrainEntityMaps tm2 em2 =
    TerrainEntityMaps (tm1 <> tm2) (em1 <> em2)

instance Monoid TerrainEntityMaps where
  mempty = TerrainEntityMaps mempty mempty

loadEntitiesAndTerrain ::
  (Has (Throw SystemFailure) sig m, Has (Lift IO) sig m) =>
  m TerrainEntityMaps
loadEntitiesAndTerrain =
  TerrainEntityMaps <$> loadTerrain <*> loadEntities