package main


import "core:slice"

StateVariant :: union{^Game, ^Menu, ^Pause, ^GameOver, ^Winning}


GameState :: struct {
	update: proc(state: ^GameState, delta: f32),
	draw: proc(state: ^GameState),
	free: proc(state: ^GameState),
	previous: ^GameState,
	
	variant: StateVariant
}

new_state :: proc($T: typeid) -> ^T {
	state := new(T)
	state.variant = state
	return state
}

state_stack : [dynamic]^GameState



stack_push :: proc(state: ^GameState) -> (bool) {
	append(&state_stack, state)
	return true
}

stack_pop :: proc() -> (bool) {
	if len(state_stack) == 0 {
		return false
	}
	state := pop(&state_stack)
	state->free()
	return true
}

stack_top :: proc() -> ^GameState {
	return state_stack[len(state_stack)-1]
}
