{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FunctionalDependencies #-}

module Aztecs.ECS.System.Reader.Class (ArrowReaderSystem (..)) where

import Aztecs.ECS.Query.Reader (QueryFilter (..))
import Control.Arrow (Arrow (..), (>>>))
import Prelude hiding (all, any, filter, id, lookup, map, mapM, reads, (.))

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

  -- | Query all matching entities with a `QueryFilter`.
  filter :: q () a -> QueryFilter -> arr () [a]

  -- | Query a single matching entity.
  -- If there are zero or multiple matching entities, an error will be thrown.
  single :: q i a -> arr i a
  single q i a
q =
    q i a -> arr i [a]
forall i a. q i a -> arr i [a]
forall (q :: * -> * -> *) (arr :: * -> * -> *) i a.
ArrowReaderSystem q arr =>
q i a -> arr i [a]
all q i a
q
      arr i [a] -> arr [a] a -> arr i a
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> ([a] -> a) -> arr [a] a
forall b c. (b -> c) -> arr b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr
        ( \[a]
as -> case [a]
as of
            [a
a] -> a
a
            [a]
_ -> [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"TODO"
        )