UNPKG

mudb

Version:

Real-time database for multiplayer games

62 lines (61 loc) 2.46 kB
import { MuSchema } from '../schema/schema'; export interface MuRDATypes<RDA extends MuRDA<any, any, any, any>> { stateSchema: RDA['stateSchema']; state: this['stateSchema']['identity']; actionSchema: RDA['actionSchema']; action: this['actionSchema']['identity']; serializedStoreSchema: RDA['storeSchema']; serializedStore: this['serializedStoreSchema']['identity']; store: RDA['emptyStore']; meta: RDA['actionMeta']; dispatcher: RDA['action']; } export interface MuRDA<StateSchema extends MuSchema<any>, ActionSchema extends MuSchema<any>, StoreSchema extends MuSchema<any>, Meta extends MuRDABindableActionMeta> { readonly stateSchema: StateSchema; readonly actionSchema: ActionSchema; readonly storeSchema: StoreSchema; readonly emptyStore: MuRDAStore<this>; createStore(initialState: StateSchema['identity']): this['emptyStore']; parse(inp: StoreSchema['identity']): this['emptyStore']; actionMeta: Meta; action: any; } export interface MuRDAStore<RDA extends MuRDA<any, any, any, any>> { state(rda: RDA, out: MuRDATypes<RDA>['state']): MuRDATypes<RDA>['state']; apply(rda: RDA, action: MuRDATypes<RDA>['action']): boolean; inverse(rda: RDA, action: MuRDATypes<RDA>['action']): MuRDATypes<RDA>['action']; serialize(rda: RDA, out: MuRDATypes<RDA>['serializedStore']): MuRDATypes<RDA>['serializedStore']; free(rda: RDA): any; } export declare type MuRDAActionMeta = { type: 'unit'; } | { type: 'partial'; action: MuRDAActionMeta; } | { type: 'table'; table: { [id: string]: MuRDAActionMeta; }; }; export declare type MuRDAAction<Action, Meta extends MuRDAActionMeta> = Meta extends { type: 'unit'; } ? (...args: any[]) => Action : Meta extends { type: 'partial'; action: MuRDAActionMeta; } ? (...args: any[]) => MuRDAAction<Action, Meta['action']> : Meta extends { type: 'table'; table: { [id: string]: MuRDAActionMeta; }; } ? { [id in keyof Meta['table']]: MuRDAAction<Action, Meta['table'][id]>; } : never; export declare type MuRDABindableActionMeta = { type: 'store'; action: MuRDAActionMeta; } | MuRDAActionMeta; export declare type MuRDABindableAction<Action, Meta extends MuRDABindableActionMeta> = Meta extends { type: 'store'; action: MuRDAActionMeta; } ? (store: any) => MuRDAAction<Action, Meta['action']> : Meta extends MuRDAActionMeta ? MuRDAAction<Action, Meta> : never;