travian/src/Queue/TaskProvider.ts

64 lines
1.6 KiB
TypeScript

import { Args } from './Args';
import { uniqId } from '../utils';
import { ResourcesInterface } from '../Core/Resources';
import { ProductionQueue } from '../Core/ProductionQueue';
import { getProductionQueue } from '../Task/TaskMap';
export type TaskId = string;
let idSequence = 1;
let lastTimestamp: number | undefined = undefined;
export function uniqTaskId(): TaskId {
const ts = Math.floor(Date.now() / 1000);
if (ts === lastTimestamp) {
++idSequence;
} else {
idSequence = 1;
}
lastTimestamp = ts;
return 'tid.' + ts + '.' + String(idSequence).padStart(4, '0') + '.' + uniqId('');
}
export class Task {
readonly id: TaskId;
readonly ts: number;
readonly name: string;
readonly args: Args;
constructor(id: TaskId, ts: number, name: string, args: Args) {
this.id = id;
this.ts = ts;
this.name = name;
this.args = args;
}
}
export type TaskList = Array<Task>;
export type ImmutableTaskList = ReadonlyArray<Task>;
export interface TaskProvider {
getTasks(): TaskList;
setTasks(tasks: TaskList): void;
}
export interface TaskMatcher {
(task: Task): boolean;
}
export interface TaskTransformer {
(task: Task): Task;
}
export function isInQueue(queue: ProductionQueue): TaskMatcher {
return (task: Task) => getProductionQueue(task.name) === queue;
}
export function withTime(ts: number): TaskTransformer {
return (task: Task) => new Task(task.id, ts, task.name, task.args);
}
export function withResources(resources: ResourcesInterface): TaskTransformer {
return (task: Task) => new Task(task.id, task.ts, task.name, { ...task.args, resources });
}