import { Fun } from '@typed-f/function';
import * as T from '@typed-f/tagged';
interface FunctorBuilder<MapType> {
    map: MapType;
    /**
     * @desc
     * alias of `map`
     */
    lift: MapType;
    /**
     * @desc
     * alias of `map`
     */
    fmap: MapType;
}
declare type FB<M> = FunctorBuilder<M>;
declare type F1M<Tag extends keyof T.Tag1List<any>, A0> = <R>(f: Fun<[A0], R>) => T.Tag1List<R>[Tag];
declare type F2M<Tag extends keyof T.Tag2List<any, any>, A0, A1> = <R>(f: Fun<[A1], R>) => T.Tag2List<A0, R>[Tag];
declare type F3M<Tag extends keyof T.Tag3List<any, any, any>, A0, A1, A2> = <R>(f: Fun<[A2], R>) => T.Tag3List<A0, A1, R>[Tag];
declare type F4M<Tag extends keyof T.Tag4List<any, any, any, any>, A0, A1, A2, A3> = <R>(f: Fun<[A3], R>) => T.Tag4List<A0, A1, A2, R>[Tag];
export interface Functor1<Tag extends keyof T.Tag1List<any>, A0> extends T.Tagged<Tag>, FB<F1M<Tag, A0>> {
}
export interface Functor2<Tag extends keyof T.Tag2List<any, any>, A0, A1> extends T.Tagged<Tag>, FB<F2M<Tag, A0, A1>> {
}
export interface Functor3<Tag extends keyof T.Tag3List<any, any, any>, A0, A1, A2> extends T.Tagged<Tag>, FB<F3M<Tag, A0, A1, A2>> {
}
export interface Functor4<Tag extends keyof T.Tag4List<any, any, any, any>, A0, A1, A2, A3> extends T.Tagged<Tag>, FB<F4M<Tag, A0, A1, A2, A3>> {
}
export declare namespace Functor {
    function map<V, U>(f: Fun<[V], U>): <Tag extends keyof T.Tag1List<any>>(wa: Functor1<Tag, V>) => T.Tag1List<U>[Tag];
}
export {};
