/** * The `Align` type class extends the `Semialign` type class with a value `nil`, which * acts as a unit in regards to `align`. * * `Align` instances must satisfy the following laws in addition to the `Semialign` laws: * * 1. Right identity: `F.align(fa, nil) = F.map(fa, this_)` * 2. Left identity: `F.align(nil, fa) = F.map(fa, that)` * * Adapted from http://hackage.haskell.org/package/these-0.8/docs/Data-Align.html * * @since 0.1.0 */ import { HKT, Kind, Kind2, Kind3, URIS, URIS2, URIS3 } from 'fp-ts/lib/HKT' import { Semigroup } from 'fp-ts/lib/Semigroup' import { Option } from 'fp-ts/lib/Option' import { Semialign, Semialign1, Semialign2, Semialign2C, Semialign3 } from '../Semialign' /** * @since 0.1.0 */ export interface Align extends Semialign { readonly nil: () => HKT } /** * @since 0.1.0 */ export interface Align1 extends Semialign1 { readonly nil: () => Kind } /** * @since 0.1.0 */ export interface Align2 extends Semialign2 { readonly nil: () => Kind2 } /** * @since 0.1.0 */ export interface Align2C extends Semialign2C { readonly nil: () => Kind2 } /** * @since 0.1.0 */ export interface Align3 extends Semialign3 { readonly nil: () => Kind3 } /** * Align two structures, using a semigroup for combining values. * * @example * import { semigroupSum } from 'fp-ts/Semigroup' * import { salign } from 'fp-ts-contrib/Align' * import { alignArray } from 'fp-ts-contrib/Align/Array' * * assert.deepStrictEqual(salign(alignArray, semigroupSum)([1, 2, 3], [4, 5]), [5, 7, 3]) * * @since 0.1.0 */ export declare function salign( F: Align3, S: Semigroup ): (fx: Kind3, fy: Kind3) => Kind3 export declare function salign( F: Align2, S: Semigroup ): (fx: Kind2, fy: Kind2) => Kind2 export declare function salign( F: Align2C, S: Semigroup ): (fx: Kind2, fy: Kind2) => Kind2 export declare function salign( F: Align1, S: Semigroup ): (fx: Kind, fy: Kind) => Kind export declare function salign(F: Align, S: Semigroup): (fx: HKT, fy: HKT) => HKT /** * Align two structures, using `none` to fill blanks. * * It is similar to `zip`, but it doesn't discard elements. * * @example * import { some, none } from 'fp-ts/Option' * import { padZip } from 'fp-ts-contrib/Align' * import { alignArray } from 'fp-ts-contrib/Align/Array' * * assert.deepStrictEqual(padZip(alignArray)([1, 2, 3], [4, 5]), [[some(1), some(4)], [some(2), some(5)], [some(3), none]]) * * @since 0.1.0 */ export declare function padZip( F: Align3 ): (fa: Kind3, fb: Kind3) => Kind3, Option]> export declare function padZip( F: Align2 ): (fa: Kind2, fb: Kind2) => Kind2, Option]> export declare function padZip( F: Align2C ): (fa: Kind2, fb: Kind2) => Kind2, Option]> export declare function padZip( F: Align1 ): (fa: Kind, fb: Kind) => Kind, Option]> export declare function padZip(F: Align): (fa: HKT, fb: HKT) => HKT, Option]> /** * Align two structures by applying a function to each pair of aligned elements, using `none` to fill blanks. * * It is similar to `zipWith`, but it doesn't discard elements. * * @example * import { Option, fold, getOrElse } from 'fp-ts/Option' * import { padZipWith } from 'fp-ts-contrib/Align' * import { alignArray } from 'fp-ts-contrib/Align/Array' * import { pipe } from 'fp-ts/function' * * const f = (ma: Option, mb: Option) => * pipe( * ma, * fold(() => '*', a => a.toString()) * ) + * pipe( * mb, * getOrElse(() => '#') * ) * * assert.deepStrictEqual(padZipWith(alignArray)([1, 2], ['a'], f), ['1a', '2#']) * assert.deepStrictEqual(padZipWith(alignArray)([1], ['a', 'b'], f), ['1a', '*b']) * * @since 0.1.0 */ export declare function padZipWith( F: Align3 ): ( fa: Kind3, fb: Kind3, f: (a: Option, b: Option) => C ) => Kind3 export declare function padZipWith( F: Align2 ): (fa: Kind2, fb: Kind2, f: (a: Option, b: Option) => C) => Kind2 export declare function padZipWith( F: Align2C ): (fa: Kind2, fb: Kind2, f: (a: Option, b: Option) => C) => Kind2 export declare function padZipWith( F: Align1 ): (fa: Kind, fb: Kind, f: (a: Option, b: Option) => C) => Kind export declare function padZipWith( F: Align ): (fa: HKT, fb: HKT, f: (a: Option, b: Option) => C) => HKT