module Aztecs.ECS.Query.Reader.Class (ArrowQueryReader (..)) where

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

-- | Arrow for queries that can read from entities.
class (Arrow arr) => ArrowQueryReader arr where
  -- | Fetch a `Component` by its type.
  fetch :: (Component a) => arr () a

  -- | Fetch a `Component` by its type, returning `Nothing` if it doesn't exist.
  fetchMaybe :: (Component a) => arr () (Maybe a)
  fetchMaybe = arr () a
forall a. Component a => arr () a
forall (arr :: * -> * -> *) a.
(ArrowQueryReader arr, Component a) =>
arr () a
fetch 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