[wip] kefir cleanup

This commit is contained in:
2025-08-29 23:50:23 -04:00
parent 90be478e9a
commit 5e33e33cce
10 changed files with 2310 additions and 308 deletions

View File

@@ -2,11 +2,11 @@ import * as renaissance from "./renaissance";
import simple from "./simple";
export type Game<
C extends { game: string },
S,
A,
E extends { error: any },
V
C extends { game: string } = { game: string },
S = unknown,
A extends { humanKey: string } = { humanKey: string },
E extends { error: any } = { error: any },
V = unknown
> = {
title: string;
rules: string;
@@ -16,10 +16,10 @@ export type Game<
resolveQuit: (p: { config: C; state: S; humanKey: string }) => S;
};
const games = {
export const GAMES = {
// renaissance,
simple,
} satisfies { [key: string]: Game<any, any, any, any, any> };
export default games;
export default GAMES;
export type GameId = keyof typeof games;
export type GameKey = keyof typeof GAMES;

29
pkg/shared/kefir.ts Normal file
View File

@@ -0,0 +1,29 @@
import { merge, Observable } from "kefir";
export const transform = <
T,
Mutations extends [Observable<any, any>, (prev: T, evt: any) => T][]
>(
initValue: T,
...mutations: Mutations
): Observable<T, unknown> =>
merge(
mutations.map(([source, mutation]) =>
source.map((event) => ({ event, mutation }))
)
).scan((prev, { event, mutation }) => mutation(prev, event), initValue);
export const partition =
<C extends readonly [...string[]], T, E>(
classes: C,
partitionFn: (v: T) => C[number]
) =>
(obs: Observable<T, E>) => {
const assigned = obs.map((obj) => ({ obj, cls: partitionFn(obj) }));
return Object.fromEntries(
classes.map((C) => [
C,
assigned.filter(({ cls }) => cls == C).map(({ obj }) => obj),
])
);
};

View File

@@ -2,6 +2,10 @@
"name": "@games/shared",
"version": "1.0.0",
"dependencies": {
"kefir": "^3.8.8",
"object-hash": "^3.0.0"
},
"devDependencies": {
"@types/kefir": "^3.8.11"
}
}