import { Annotation } from "./util/Lattice"; import { List } from "./BaseTypes"; import { DataValue, ExplValue } from "./DataValue"; import { Env } from "./Env"; import { Expr } from "./Expr"; import { Id, Str } from "./Value"; import Cont = Expr.Cont; declare type MatchPrefix = List>; export declare class Match extends DataValue<"Match"> { tv̅: MatchPrefix; κ: K; } export declare function match(ξ: MatchPrefix, κ: K): Match; export declare abstract class Elim extends DataValue<"Elim"> { apply(tv: ExplValue): [Env, Match]; } export declare abstract class DataElim extends Elim { static is(σ: Elim): σ is DataElim; static join(σ: Elim, τ: Elim): Elim; } export declare function dataElim(...cκ̅: [string, K][]): (k: Id) => Elim; export declare class VarElim extends Elim { x: Str; κ: K; static is(σ: Elim): σ is VarElim; } export declare function varElim(x: Str, κ: K): (k: Id) => VarElim; export declare function apply_fwd(ξ: Match): Annotation; export declare function apply_bwd(ξ: Match, α: Annotation): void; export {};