/**
 * @startuml
 * enum Maybe<T> <<(U, white)>> {
 * }
 *
 * struct Some<T> {
 * }
 * struct None<T> {
 * }
 *
 * Maybe <|-- Some
 * Maybe <|-- None
 * @enduml
 */
export interface Maybe<Just> {
    map: <NewJust>(m: (just: Just) => NewJust) => Maybe<NewJust>;
    match: <Some, None>(onSome: (just: Just) => Some, onNone: () => None) => Some | None;
}
interface Some<Just> extends Maybe<Just> {
    just: Just;
    map: <NewJust>(m: (just: Just) => NewJust) => Some<NewJust>;
    match: <Some, None>(onSome: (just: Just) => Some, onNone: () => None) => Some;
}
interface None<Just> extends Maybe<Just> {
    map: <NewJust>(m: (just: Just) => NewJust) => None<NewJust>;
    match: <Some, None>(onSome: (just: Just) => Some, onNone: () => None) => None;
}
export declare function isSome<Just>(maybe: Maybe<Just>): maybe is Some<Just>;
export declare function isNone<Just>(maybe: Maybe<Just>): maybe is None<Just>;
export declare function some<Just>(just: Just): Some<Just>;
export declare function none<Just>(): None<Just>;
export {};
