{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}

module Aztecs.ECS.Query where

import Data.Maybe

newtype Query a = Query {forall a. Query a -> [Maybe a]
unQuery :: [Maybe a]}
  deriving ((forall a b. (a -> b) -> Query a -> Query b)
-> (forall a b. a -> Query b -> Query a) -> Functor Query
forall a b. a -> Query b -> Query a
forall a b. (a -> b) -> Query a -> Query b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Query a -> Query b
fmap :: forall a b. (a -> b) -> Query a -> Query b
$c<$ :: forall a b. a -> Query b -> Query a
<$ :: forall a b. a -> Query b -> Query a
Functor, (forall m. Monoid m => Query m -> m)
-> (forall m a. Monoid m => (a -> m) -> Query a -> m)
-> (forall m a. Monoid m => (a -> m) -> Query a -> m)
-> (forall a b. (a -> b -> b) -> b -> Query a -> b)
-> (forall a b. (a -> b -> b) -> b -> Query a -> b)
-> (forall b a. (b -> a -> b) -> b -> Query a -> b)
-> (forall b a. (b -> a -> b) -> b -> Query a -> b)
-> (forall a. (a -> a -> a) -> Query a -> a)
-> (forall a. (a -> a -> a) -> Query a -> a)
-> (forall a. Query a -> [a])
-> (forall a. Query a -> Bool)
-> (forall a. Query a -> Int)
-> (forall a. Eq a => a -> Query a -> Bool)
-> (forall a. Ord a => Query a -> a)
-> (forall a. Ord a => Query a -> a)
-> (forall a. Num a => Query a -> a)
-> (forall a. Num a => Query a -> a)
-> Foldable Query
forall a. Eq a => a -> Query a -> Bool
forall a. Num a => Query a -> a
forall a. Ord a => Query a -> a
forall m. Monoid m => Query m -> m
forall a. Query a -> Bool
forall a. Query a -> Int
forall a. Query a -> [a]
forall a. (a -> a -> a) -> Query a -> a
forall m a. Monoid m => (a -> m) -> Query a -> m
forall b a. (b -> a -> b) -> b -> Query a -> b
forall a b. (a -> b -> b) -> b -> Query a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall m. Monoid m => Query m -> m
fold :: forall m. Monoid m => Query m -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> Query a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Query a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> Query a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> Query a -> m
$cfoldr :: forall a b. (a -> b -> b) -> b -> Query a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Query a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> Query a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Query a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> Query a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Query a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> Query a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> Query a -> b
$cfoldr1 :: forall a. (a -> a -> a) -> Query a -> a
foldr1 :: forall a. (a -> a -> a) -> Query a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> Query a -> a
foldl1 :: forall a. (a -> a -> a) -> Query a -> a
$ctoList :: forall a. Query a -> [a]
toList :: forall a. Query a -> [a]
$cnull :: forall a. Query a -> Bool
null :: forall a. Query a -> Bool
$clength :: forall a. Query a -> Int
length :: forall a. Query a -> Int
$celem :: forall a. Eq a => a -> Query a -> Bool
elem :: forall a. Eq a => a -> Query a -> Bool
$cmaximum :: forall a. Ord a => Query a -> a
maximum :: forall a. Ord a => Query a -> a
$cminimum :: forall a. Ord a => Query a -> a
minimum :: forall a. Ord a => Query a -> a
$csum :: forall a. Num a => Query a -> a
sum :: forall a. Num a => Query a -> a
$cproduct :: forall a. Num a => Query a -> a
product :: forall a. Num a => Query a -> a
Foldable)

instance Applicative Query where
  pure :: forall a. a -> Query a
pure a
x = [Maybe a] -> Query a
forall a. [Maybe a] -> Query a
Query [a -> Maybe a
forall a. a -> Maybe a
Just a
x]
  {-# INLINE pure #-}
  Query [Maybe (a -> b)]
f <*> :: forall a b. Query (a -> b) -> Query a -> Query b
<*> Query [Maybe a]
x = [Maybe b] -> Query b
forall a. [Maybe a] -> Query a
Query ([Maybe b] -> Query b) -> [Maybe b] -> Query b
forall a b. (a -> b) -> a -> b
$ (Maybe (a -> b) -> Maybe a -> Maybe b)
-> [Maybe (a -> b)] -> [Maybe a] -> [Maybe b]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Maybe (a -> b) -> Maybe a -> Maybe b
forall a b. Maybe (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>) [Maybe (a -> b)]
f [Maybe a]
x
  {-# INLINE (<*>) #-}

runQuery :: Query a -> [a]
runQuery :: forall a. Query a -> [a]
runQuery (Query [Maybe a]
q) = [Maybe a] -> [a]
forall a. [Maybe a] -> [a]
catMaybes [Maybe a]
q
{-# INLINE runQuery #-}