diff options
| author | srdusr <trevorgray@srdusr.com> | 2025-08-30 19:22:59 +0200 |
|---|---|---|
| committer | srdusr <trevorgray@srdusr.com> | 2025-08-30 19:22:59 +0200 |
| commit | 19120d4f9761c67d99ed1ce3da6084b83f5a49c9 (patch) | |
| tree | f234cad1bdad88114a63c9702144da487024967a /.config/ags/lib/option.ts | |
| parent | 5928998af5404ae2be84c6cecc10ebf84bd3f3ed (diff) | |
| download | dotfiles-19120d4f9761c67d99ed1ce3da6084b83f5a49c9.tar.gz dotfiles-19120d4f9761c67d99ed1ce3da6084b83f5a49c9.zip | |
Linux-specific dotfiles
Diffstat (limited to '.config/ags/lib/option.ts')
| -rw-r--r-- | .config/ags/lib/option.ts | 115 |
1 files changed, 0 insertions, 115 deletions
diff --git a/.config/ags/lib/option.ts b/.config/ags/lib/option.ts deleted file mode 100644 index 2d73978..0000000 --- a/.config/ags/lib/option.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { Variable } from "resource:///com/github/Aylur/ags/variable.js" - -type OptProps = { - persistent?: boolean -} - -export class Opt<T = unknown> extends Variable<T> { - static { Service.register(this) } - - constructor(initial: T, { persistent = false }: OptProps = {}) { - super(initial) - this.initial = initial - this.persistent = persistent - } - - initial: T - id = "" - persistent: boolean - toString() { return `${this.value}` } - toJSON() { return `opt:${this.value}` } - - getValue = (): T => { - return super.getValue() - } - - init(cacheFile: string) { - const cacheV = JSON.parse(Utils.readFile(cacheFile) || "{}")[this.id] - if (cacheV !== undefined) - this.value = cacheV - - this.connect("changed", () => { - const cache = JSON.parse(Utils.readFile(cacheFile) || "{}") - cache[this.id] = this.value - Utils.writeFileSync(JSON.stringify(cache, null, 2), cacheFile) - }) - } - - reset() { - if (this.persistent) - return - - if (JSON.stringify(this.value) !== JSON.stringify(this.initial)) { - this.value = this.initial - return this.id - } - } -} - -export const opt = <T>(initial: T, opts?: OptProps) => new Opt(initial, opts) - -function getOptions(object: object, path = ""): Opt[] { - return Object.keys(object).flatMap(key => { - const obj: Opt = object[key] - const id = path ? path + "." + key : key - - if (obj instanceof Variable) { - obj.id = id - return obj - } - - if (typeof obj === "object") - return getOptions(obj, id) - - return [] - }) -} - -export function mkOptions<T extends object>(cacheFile: string, object: T) { - for (const opt of getOptions(object)) - opt.init(cacheFile) - - Utils.ensureDirectory(cacheFile.split("/").slice(0, -1).join("/")) - - const configFile = `${TMP}/config.json` - const values = getOptions(object).reduce((obj, { id, value }) => ({ [id]: value, ...obj }), {}) - Utils.writeFileSync(JSON.stringify(values, null, 2), configFile) - Utils.monitorFile(configFile, () => { - const cache = JSON.parse(Utils.readFile(configFile) || "{}") - for (const opt of getOptions(object)) { - if (JSON.stringify(cache[opt.id]) !== JSON.stringify(opt.value)) - opt.value = cache[opt.id] - } - }) - - function sleep(ms = 0) { - return new Promise(r => setTimeout(r, ms)) - } - - async function reset( - [opt, ...list] = getOptions(object), - id = opt?.reset(), - ): Promise<Array<string>> { - if (!opt) - return sleep().then(() => []) - - return id - ? [id, ...(await sleep(50).then(() => reset(list)))] - : await sleep().then(() => reset(list)) - } - - return Object.assign(object, { - configFile, - array: () => getOptions(object), - async reset() { - return (await reset()).join("\n") - }, - handler(deps: string[], callback: () => void) { - for (const opt of getOptions(object)) { - if (deps.some(i => opt.id.startsWith(i))) - opt.connect("changed", callback) - } - }, - }) -} - |
