export const ChunkPatchSym = Symbol.for("@Differ.Chunk.Patch") export type ChunkPatchSym = typeof ChunkPatchSym export const ChunkPatchValueSym = Symbol.for("@Differ.Chunk.Patch.Value") export type ChunkPatchValueSym = typeof ChunkPatchValueSym export const ChunkPatchPatchSym = Symbol.for("@Differ.Chunk.Patch.Patch") export type ChunkPatchPatchSym = typeof ChunkPatchPatchSym /** * A patch which describes updates to a chunk of values. * * @tsplus type Differ.Chunk.Patch */ export interface ChunkPatch { readonly [ChunkPatchSym]: ChunkPatchSym readonly [ChunkPatchValueSym]: (_: Value) => Value readonly [ChunkPatchPatchSym]: (_: Patch) => Patch } /** * @tsplus type Differ.Chunk.Patch.Ops */ export interface ChunkPatchOps { readonly $: ChunkPatchAspects } /** * @tsplus static Differ.Ops Chunk */ export const ChunkPatch: ChunkPatchOps = { $: {} } /** * @tsplus type Differ.Chunk.Patch.Aspects */ export interface ChunkPatchAspects {} /** * @tsplus unify Differ.Chunk.Patch */ export function unifyChunkPatch>(self: X): ChunkPatch< [X] extends [{ [ChunkPatchValueSym]: (_: infer Value) => infer Value }] ? Value : never, [X] extends [{ [ChunkPatchPatchSym]: (_: infer Patch) => infer Patch }] ? Patch : never > { return self } export abstract class BaseChunkPatch implements ChunkPatch { readonly [ChunkPatchSym]: ChunkPatchSym = ChunkPatchSym readonly [ChunkPatchValueSym]!: (_: Value) => Value readonly [ChunkPatchPatchSym]!: (_: Patch) => Patch } export class AppendChunkPatch extends BaseChunkPatch { readonly _tag = "Append" constructor(readonly values: Chunk) { super() } } export class SliceChunkPatch extends BaseChunkPatch { readonly _tag = "Slice" constructor(readonly from: number, readonly until: number) { super() } } export class UpdateChunkPatch extends BaseChunkPatch { readonly _tag = "Update" constructor(readonly index: number, readonly patch: Patch) { super() } } export class AndThenChunkPatch extends BaseChunkPatch { readonly _tag = "AndThen" constructor(readonly first: ChunkPatch, readonly second: ChunkPatch) { super() } } export class EmptyChunkPatch extends BaseChunkPatch { readonly _tag = "Empty" } export type ChunkPatchInstruction = | AppendChunkPatch | SliceChunkPatch | UpdateChunkPatch | AndThenChunkPatch | EmptyChunkPatch /** * @tsplus macro identity */ export function chunkPatchInstruction( self: ChunkPatch ): ChunkPatchInstruction { // @ts-expect-error return self }