import { Observable as ObservableT, Subscription } from './index' import Observable from './observable' type transformFn = (value: T) => U /** * Creates an observable that maps each value from the source via a function. * * {@link map} takes a source `Observable` and calls `transform(T)` for every emitted value. The returned * `Observable` will emit the returned values from `transform`. If transform is not callable, and is instead `U` * then the raw value is simply used instead. * * @example Marble diagram of mapping an obversable * * // transform t: x => x * 2 * // source s: |--1--2--3--4--| * // map(t, s): |--2--4--6--8--| * * @param {ObservableT} source the source observable * @param {U | transformFn} transform the function to transform items * * @returns {ObservableT} Transformed observable */ export default function map( source: ObservableT, transform: U | transformFn ): ObservableT { return new Observable( ({ complete, error, next }): Subscription => { return source.subscribe({ complete, error, next: (value): void => next( typeof transform === 'function' ? (transform as transformFn)(value) : transform ) }) } ) }