import { composeDesc, Desc, EventStreamSeed, isAtomSeed, isEventStreamSeed, isPropertySeed, MethodDesc, PropertySeed, Scope, } from "./abstractions" import { applyScopeMaybe } from "./applyscope" import { changes } from "./changes" import { AtomSeedImpl } from "./atom" import { PropertySeedImpl } from "./property" import { UnaryTransformOp, UnaryTransformOpScoped } from "./transform" import { rename } from "./util" export type EventStreamDelay = ( stream: EventStreamSeed ) => EventStreamSeed export function transformChanges( methodCallDesc: MethodDesc, transformer: EventStreamDelay ): UnaryTransformOp export function transformChanges( methodCallDesc: MethodDesc, transformer: EventStreamDelay, scope: Scope ): UnaryTransformOpScoped export function transformChanges( methodCallDesc: MethodDesc, transformer: EventStreamDelay, scope?: Scope ): any { return (x: any) => { const desc = composeDesc(x, methodCallDesc) let r if (isEventStreamSeed(x)) { r = rename(desc, transformer(x)) } else if (isAtomSeed(x)) { const source = x.consume() r = new AtomSeedImpl( desc, () => source.get(), (onValue, onEnd) => { return transformer(changes(source)) .consume() .subscribe(onValue, onEnd) }, source.set ) } else if (isPropertySeed(x)) { const source = x.consume() r = new PropertySeedImpl( desc, () => source.get(), (onValue, onEnd) => { return transformer(changes(source)) .consume() .subscribe(onValue, onEnd) } ) } else { throw Error("Unknown observable " + x) } return applyScopeMaybe(r, scope) } }