import { PDataRepresentable } from "../../../PType/PDataRepresentable.js";
import { PStruct } from "../../../PTypes/PStruct/pstruct.js";
import { StructT, TermType, FromPType, ToPType } from "../../../type_system/index.js";
import { TermFn } from "../../../PTypes/PFn/PFn.js";
import type { Term } from "../../../Term/index.js";
export type MaybeT<T extends TermType> = StructT<{
    Just: {
        val: T;
    };
    Nothing: {};
}, {
    unwrap: TermFn<[PMaybeRawT<ToPType<T>>], ToPType<T>>;
    default: TermFn<[PMaybeRawT<ToPType<T>>, ToPType<T>], ToPType<T>>;
}>;
type PMaybeRawT<PTy extends PDataRepresentable> = PStruct<{
    Just: {
        val: FromPType<PTy>;
    };
    Nothing: {};
}, {}>;
export type PMaybeT<PTy extends PDataRepresentable> = PStruct<{
    Just: {
        val: FromPType<PTy>;
    };
    Nothing: {};
}, {
    unwrap: TermFn<[PMaybeRawT<PTy>], PTy>;
    default: TermFn<[PMaybeRawT<PTy>, PTy], PTy>;
}>;
export declare function PMaybe<T extends TermType>(tyArg: T): PStruct<{
    Just: {
        val: T;
    };
    Nothing: {};
}, {
    unwrap: Term<import("../../../index.js").PLam<PStruct<{
        Just: {
            val: T;
        };
        Nothing: {};
    }, {}>, ToPType<T>>> & {
        $: (input: import("../../index.js").PappArg<PStruct<{
            Just: {
                val: T;
            };
            Nothing: {};
        }, {}>>) => import("../../index.js").UtilityTermOf<ToPType<T>>;
    };
    default: Term<import("../../../index.js").PLam<PStruct<{
        Just: {
            val: T;
        };
        Nothing: {};
    }, {}>, import("../../../index.js").PLam<ToPType<T>, ToPType<T>>>> & {
        $: (input: import("../../index.js").PappArg<PStruct<{
            Just: {
                val: T;
            };
            Nothing: {};
        }, {}>>) => Term<import("../../../index.js").PLam<ToPType<T>, ToPType<T>>> & {
            $: (input: import("../../index.js").PappArg<ToPType<T>>) => import("../../index.js").UtilityTermOf<ToPType<T>>;
        };
    };
}>;
export {};
