packages feed

aztecs-0.13.0: src/Aztecs/ECS/Class.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

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

import Aztecs.ECS.Access.Internal hiding (access)
import Aztecs.ECS.HSet
import Aztecs.ECS.Query
import Aztecs.ECS.Queryable
import Aztecs.ECS.Queryable.Internal hiding (Components)
import Aztecs.ECS.System
import Data.Kind

class ECS m where
  type Entity m :: Type
  type Components m :: [Type]
  type Bundle m :: Type
  type Task m :: Type -> Type

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

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

  remove :: Entity m -> m ()

  query :: (Queryable (Components m) (Task m) a) => m (Query (Task m) a)

  access ::
    ( Access (Components m) (Task m) a,
      ValidAccessInput (AccessType a),
      Subset (AccessToComponents (AccessType a)) (Components m)
    ) =>
    m a

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

  runSystemWithWorld ::
    ( System (Task m) sys,
      Access (Components m) (Task m) (SystemInputs (Task m) sys),
      Subset (AccessToComponents (AccessType (SystemInputs (Task m) sys))) (Components m),
      ValidAccessInput (AccessType (SystemInputs (Task m) sys)),
      Monad m
    ) =>
    sys ->
    m ()
  runSystemWithWorld sys = access >>= task . runSystem sys