Planner class
          #include <core/ecs/system/planner.hpp>
        
        Layer on top of Schedule, used to build them with added abstractions such as tags.
Public types
- struct TagId
 - Local identifier for tags.
 
Public functions
- void clear()
 - Resets the planner to its initial state.
 - auto add() -> TagId
 - Adds a new unnamed tag to the planner.
 - auto add(std::string name) -> TagId
 - Adds a new named tag to the planner.
 - auto add(std::string name, SystemId systemId) -> TagId
 - Adds a new system to the planner.
 - void remove(TagId tagId)
 - Removes a tag from the planner and any constraints related to it.
 - auto tag(TagId childId, TagId parentId) -> bool
 - Makes the given tag a child of the the given tag.
 - void order(TagId beforeId, TagId afterId)
 - Specifies that the given tag must run before another tag.
 - void onlyIf(TagId tagId, ConditionId conditionId)
 - Specifies that systems within the given tag should only run if the given condition evaluates to true.
 - auto repeatWhile(TagId tagId, ConditionId conditionId) -> bool
 - Specifies that the given tag is a repeating tag. Can only be specified once per tag.
 - 
              auto build() const -> memory::
Opt<Schedule>  - Constructs a new schedule from the constraints specified until now.
 
Function documentation
              bool cubos:: core:: ecs:: Planner:: tag(TagId childId,
              TagId parentId)
            
            Makes the given tag a child of the the given tag.
| Parameters | |
|---|---|
| childId | Child tag identifier. | 
| parentId | Parent tag identifier. | 
| Returns | Whether the operation was successful. | 
Essentially makes the child inherit all constraints of the parent. Tags may have multiple parents, but only one of them must be a repeated tag.
Returns false if the tag identified by parentId is a leaf tag (i.e., created through add(SystemId)).
              void cubos:: core:: ecs:: Planner:: onlyIf(TagId tagId,
              ConditionId conditionId)
            
            Specifies that systems within the given tag should only run if the given condition evaluates to true.
| Parameters | |
|---|---|
| tagId | Tag identifier. | 
| conditionId | Condition identifier. | 
The condition itself inherits all of the constraints of the tag.
              bool cubos:: core:: ecs:: Planner:: repeatWhile(TagId tagId,
              ConditionId conditionId)
            
            Specifies that the given tag is a repeating tag. Can only be specified once per tag.
| Parameters | |
|---|---|
| tagId | Tag identifier. | 
| conditionId | Condition identifier. | 
| Returns | Whether the operation was successful. | 
Returns false if the given tag was already a repeating tag.
              memory:: Opt<Schedule> cubos:: core:: ecs:: Planner:: build() const
            
            Constructs a new schedule from the constraints specified until now.
| Returns | Schedule, or nothing if the constraints couldn't be fulfilled. | 
|---|