module Aztecs.ECS.World.Bundle.Dynamic
  ( DynamicBundle (..),
    MonoidDynamicBundle (..),
  )
where

import Aztecs.ECS.Entity (EntityID)
import Aztecs.ECS.World.Archetype (Archetype, insertComponent)
import Aztecs.ECS.World.Bundle.Dynamic.Class (MonoidDynamicBundle (..))

-- | Dynamic bundle of components.
newtype DynamicBundle = DynamicBundle {DynamicBundle -> EntityID -> Archetype -> Archetype
runDynamicBundle :: EntityID -> Archetype -> Archetype}

instance Semigroup DynamicBundle where
  DynamicBundle EntityID -> Archetype -> Archetype
d1 <> :: DynamicBundle -> DynamicBundle -> DynamicBundle
<> DynamicBundle EntityID -> Archetype -> Archetype
d2 = (EntityID -> Archetype -> Archetype) -> DynamicBundle
DynamicBundle ((EntityID -> Archetype -> Archetype) -> DynamicBundle)
-> (EntityID -> Archetype -> Archetype) -> DynamicBundle
forall a b. (a -> b) -> a -> b
$ \EntityID
eId Archetype
arch -> EntityID -> Archetype -> Archetype
d2 EntityID
eId (EntityID -> Archetype -> Archetype
d1 EntityID
eId Archetype
arch)

instance Monoid DynamicBundle where
  mempty :: DynamicBundle
mempty = (EntityID -> Archetype -> Archetype) -> DynamicBundle
DynamicBundle ((EntityID -> Archetype -> Archetype) -> DynamicBundle)
-> (EntityID -> Archetype -> Archetype) -> DynamicBundle
forall a b. (a -> b) -> a -> b
$ \EntityID
_ Archetype
arch -> Archetype
arch

instance MonoidDynamicBundle DynamicBundle where
  dynBundle :: forall c. Component c => ComponentID -> c -> DynamicBundle
dynBundle ComponentID
cId c
a = (EntityID -> Archetype -> Archetype) -> DynamicBundle
DynamicBundle ((EntityID -> Archetype -> Archetype) -> DynamicBundle)
-> (EntityID -> Archetype -> Archetype) -> DynamicBundle
forall a b. (a -> b) -> a -> b
$ \EntityID
eId Archetype
arch -> EntityID -> ComponentID -> c -> Archetype -> Archetype
forall a.
Component a =>
EntityID -> ComponentID -> a -> Archetype -> Archetype
insertComponent EntityID
eId ComponentID
cId c
a Archetype
arch