import * as E from 'fp-ts/Either' import { Lazy, pipe } from 'fp-ts/function' import * as O from 'fp-ts/Option' import * as RE from 'fp-ts/ReaderEither' import * as $S from './struct' export const pick = () => (k: K) => RE.asks((r: Pick) => r[k]) export const picks = () => ( k: K, f: (r: Pick[K]) => RE.ReaderEither, E, B>, ) => picksW()(k, f) export const picksW = () => ( k: K, f: (r: Pick[K]) => RE.ReaderEither, ) => pipe(pick()(k), RE.chainW(f)) export const picksOptionK = () => (onNone: Lazy) => (k: K, f: (r: Pick[K]) => O.Option) => picks()(k, RE.fromOptionK(onNone)(f)) export const picksEitherK = () => (k: K, f: (r: Pick[K]) => E.Either<_E, B>) => picks()(k, RE.fromEitherK(f))