Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Aztecs.ECS.Scheduler.Internal
Contents
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 #
Methods
buildSchedule :: HSet (SchedulerInput m s) -> SchedulerOutput m s Source #
Instances
(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 # | |||||||||
Defined in Aztecs.ECS.Scheduler.Internal Associated Types
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) |
data ConstrainedSystem Source #
Constructors
ConstrainedSystem Type [Type] |
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 #
type family AddNode sys (graph :: DependencyGraph) :: DependencyGraph where ... Source #
type family AddEdge from to (graph :: DependencyGraph) :: DependencyGraph where ... Source #
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 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 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 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 #
Methods
buildScheduleLevels :: HSet systems -> HSet (LevelsToNestedHSet (ScheduleLevels m levels)) Source #
Instances
ScheduleLevelsBuilder m ('[] :: [[Type]]) systems Source # | |
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 # | |
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 # | |
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 # | |
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 # | |
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
SystemReorderer originalSystems ('[] :: [Type]) Source # | |
Defined in Aztecs.ECS.Scheduler.Internal | |
(ExtractFromHSet targetSys originalSystems, SystemReorderer (RemainingAfterExtract targetSys originalSystems) restTargets) => SystemReorderer originalSystems (targetSys ': restTargets) Source # | |
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
RemainingAfterExtract sys (Run constraints sys ': rest) ~ rest => ExtractFromHSet sys (Run constraints sys ': rest) Source # | |
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 # | |
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 # | |
Defined in Aztecs.ECS.Scheduler.Internal Methods extractFromHSet :: HSet (other ': rest) -> (targetSys, HSet (RemainingAfterExtract targetSys (other ': rest))) Source # |