{-# LANGUAGE FunctionalDependencies #-}

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

import Aztecs.ECS.Query.Reader (QueryFilter (..))
import Control.Arrow (Arrow (..), (>>>))
import Prelude hiding (map)

class (Arrow arr) => ArrowSystem q arr | arr -> q where
  -- | Query and update all matching entities.
  map :: q i a -> arr i [a]

  -- | Query and update all matching entities, ignoring the results.
  map_ :: q i o -> arr i ()
  map_ q i o
q = q i o -> arr i [o]
forall i a. q i a -> arr i [a]
forall (q :: * -> * -> *) (arr :: * -> * -> *) i a.
ArrowSystem q arr =>
q i a -> arr i [a]
map q i o
q arr i [o] -> arr [o] () -> arr i ()
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> ([o] -> ()) -> arr [o] ()
forall b c. (b -> c) -> arr b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (() -> [o] -> ()
forall a b. a -> b -> a
const ())

  -- | Map all matching entities with a `QueryFilter`, storing the updated entities.
  filterMap :: q i a -> QueryFilter -> arr i [a]

  -- | Map a single matching entity, storing the updated components.
  -- If there are zero or multiple matching entities, an error will be thrown.
  mapSingle :: q i a -> arr i a

  mapSingleMaybe :: q i a -> arr i (Maybe a)