---
# System prepended metadata

title: scheduler

---

# scheduler


```typescript=
export class Schedule {
    ordered_systems: GroupSystemsPair[]
}
```


```typescript=
import { World } from "vang"
import { Order, Group, UpdateGroup } from "vang/groups";

type Updateable = {
    update(world:World): any;
}


type SystemRef = Updateable & { system: System };
function create_system_ref(system: System) {
    return {
        update: system,
        system
    }
}


const GROUP_INFO_KEY = Symbol("groupinfo")

type GroupInfo = {
    order: GroupOrder;
}

abstract class Group implements Updateable {
    readonly members: Updateable[];
    
    public update(world: World) {
        for(let i = 0; i < this.members.length; i++) {
            this.members.update[i];
        }
    }
}

@Order({ after: UpdateGroup })
export class FixedUpdateGroup extends Group {
    private accumulator: number = 0;
    
    public update(world: World) {
        accumulator += world.resource(Time).dt;
        
        // running fixed timestep catch-up 
        while (accumulator >= fixedTimeStep) {
        
            // update every member in the group
            super.update(world)
            
            // next step
            accumulator -= fixedTimeStep;
        }
    }
}

@Order({ after: UpdateGroup })
export class UpdateGroup extends Group {}

@Order({ priority: 999999999999, in: UpdateGroup })
export class VeryLateGroup extends Group {}


export function example_system2 {
    for(const [p,v] of query(Pos, Vel)) {

    }
}

```

```typescript=

type GroupPair = [name: "UpdateTestGroup", order: { after: UpdateGroup }];

WorldBuilder
    .groups(...groups: Group | string | GroupPair)
    
WorldBuilder
    .systems(...params: [string, ...systems: Systems] | ...systems: Systems)

WorldBuilder
    .resources(...resources: (Resource | ResourceInstance)[])
    
WorldBuilder
    .plugins(...plugins: Plugin[])
    
WorldBuilder
    .with(options: Partial<WorldOptions>)

WorldBuilder
    .done() -> World
    

```

```typescript=


export class MyCustomGroup extends Group {}


public enum VangGroups = {
    Start = "start-group",
    End = "end-group"
}

const MyFixedStage = new FixedUpdateStage({
    rate: 0.016,
    systems: [test_system23, my_system11]
});


World.build()
    .systems(Groups.Update, test_system, my_system)
    .group_after(Groups.Update, VangGroups.End, new MyCustomGroup(
        test_system23, my_system11
    ))
    .group_after(Groups.Update, "test", MyFixedStage)
    .group_before(Groups.Update, VangGroups.Start)
    .systems(VangGroups.Start, ok_system, net_system)
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

```

## plugin dependency
need to figure out dependency between plugins??

## example goal
### client
```typescript=
import { World, query } from "vang";
import { Vang3DPlugin } from "@vang/std/3d"

const world = World.build()
    .systems(move_system)
    .plugins(Vang3DPlugin)
    .done();

await world.init();

function loop() {
    world.update();
    requestAnimation(loop)
}

requestAnimation(loop);

```
### server
```typescript=
import { World, query } from "vang";
import { Vang3DPlugin } from "@vang/std/3d"

const world = World.build()
    .systems(move_system)
    .plugins(Vang3DPlugin)
    .done();

await world.init();

function loop() {
    world.update();
    requestAnimation(loop)
}

requestAnimation(loop);

```