import * as Event from "./Event" import { EventStream } from "./EventStream" import { HKT, Observable } from "./Observable" import { Property } from "./Property" export type In = HKT & Observable export type Out = ObsType extends Property ? Property : ObsType extends EventStream ? EventStream : Observable export type JSMap = Map export type JSSet = Set export type Projection = (val: A) => B export type Predicate = (val: A) => boolean export type Accum = (state: S, value: T) => S export type FlatAccum = (state: S, value: T) => S | Observable export type Dispose = () => void export type AnyEvent = Event.Next | Event.Error | Event.End export type AnyObs = Property | EventStream export type Handler = (event: AnyEvent) => typeof Event.noMore | any export type ValueHandler = (val: T) => typeof Event.noMore | any export type ValuesHandler = (...vals: T[]) => typeof Event.noMore | any export type ErrorHandler = (err: Error) => typeof Event.noMore | any export type EndHandler = () => void export type SinkEvent = T | AnyEvent | Array> export type SinkResult = typeof Event.noMore | typeof Event.more export type Sink = (event: SinkEvent) => SinkResult export type Subscribe = (sink: Sink) => Dispose | any export type AsyncCallback = (callback: (result: T | AnyEvent) => void) => void export type AsyncNodeCallback = ( callback: (error: Error | null, result?: T | AnyEvent) => void, ) => void