rhizome/src/lossy.ts

44 lines
1.5 KiB
TypeScript
Raw Normal View History

2024-12-23 23:30:54 -06:00
// We have the lossless transformation of the delta stream.
// We want to enable transformations from the lossless view,
// into various possible "lossy" views that combine or exclude some information.
//
// We can achieve this via functional expression, encoded as JSON-Logic.
// Fields in the output can be described as transformations
import {CollapsedDelta, Lossless, LosslessViewMany, LosslessViewOne} from "./lossless";
import {DeltaFilter} from "./types";
type Resolver = (losslessView: LosslessViewMany) => unknown;
2024-12-23 23:34:28 -06:00
// Extract a particular value from a delta's pointers
export function valueFromCollapsedDelta(delta: CollapsedDelta, key: string): string | undefined {
2024-12-23 23:30:54 -06:00
const pointers = delta.pointers;
for (const pointer of pointers || []) {
const [[k, value]] = Object.entries(pointer);
if (k === key && typeof value === "string") {
return value;
}
}
}
2024-12-23 23:34:28 -06:00
// Example function for resolving a value for an entity by taking the first value we find
2024-12-23 23:30:54 -06:00
export function firstValueFromLosslessViewOne(ent: LosslessViewOne, key: string): {delta: CollapsedDelta, value: string} | undefined {
for (const delta of ent.properties[key] || []) {
const value = firstValueFromCollapsedDelta(delta, key);
if (value) return {delta, value};
}
}
export class Lossy {
lossless: Lossless;
constructor(lossless: Lossless) {
this.lossless = lossless;
}
resolve(fn: Resolver, deltaFilter?: DeltaFilter) {
return fn(this.lossless.view(deltaFilter));
}
}