import * as P from "@principia/prelude";
import * as HKT from "@principia/prelude/HKT";
import type { Option, URI, V } from "./model";
/**
* ```haskell
* ap_ :: Apply f => (f (a -> b), f a) -> f b
* ```
*
* Apply a function to an argument under a type constructor
*
* @category Apply
* @since 1.0.0
*/
export declare const ap_: (fab: Option<(a: A) => B>, fa: Option) => Option;
/**
* ```haskell
* ap :: Apply f => f a -> f (a -> b) -> f b
* ```
*
* Apply a function to an argument under a type constructor
*
* @category Apply
* @since 1.0.0
*/
export declare const ap: (fa: Option) => (fab: Option<(a: A) => B>) => Option;
export declare const apFirst_: (fa: Option, fb: Option) => Option;
export declare const apFirst: (fb: Option) => (fa: Option) => Option;
export declare const apSecond_: (fa: Option, fb: Option) => Option;
export declare const apSecond: (fb: Option) => (fa: Option) => Option;
/**
* ```haskell
* mapBoth_ :: Apply f => (f a, f b, ((a, b) -> c)) -> f c
* ```
*
* Applies both `Maybe`s and if both are `Some`, maps their results with function `f`, otherwise returns `Nothing`
*
* @category Apply
* @since 1.0.0
*/
export declare const mapBoth_: (fa: Option, fb: Option, f: (a: A, b: B) => C) => Option;
/**
* ```haskell
* mapBoth :: Apply f => (f b, ((a, b) -> c)) -> f a -> f c
* ```
*
* Applies both `Maybe`s and if both are `Some`, maps their results with function `f`, otherwise returns `Nothing`
*
* @category Apply
* @since 1.0.0
*/
export declare const mapBoth: (fb: Option, f: (a: A, b: B) => C) => (fa: Option) => Option;
/**
* ```haskell
* liftA2 :: Apply f => (a -> b -> c) -> f a -> f b -> f c
* ```
*
* Lifts a binary function to actions
*
* @category Apply
* @since 1.0.0
*/
export declare const liftA2: (f: (a: A) => (b: B) => C) => (fa: Option) => (fb: Option) => Option;
/**
* ```haskell
* apS :: (Apply f, Nominal n) =>
* (n n3, f c)
* -> f ({ n1: a, n2: b, ... })
* -> f ({ n1: a, n2: b, n3: c })
* ```
*
* A pipeable version of `sequenceS`
*
* @category Apply
* @since 1.0.0
*/
export declare const apS: (
name: Exclude,
fb: Option
) => (fa: Option) => Option<{ [K in N | keyof A]: K extends keyof A ? A[K] : B }>;
export declare const Apply: P.Apply<[URI], V>;
export declare const sequenceS: P.SequenceSFn<["Option"], HKT.Auto>;
export declare const sequenceT: P.SequenceTFn<["Option"], HKT.Auto>;
export declare const mapN: P.MapNFn<["Option"], HKT.Auto>;
//# sourceMappingURL=apply.d.ts.map