aztecs-0.14.0: A modular game engine and Entity-Component-System (ECS) for Haskell.
Safe HaskellSafe-Inferred
LanguageHaskell2010

Aztecs.ECS.Scheduler.Internal

Documentation

class Scheduler (m :: k) (s :: k1) where Source #

Associated Types

type SchedulerInput (m :: k) (s :: k1) :: [Type] Source #

type SchedulerOutput (m :: k) (s :: k1) Source #

Instances

Instances details
(AllSystems m systems, BuildSystemGraph systems ~ graph, TopologicalSort graph ~ levels, ScheduleLevels m levels ~ output, ScheduleLevelsBuilder m levels systems) => Scheduler (m :: Type -> Type) (HSet systems :: Type) Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Associated Types

type SchedulerInput (m :: Type -> Type) (HSet systems :: Type) 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

type SchedulerInput (m :: Type -> Type) (HSet systems :: Type) = systems
type SchedulerOutput (m :: Type -> Type) (HSet systems :: Type) 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

buildSchedule :: HSet (SchedulerInput m (HSet systems)) -> SchedulerOutput m (HSet systems) Source #

type family BuildSystemGraph (systems :: [Type]) :: DependencyGraph where ... Source #

Equations

BuildSystemGraph ('[] :: [Type]) = 'EmptyGraph 
BuildSystemGraph (runSys ': rest) = AddSystemToGraph (UnwrapSystem runSys) (GetConstraints runSys) (BuildSystemGraph rest) 

type family BuildDependencyGraph (constrainedSystems :: [ConstrainedSystem]) :: DependencyGraph where ... Source #

Equations

BuildDependencyGraph ('[] :: [ConstrainedSystem]) = 'EmptyGraph 
BuildDependencyGraph ('ConstrainedSystem sys constraints ': rest) = AddSystemToGraph sys constraints (BuildDependencyGraph rest) 

type family AddSystemToGraph sys (constraints :: [Type]) (graph :: DependencyGraph) :: DependencyGraph where ... Source #

Equations

AddSystemToGraph sys ('[] :: [Type]) graph = AddNode sys graph 
AddSystemToGraph sys (Before target ': rest) graph = AddSystemToGraph sys rest (AddEdge sys (UnwrapSystem target) graph) 
AddSystemToGraph sys (After source ': rest) graph = AddSystemToGraph sys rest (AddEdge (UnwrapSystem source) sys graph) 
AddSystemToGraph sys (other ': rest) graph = AddSystemToGraph sys rest graph 

data DependencyGraph Source #

Constructors

EmptyGraph 
Graph [Type] [(Type, Type)] [Type] 

type family AddNode sys (graph :: DependencyGraph) :: DependencyGraph where ... Source #

Equations

AddNode sys 'EmptyGraph = 'Graph '[sys] ('[] :: [(Type, Type)]) ('[] :: [Type]) 
AddNode sys ('Graph nodes edges groups) = 'Graph (AddToList sys nodes) edges groups 

type family AddEdge from to (graph :: DependencyGraph) :: DependencyGraph where ... Source #

Equations

AddEdge from to 'EmptyGraph = 'Graph '[from, to] '['(from, to)] ('[] :: [Type]) 
AddEdge from to ('Graph nodes edges groups) = 'Graph (AddToList to (AddToList from nodes)) (AddToList '(from, to) edges) groups 

type family AddGroupConstraint sys (graph :: DependencyGraph) :: DependencyGraph where ... Source #

Equations

AddGroupConstraint sys 'EmptyGraph = 'Graph '[sys] ('[] :: [(Type, Type)]) '[sys] 
AddGroupConstraint sys ('Graph nodes edges groups) = 'Graph (AddToList sys nodes) edges (AddToList sys groups) 

type family AddToList (item :: k) (list :: [k]) :: [k] where ... Source #

Equations

AddToList (item :: k) ('[] :: [k]) = '[item] 
AddToList (item :: a) (item ': rest :: [a]) = item ': rest 
AddToList (item :: k) (other ': rest :: [k]) = other ': AddToList item rest 

type family TopologicalSort (graph :: DependencyGraph) :: [[Type]] where ... Source #

Equations

TopologicalSort 'EmptyGraph = '[] :: [[Type]] 
TopologicalSort ('Graph nodes edges groups) = TopSortHelper nodes edges ('[] :: [[Type]]) 

type family TopSortHelper (nodes :: [Type]) (edges :: [(Type, Type)]) (result :: [[Type]]) :: [[Type]] where ... Source #

Equations

TopSortHelper ('[] :: [Type]) edges result = Reverse result 
TopSortHelper nodes edges result = TopSortHelper (RemoveNodes (NoIncomingEdges nodes edges) nodes) (RemoveEdgesFrom (NoIncomingEdges nodes edges) edges) (NoIncomingEdges nodes edges ': result) 

type family NoIncomingEdges (nodes :: [Type]) (edges :: [(Type, Type)]) :: [Type] where ... Source #

Equations

NoIncomingEdges ('[] :: [Type]) edges = '[] :: [Type] 
NoIncomingEdges (node ': rest) edges = If (HasIncomingEdge node edges) (NoIncomingEdges rest edges) (node ': NoIncomingEdges rest edges) 

type family HasIncomingEdge node (edges :: [(Type, Type)]) :: Bool where ... Source #

Equations

HasIncomingEdge node ('[] :: [(Type, Type)]) = 'False 
HasIncomingEdge node ('(from, to) ': rest) = If (TypeEq node to) 'True (HasIncomingEdge node rest) 

type family RemoveNodes (toRemove :: [Type]) (nodes :: [Type]) :: [Type] where ... Source #

Equations

RemoveNodes ('[] :: [Type]) nodes = nodes 
RemoveNodes (remove ': rest) nodes = RemoveNodes rest (FilterOut remove nodes) 

type family FilterOut item (list :: [Type]) :: [Type] where ... Source #

Equations

FilterOut item ('[] :: [Type]) = '[] :: [Type] 
FilterOut item (item ': rest) = FilterOut item rest 
FilterOut item (other ': rest) = other ': FilterOut item rest 

type family RemoveEdgesFrom (removed :: [Type]) (edges :: [(Type, Type)]) :: [(Type, Type)] where ... Source #

Equations

RemoveEdgesFrom ('[] :: [Type]) edges = edges 
RemoveEdgesFrom (node ': rest) edges = RemoveEdgesFrom rest (FilterOutEdgesFrom node edges) 

type family FilterOutEdgesFrom node (edges :: [(Type, Type)]) :: [(Type, Type)] where ... Source #

Equations

FilterOutEdgesFrom node ('[] :: [(Type, Type)]) = '[] :: [(Type, Type)] 
FilterOutEdgesFrom node ('(from, to) ': rest) = If (TypeEq node from) (FilterOutEdgesFrom node rest) ('(from, to) ': FilterOutEdgesFrom node rest) 

type family TypeEq a b :: Bool where ... Source #

Equations

TypeEq a a = 'True 
TypeEq a b = 'False 

type family Reverse (list :: [k]) :: [k] where ... Source #

Equations

Reverse (list :: [k]) = ReverseHelper list ('[] :: [k]) 

type family ReverseHelper (list :: [k]) (acc :: [k]) :: [k] where ... Source #

Equations

ReverseHelper ('[] :: [k]) (acc :: [k]) = acc 
ReverseHelper (x ': xs :: [a]) (acc :: [a]) = ReverseHelper xs (x ': acc) 

type family ScheduleLevels (m :: Type -> Type) (levels :: [[Type]]) :: [[Type]] where ... Source #

Equations

ScheduleLevels m ('[] :: [[Type]]) = '[] :: [[Type]] 
ScheduleLevels m (level ': rest) = GroupByConflicts m level ': ScheduleLevels m rest 

type family GroupByConflicts (m :: Type -> Type) (systems :: [Type]) :: [Type] where ... Source #

Equations

GroupByConflicts m ('[] :: [Type]) = '[] :: [Type] 
GroupByConflicts m '[sys] = '[sys] 
GroupByConflicts m systems = systems 

scheduleSystemLevels :: forall (m :: Type -> Type) (levels :: [[Type]]) (systems :: [Type]). (AllSystems m systems, ScheduleLevelsBuilder m levels systems) => HSet systems -> HSet (LevelsToNestedHSet (ScheduleLevels m levels)) Source #

type family LevelsToNestedHSet (levels :: [[Type]]) :: [Type] where ... Source #

Equations

LevelsToNestedHSet ('[] :: [[Type]]) = '[] :: [Type] 
LevelsToNestedHSet (level ': rest) = HSet level ': LevelsToNestedHSet rest 

class ScheduleLevelsBuilder (m :: Type -> Type) (levels :: [[Type]]) (systems :: [Type]) where Source #

Instances

Instances details
ScheduleLevelsBuilder m ('[] :: [[Type]]) systems Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

buildScheduleLevels :: HSet systems -> HSet (LevelsToNestedHSet (ScheduleLevels m ('[] :: [[Type]]))) Source #

(SystemReorderer originalSystems levelSystems, GroupByConflicts m levelSystems ~ levelSystems) => ScheduleLevelsBuilder m '[levelSystems] originalSystems Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

buildScheduleLevels :: HSet originalSystems -> HSet (LevelsToNestedHSet (ScheduleLevels m '[levelSystems])) Source #

(SystemReorderer originalSystems levelSystems, GroupByConflicts m levelSystems ~ levelSystems, ScheduleLevelsBuilder m restLevels originalSystems) => ScheduleLevelsBuilder m (levelSystems ': restLevels) originalSystems Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

buildScheduleLevels :: HSet originalSystems -> HSet (LevelsToNestedHSet (ScheduleLevels m (levelSystems ': restLevels))) Source #

(SystemReorderer originalSystems levelSystems1, SystemReorderer originalSystems levelSystems2, GroupByConflicts m levelSystems1 ~ levelSystems1, GroupByConflicts m levelSystems2 ~ levelSystems2) => ScheduleLevelsBuilder m '[levelSystems1, levelSystems2] originalSystems Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

buildScheduleLevels :: HSet originalSystems -> HSet (LevelsToNestedHSet (ScheduleLevels m '[levelSystems1, levelSystems2])) Source #

GroupByConflicts m systems ~ systems => ScheduleLevelsBuilder m '[systems] systems Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

buildScheduleLevels :: HSet systems -> HSet (LevelsToNestedHSet (ScheduleLevels m '[systems])) Source #

class SystemReorderer (originalSystems :: [Type]) (targetSystems :: [Type]) where Source #

Methods

reorderSystems :: HSet originalSystems -> HSet targetSystems Source #

Instances

Instances details
SystemReorderer originalSystems ('[] :: [Type]) Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

reorderSystems :: HSet originalSystems -> HSet ('[] :: [Type]) Source #

(ExtractFromHSet targetSys originalSystems, SystemReorderer (RemainingAfterExtract targetSys originalSystems) restTargets) => SystemReorderer originalSystems (targetSys ': restTargets) Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

reorderSystems :: HSet originalSystems -> HSet (targetSys ': restTargets) Source #

type family RemainingAfterExtract targetSys (systems :: [Type]) :: [Type] where ... Source #

Equations

RemainingAfterExtract sys (sys ': rest) = rest 
RemainingAfterExtract sys (Run constraints sys ': rest) = rest 
RemainingAfterExtract targetSys (other ': rest) = other ': RemainingAfterExtract targetSys rest 

class ExtractFromHSet targetSys (systems :: [Type]) where Source #

Methods

extractFromHSet :: HSet systems -> (targetSys, HSet (RemainingAfterExtract targetSys systems)) Source #

Instances

Instances details
RemainingAfterExtract sys (Run constraints sys ': rest) ~ rest => ExtractFromHSet sys (Run constraints sys ': rest) Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

extractFromHSet :: HSet (Run constraints sys ': rest) -> (sys, HSet (RemainingAfterExtract sys (Run constraints sys ': rest))) Source #

ExtractFromHSet sys (sys ': rest) Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

extractFromHSet :: HSet (sys ': rest) -> (sys, HSet (RemainingAfterExtract sys (sys ': rest))) Source #

(ExtractFromHSet targetSys rest, RemainingAfterExtract targetSys (other ': rest) ~ (other ': RemainingAfterExtract targetSys rest), TypeEq targetSys other ~ 'False) => ExtractFromHSet targetSys (other ': rest) Source # 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

Methods

extractFromHSet :: HSet (other ': rest) -> (targetSys, HSet (RemainingAfterExtract targetSys (other ': rest))) Source #

Orphan instances

(Applicative m, ECS m) => Access m (HSet ('[] :: [Type])) Source # 
Instance details

Associated Types

type AccessType (HSet ('[] :: [Type])) 
Instance details

Defined in Aztecs.ECS.Scheduler.Internal

type AccessType (HSet ('[] :: [Type])) = '[] :: [Type]

Methods

access :: m (HSet ('[] :: [Type])) Source #

(Monad m, Execute' m (HSet level), Execute m (HSet restLevels)) => Execute m (HSet (HSet level ': restLevels)) Source # 
Instance details

Methods

execute :: HSet (HSet level ': restLevels) -> ExecutorT m () Source #