packages feed

aztecs-0.7.0: src/Aztecs/ECS/Schedule/Access.hs

{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Aztecs.ECS.Schedule.Access (AcessSchedule (..), ArrowAccessSchedule (..)) where

import Aztecs.ECS.Access (AccessT (..))
import Aztecs.ECS.Schedule (ArrowAccessSchedule (..))
import Aztecs.ECS.World.Bundle (Bundle)
import Control.Arrow (Arrow (..))
import Control.Category (Category (..))
import Control.Monad ((>=>))

newtype AcessSchedule m i o = AcessSchedule {runAcessSchedule :: i -> AccessT m o}
  deriving (Functor)

instance (Monad m) => Category (AcessSchedule m) where
  id = AcessSchedule return
  AcessSchedule f . AcessSchedule g = AcessSchedule (g >=> f)

instance (Monad m) => Arrow (AcessSchedule m) where
  arr f = AcessSchedule $ \i -> return $ f i
  first (AcessSchedule f) = AcessSchedule $ \(b, d) -> do
    c <- f b
    return (c, d)

instance (Monad m) => ArrowAccessSchedule Bundle (AccessT m) (AcessSchedule m) where
  access = AcessSchedule