{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}

module Aztecs.ECS.System where

import Aztecs.ECS.Access.Internal
import Aztecs.ECS.Class

class System m sys where
  type SystemIn m sys

  runSystem :: sys -> SystemIn m sys -> m ()

system ::
  ( ECS m,
    Monad m,
    System (Task m) sys,
    Access m (SystemIn (Task m) sys)
  ) =>
  sys ->
  m ()
system :: forall (m :: * -> *) sys.
(ECS m, Monad m, System (Task m) sys,
 Access m (SystemIn (Task m) sys)) =>
sys -> m ()
system sys
sys = m (SystemIn (Task m) sys)
forall (m :: * -> *) a. Access m a => m a
access m (SystemIn (Task m) sys)
-> (SystemIn (Task m) sys -> m ()) -> m ()
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Task m () -> m ()
forall a. Task m a -> m a
forall (m :: * -> *) a. ECS m => Task m a -> m a
task (Task m () -> m ())
-> (SystemIn (Task m) sys -> Task m ())
-> SystemIn (Task m) sys
-> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. sys -> SystemIn (Task m) sys -> Task m ()
forall (m :: * -> *) sys.
System m sys =>
sys -> SystemIn m sys -> m ()
runSystem sys
sys
{-# INLINE system #-}