module Aztecs.ECS.Query.Dynamic.Reader.Class (ArrowDynamicQueryReader (..)) where

import Aztecs.ECS.Component
import Aztecs.ECS.Entity (EntityID)
import Control.Arrow (Arrow (..), (>>>))

class (Arrow arr) => ArrowDynamicQueryReader arr where
  -- | Fetch the currently matched `EntityID`.
  entity :: arr () EntityID

  -- | Fetch a `Component` by its `ComponentID`.
  fetchDyn :: (Component a) => ComponentID -> arr () a

  -- | Try to fetch a `Component` by its `ComponentID`.
  fetchMaybeDyn :: (Component a) => ComponentID -> arr () (Maybe a)
  fetchMaybeDyn ComponentID
cId = ComponentID -> arr () a
forall a. Component a => ComponentID -> arr () a
forall (arr :: * -> * -> *) a.
(ArrowDynamicQueryReader arr, Component a) =>
ComponentID -> arr () a
fetchDyn ComponentID
cId arr () a -> arr a (Maybe a) -> arr () (Maybe a)
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (a -> Maybe a) -> arr a (Maybe a)
forall b c. (b -> c) -> arr b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr a -> Maybe a
forall a. a -> Maybe a
Just