import { checkFunction } from "../_check" import { FlatAccum } from "../_interfaces" import { toObs } from "../_interrop" import { curry3, pipe } from "../_util" import { Observable } from "../Observable" import { Property } from "../Property" import { doAction } from "./do" import { flatMapConcat } from "./flatMap" import { toPropertyWith } from "./toProperty" export const flatScan: CurriedFlatScan = curry3(_flatScan) export interface CurriedFlatScan { ( seed: StateType, acc: FlatAccum, observable: Observable, ): Property (seed: StateType, acc: FlatAccum): ( observable: Observable, ) => Property (seed: StateType): ( acc: FlatAccum, observable: Observable, ) => Property (seed: StateType): ( acc: FlatAccum, ) => (observable: Observable) => Property } function _flatScan(seed: S, acc: FlatAccum, observable: Observable): Property { checkFunction(acc) let s = seed // prettier-ignore return pipe(observable, flatMapConcat(x => doAction(a => s = a, toObs>(acc(s, x)))), toPropertyWith(seed) ) }