@typed/fp
Version:
Data Structures and Resources for fp-ts
274 lines (235 loc) • 4.44 kB
text/typescript
/**
* StreamEither is a EitherT of Stream
* @since 0.9.2
*/
import { now } from '@most/core'
import { Applicative2 } from 'fp-ts/Applicative'
import { Apply2 } from 'fp-ts/Apply'
import { Bifunctor2 } from 'fp-ts/Bifunctor'
import { Chain2 } from 'fp-ts/Chain'
import { ChainRec2 } from 'fp-ts/ChainRec'
import * as E from 'fp-ts/Either'
import * as ET from 'fp-ts/EitherT'
import { Functor2 } from 'fp-ts/Functor'
import { Monad2 } from 'fp-ts/Monad'
import { Pointed2 } from 'fp-ts/Pointed'
import { Semigroup } from 'fp-ts/Semigroup'
import { flow, pipe } from './function'
import { swapEithers } from './internal'
import { MonadRec2 } from './MonadRec'
import * as S from './Stream'
/**
* @since 0.9.2
* @category Model
*/
export interface StreamEither<E, A> extends S.Stream<E.Either<E, A>> {}
/**
* @since 0.9.2
* @category Combinator
*/
export const alt = ET.alt(S.Monad)
/**
* @since 0.9.2
* @category Typecalss Constructor
*/
export const altValidation = <A>(semigroup: Semigroup<A>) => ET.altValidation(S.Monad, semigroup)
/**
* @since 0.9.2
* @category Combinator
*/
export const ap = ET.ap(S.Apply)
/**
* @since 0.9.2
* @category Combinator
*/
export const bimap = ET.bimap(S.Functor)
/**
* @since 0.9.2
* @category Combinator
*/
export const bracket = ET.bracket(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const chain = ET.chain(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const getOrElse = ET.getOrElse(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const getOrElseE = ET.getOrElseE(S.Monad)
/**
* @since 0.9.2
* @category Constructor
*/
export const left = ET.left(S.Monad)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromStreamL = ET.leftF(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const map = ET.map(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const mapLeft = ET.mapLeft(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const match = ET.match(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const matchE = ET.matchE(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const orElse = ET.orElse(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const orElseFirst = ET.orElseFirst(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const orLeft = ET.orLeft(S.Monad)
/**
* @since 0.9.2
* @category Constructor
*/
export const right = ET.right(S.Monad)
/**
* @since 0.9.2
* @category Constructor
*/
export const fromStream = ET.rightF(S.Monad)
/**
* @since 0.9.2
* @category Combinator
*/
export const swap = ET.swap(S.Functor)
/**
* @since 0.9.2
* @category Combinator
*/
export const toUnion = ET.toUnion(S.Functor)
/**
* @since 0.9.2
* @category URI
*/
export const URI = '@typed/fp/StreamEither'
/**
* @since 0.9.2
* @category URI
*/
export type URI = typeof URI
declare module 'fp-ts/HKT' {
export interface URItoKind2<E, A> {
[URI]: StreamEither<E, A>
}
}
declare module './HKT' {
export interface URItoVariance {
[URI]: V<E, Covariant>
}
}
/**
* @since 0.9.2
* @category Constructor
*/
export const of = flow(E.right, now)
/**
* @since 0.9.2
* @category Instance
*/
export const Pointed: Pointed2<URI> = {
of,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Functor: Functor2<URI> = {
map,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Bifunctor: Bifunctor2<URI> = {
bimap,
mapLeft,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Apply: Apply2<URI> = {
...Functor,
ap,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Applicative: Applicative2<URI> = {
...Apply,
...Pointed,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Chain: Chain2<URI> = {
...Functor,
chain,
}
/**
* @since 0.9.2
* @category Instance
*/
export const Monad: Monad2<URI> = {
...Chain,
...Pointed,
}
/**
* @since 0.9.2
* @category Combinator
*/
export const chainRec =
<A, E, B>(f: (value: A) => StreamEither<E, E.Either<A, B>>) =>
(a: A): StreamEither<E, B> =>
pipe(
a,
S.chainRec((x) => pipe(x, f, S.map(swapEithers))),
)
/**
* @since 0.9.2
* @category Instance
*/
export const ChainRec: ChainRec2<URI> = {
chainRec,
}
/**
* @since 0.9.2
* @category Instance
*/
export const MonadRec: MonadRec2<URI> = {
...Monad,
chainRec,
}