{-# LANGUAGE FunctionalDependencies #-}

module Aztecs.ECS.System.Dynamic.Reader.Class (ArrowDynamicReaderSystem (..)) where

import Aztecs.ECS.Component (ComponentID)
import Aztecs.ECS.World.Archetypes (Node)
import Control.Arrow (Arrow (..), (>>>))
import Data.Set (Set)

class (Arrow arr) => ArrowDynamicReaderSystem q arr | arr -> q where
  allDyn :: Set ComponentID -> q i o -> arr i [o]

  filterDyn :: Set ComponentID -> q i o -> (Node -> Bool) -> arr i [o]

  singleDyn :: Set ComponentID -> q () a -> arr () a
  singleDyn Set ComponentID
cIds q () a
q =
    Set ComponentID -> q () a -> arr () [a]
forall i o. Set ComponentID -> q i o -> arr i [o]
forall (q :: * -> * -> *) (arr :: * -> * -> *) i o.
ArrowDynamicReaderSystem q arr =>
Set ComponentID -> q i o -> arr i [o]
allDyn Set ComponentID
cIds q () a
q
      arr () [a] -> arr [a] a -> arr () 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"
        )