ts-hashlife
Version:
Efficient TypeScript implementation of HashLife, an optimized algorithm for simulating Conway's Game of Life with memoization and quadtree-based compression.
108 lines (107 loc) • 3.96 kB
TypeScript
export declare class TreeNode {
nw: TreeNode | null;
ne: TreeNode | null;
sw: TreeNode | null;
se: TreeNode | null;
id: number;
level: number;
population: number;
cache: TreeNode | null;
quick_cache: TreeNode | null;
hashmap_next: TreeNode | undefined;
constructor(nw: TreeNode | null, ne: TreeNode | null, sw: TreeNode | null, se: TreeNode | null, id: number, level?: number, population?: number);
}
export declare class LifeUniverse {
last_id: number;
hashmap_size: number;
max_load: number;
hashmap: (TreeNode | undefined)[];
empty_tree_cache: TreeNode[];
level2_cache: (TreeNode | undefined)[];
_powers: Float64Array;
_bitcounts: Int8Array;
rule_b: number;
rule_s: number;
root: TreeNode | null;
rewind_state: TreeNode | null;
false_leaf: TreeNode;
true_leaf: TreeNode;
private _step;
private _generation;
constructor();
get step(): number;
set step(value: number);
get generation(): number;
set generation(value: number);
pow2(x: number): number;
save_rewind_state(): void;
restore_rewind_state(): void;
eval_mask(bitmask: number): number;
level1_create(bitmask: number): TreeNode;
set_bit(x: number, y: number, living: boolean): void;
get_bit(x: number, y: number): boolean;
get_root_bounds(): {
top: number;
left: number;
bottom: number;
right: number;
};
empty_tree(level: number): TreeNode;
expand_universe(node: TreeNode): TreeNode;
uncache(also_quick: boolean): void;
in_hashmap(n: TreeNode): boolean;
hashmap_insert(n: TreeNode): void;
create_tree(nw: TreeNode, ne: TreeNode, sw: TreeNode, se: TreeNode): TreeNode;
next_generation(is_single: boolean): void;
garbage_collect(): void;
calc_hash(nw_id: number, ne_id: number, sw_id: number, se_id: number): number;
clear_pattern(): void;
get_bounds(field_x: Int32Array | number[], field_y: Int32Array | number[]): {
top: number;
left: number;
bottom: number;
right: number;
};
get_level_from_bounds(bounds: {
x?: number;
y?: number;
left?: number;
top?: number;
bottom?: number;
right?: number;
}): number;
make_center(field_x: Int32Array | number[], field_y: Int32Array | number[], bounds: {
left: number;
right: number;
top: number;
bottom: number;
}): void;
move_field(field_x: Int32Array | number[], field_y: Int32Array | number[], offset_x: number, offset_y: number): void;
setup_field(field_x: Int32Array | number[], field_y: Int32Array | number[], bounds?: {
left: number;
right: number;
top: number;
bottom: number;
}): void;
partition(start: number, end: number, test_field: Int32Array | number[], other_field: Int32Array | number[], offset: number): number;
setup_field_recurse(start: number, end: number, field_x: Int32Array | number[], field_y: Int32Array | number[], level: number): TreeNode;
level2_setup(start: number, end: number, field_x: Int32Array | number[], field_y: Int32Array | number[]): TreeNode;
set_step(step: number): void;
set_rules(s: number, b: number): void;
node_set_bit(node: TreeNode, x: number, y: number, living: boolean): TreeNode;
node_get_bit(node: TreeNode, x: number, y: number): boolean;
node_get_field(node: TreeNode, left: number, top: number, field: {
x: number;
y: number;
}[]): void;
node_level2_next(node: TreeNode): TreeNode;
node_next_generation(node: TreeNode): TreeNode;
node_quick_next_generation(node: TreeNode): TreeNode;
node_hash(node: TreeNode): void;
node_get_boundary(node: TreeNode, left: number, top: number, find_mask: number, boundary: {
top: number;
left: number;
bottom: number;
right: number;
}): void;
}