{-# LANGUAGE TypeFamilies #-}

module Aztecs.ECS.Class (ECS (..)) where

import Aztecs.ECS.Bundle
import Data.Kind

-- | Entity Component System (ECS) implementation.

class ECS m where
  -- | Entity identifier.

  type Entity m :: Type

  -- | Task monad for running systems.

  type Task m :: Type -> Type

  -- | Spawn a new entity with a `Bundle` of components.

  spawn :: Bundle (Entity m) m -> m (Entity m)

  -- | Insert a `Bundle` of components into an existing entity

  -- (otherwise this will do nothing).

  insert :: Entity m -> Bundle (Entity m) m -> m ()

  -- | Remove an entity and its components.

  remove :: Entity m -> m ()

  -- | Run a `Task`.

  task :: (Task m) a -> m a