packages feed

aztecs-0.13.0: src/Aztecs/ECS/Queryable/R.hs

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

module Aztecs.ECS.Queryable.R where

import Aztecs.ECS.HSet
import Aztecs.ECS.Query (Query (..))
import Aztecs.ECS.Queryable
import Aztecs.ECS.Queryable.Internal
import Control.Monad.Primitive
import qualified Data.SparseSet.Strict.Mutable as MS
import Prelude hiding (Read, lookup)

newtype R a = R {unR :: a}
  deriving (Show, Eq, Functor)

instance (PrimMonad m, Lookup a cs) => Queryable cs m (R a) where
  type QueryableAccess (R a) = '[Read a]
  queryable cs _ = Query $ do
    !as <- MS.toList $ lookup cs
    let go (_, c) = R c
    return $ map (fmap go) as
  {-# INLINE queryable #-}