/** * Adapter is based on [@most/adapter](https://github.com/mostjs/adapter), and adds * some fp-ts instances. * @since 0.9.2 */ import * as MA from '@most/adapter' import * as M from '@most/core' import { Stream } from '@most/types' import { flow, pipe } from 'fp-ts/function' import { Functor2 } from 'fp-ts/Functor' import { Predicate } from 'fp-ts/Predicate' import { Profunctor2 } from 'fp-ts/Profunctor' import { Refinement } from 'fp-ts/Refinement' /** * @since 0.9.2 * @category URI */ export const URI = '@most/adapter' /** * @since 0.9.2 * @category URI */ export type URI = typeof URI declare module 'fp-ts/HKT' { export interface URItoKind2 { [URI]: Adapter } } /** * @since 0.9.2 * @category Model */ export type Adapter = readonly [...MA.Adapter] /** * Apply a stream transformation to an Adapter * @since 0.9.2 * @category Combinator */ export const adapt = (f: (stream: Stream) => Stream) => ([send, stream]: Adapter): Adapter => [send, M.multicast(f(stream))] /** * @since 0.9.2 * @category Constructor */ export function create(): Adapter export function create(f: (stream: Stream) => Stream): Adapter export function create(f?: (stream: Stream) => Stream) { const [send, stream] = MA.createAdapter() return [send, f ? f(stream) : stream] as const } /** * @since 0.9.2 * @category Combinator */ export function local(f: (value: A) => B) { return ([send, stream]: Adapter): Adapter => [flow(f, send), stream] } /** * @since 0.9.2 * @category Combinator */ export function map(f: (value: A) => B): (adapter: Adapter) => Adapter { return adapt(M.map(f)) } /** * @since 0.9.2 * @category Combinator */ export const promap = (f: (value: B) => A, g: (value: C) => D) => (adapter: Adapter): Adapter => pipe(adapter, local(f), map(g)) /** * @since 0.9.2 * @category Combinator */ export function filter( f: Refinement, ): (adapter: Adapter) => Adapter export function filter(f: Predicate): (adapter: Adapter) => Adapter export function filter(f: Predicate): (adapter: Adapter) => Adapter { return adapt(M.filter(f)) } /** * @since 0.9.2 * @category Instance */ export const Functor: Functor2 = { map, } /** * @since 0.9.2 * @category Instance */ export const Profunctor: Profunctor2 = { ...Functor, promap, }