From c3b1bf39a4ac8225167cac9a33b3b9315c30a405 Mon Sep 17 00:00:00 2001 From: cannorin Date: Fri, 19 Sep 2025 18:54:12 +0900 Subject: [PATCH] Refactor (1) --- apps/web/package.json | 1 + apps/web/src/lib/global.d.ts | 42 - apps/web/src/lib/index.ts | 17 - .../routes/api/misskey/invite-code/+server.ts | 4 +- .../kripke/components/frame-input.svelte | 4 +- apps/web/src/routes/kripke/lib/store.ts | 2 +- .../routes/kripke/random/[seed]/+page.svelte | 3 +- package.json | 1 + packages/kripke/global.d.ts | 36 - packages/kripke/package.json | 10 +- packages/kripke/parser.ts | 1 + packages/kripke/sat.ts | 220 ++++ packages/kripke/syntax.ts | 225 +++- packages/kripke/tests/sat.test.ts | 30 + packages/kripke/tests/utils.ts | 96 ++ packages/kripke/utils.ts | 25 + packages/utils/biome.json | 3 + packages/utils/index.ts | 1 + packages/utils/package.json | 22 + packages/utils/src/array.ts | 12 + packages/utils/src/headless.ts | 40 + .../lib => packages/utils/src}/multiset.ts | 0 .../lib => packages/utils/src}/vector.ts | 0 packages/utils/tsconfig.json | 12 + turbo.json | 3 + yarn.lock | 979 ++++++++++++++++++ 26 files changed, 1684 insertions(+), 105 deletions(-) delete mode 100644 apps/web/src/lib/index.ts delete mode 100644 packages/kripke/global.d.ts create mode 100644 packages/kripke/sat.ts create mode 100644 packages/kripke/tests/sat.test.ts create mode 100644 packages/kripke/tests/utils.ts create mode 100644 packages/utils/biome.json create mode 100644 packages/utils/index.ts create mode 100644 packages/utils/package.json create mode 100644 packages/utils/src/array.ts create mode 100644 packages/utils/src/headless.ts rename {apps/web/src/routes/kripke/lib => packages/utils/src}/multiset.ts (100%) rename {apps/web/src/routes/kripke/lib => packages/utils/src}/vector.ts (100%) create mode 100644 packages/utils/tsconfig.json diff --git a/apps/web/package.json b/apps/web/package.json index 8253ffc..52d1585 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -44,6 +44,7 @@ }, "dependencies": { "@cannorin/kripke": "workspace:*", + "@cannorin/utils": "workspace:*", "@fontsource/poiret-one": "5.2.6", "@fontsource/zen-kaku-gothic-new": "5.2.5", "@icons-pack/svelte-simple-icons": "4.0.1", diff --git a/apps/web/src/lib/global.d.ts b/apps/web/src/lib/global.d.ts index 4a6eec7..ba3c5ee 100644 --- a/apps/web/src/lib/global.d.ts +++ b/apps/web/src/lib/global.d.ts @@ -1,45 +1,3 @@ -interface String { - concat(string: S): `${this}${S}`; - concat( - s1: S1, - s2: S2, - ): `${this}${S1}${S2}`; - startsWith(searchString: S): this is `${S}${string}`; - endsWith(searchString: S): this is `${string}${S}`; - includes( - searchString: S, - position?: number, - ): this is `${string}${S}${string}`; -} - -type LiteralUnionLike = T extends string - ? T extends "" - ? T - : T extends `${T}${T}` - ? never - : T - : T extends number - ? `${T}0` extends `${number}` - ? T - : never - : T extends null | undefined - ? T - : never; - -interface Array { - includes( - searchElement: T extends LiteralUnionLike ? unknown : never, - fromIndex?: number, - ): searchElement is T extends LiteralUnionLike ? T : never; -} - -interface ReadonlyArray { - includes( - searchElement: T extends LiteralUnionLike ? unknown : never, - fromIndex?: number, - ): searchElement is T extends LiteralUnionLike ? T : never; -} - declare module "*&enhanced" { import type { Picture } from "vite-imagetools"; diff --git a/apps/web/src/lib/index.ts b/apps/web/src/lib/index.ts deleted file mode 100644 index 77eb351..0000000 --- a/apps/web/src/lib/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -export function tryOneOf( - value: T extends LiteralUnionLike ? unknown : never, - consts: readonly T[], -) { - if (consts.includes(value)) return value; - return undefined; -} - -export function sample(arr: T[], n: number = arr.length): T[] { - if (n > arr.length) return sample(arr, arr.length); - const copy = [...arr]; - for (let i = 0; i < n; i++) { - const j = i + Math.floor(Math.random() * (copy.length - i)); - [copy[i], copy[j]] = [copy[j] as T, copy[i] as T]; - } - return copy.slice(0, n); -} diff --git a/apps/web/src/routes/api/misskey/invite-code/+server.ts b/apps/web/src/routes/api/misskey/invite-code/+server.ts index 5b71f02..79c6509 100644 --- a/apps/web/src/routes/api/misskey/invite-code/+server.ts +++ b/apps/web/src/routes/api/misskey/invite-code/+server.ts @@ -1,9 +1,9 @@ +import { sampleMany } from "@cannorin/utils/array"; import { type RequestEvent, text } from "@sveltejs/kit"; import { RateLimiter } from "sveltekit-rate-limiter/server"; import { dev } from "$app/environment"; import { MISSKEY_API_KEY } from "$env/static/private"; -import { sample } from "$lib"; import type { InviteListResponse } from "misskey-js/entities.js"; const limiter = new RateLimiter({ @@ -31,7 +31,7 @@ export async function GET(event: RequestEvent) { }, ); const json = await res.json(); - const invite = sample(json as InviteListResponse).find( + const invite = sampleMany(json as InviteListResponse).find( (x) => !x.createdBy && !x.usedAt, ); if (invite) return text(invite.code); diff --git a/apps/web/src/routes/kripke/components/frame-input.svelte b/apps/web/src/routes/kripke/components/frame-input.svelte index 74fa781..69f164c 100644 --- a/apps/web/src/routes/kripke/components/frame-input.svelte +++ b/apps/web/src/routes/kripke/components/frame-input.svelte @@ -8,7 +8,6 @@ import { right, worlds, } from "@cannorin/kripke"; -import type { SVGAttributes } from "svelte/elements"; import { type Radian, type Vector, @@ -17,7 +16,8 @@ import { rotate, sub, theta, -} from "../lib/vector"; +} from "@cannorin/utils/vector"; +import type { SVGAttributes } from "svelte/elements"; export interface FrameInputProps extends SVGAttributes { frame?: Frame | undefined; diff --git a/apps/web/src/routes/kripke/lib/store.ts b/apps/web/src/routes/kripke/lib/store.ts index a6d72d5..f29d6ce 100644 --- a/apps/web/src/routes/kripke/lib/store.ts +++ b/apps/web/src/routes/kripke/lib/store.ts @@ -1,6 +1,6 @@ +import { MultiSet } from "@cannorin/utils/multiset"; import { persisted } from "svelte-persisted-store"; import type { Move } from "../components/game.svelte"; -import { MultiSet } from "./multiset"; import { date } from "./system"; export type Daily = { diff --git a/apps/web/src/routes/kripke/random/[seed]/+page.svelte b/apps/web/src/routes/kripke/random/[seed]/+page.svelte index f89861e..f3774e0 100644 --- a/apps/web/src/routes/kripke/random/[seed]/+page.svelte +++ b/apps/web/src/routes/kripke/random/[seed]/+page.svelte @@ -1,7 +1,8 @@