packages feed

aztecs-0.13.0: src/Aztecs/ECS/Query.hs

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE UndecidableInstances #-}

module Aztecs.ECS.Query where

import Data.Maybe
import Prelude hiding (Read)

newtype Query m a = Query {unQuery :: m [Maybe a]}
  deriving (Functor)

instance (Monad m) => Applicative (Query m) where
  pure x = Query $ return [Just x]
  {-# INLINE pure #-}
  Query f <*> Query x = Query $ do
    fs <- f
    zipWith (<*>) fs <$> x
  {-# INLINE (<*>) #-}

runQuery :: (Monad m) => Query m a -> m [a]
runQuery (Query q) = catMaybes <$> q
{-# INLINE runQuery #-}