# Language.Reflection

data ArithTy : Type
  ATInt : IntTy -> ArithTy
  ATDouble : ArithTy
data Binder : (tmTy : Type) -> Type

  Types annotations for bound variables in different
  binding contexts

  tmTy

    the terms that can occur inside the binder, as type
    annotations or bound values

  Lam : (ty : a) -> Binder a

    Lambdas

    ty

      the type of the argument

  Pi : (ty : a) -> (kind : a) -> Binder a

    Function types.

    kind

      The kind of arrow. Only relevant when dealing with
      uniqueness, so you can usually pretend that this
      field doesn't exist. For ordinary functions, use the
      type of types here.

  Let : (ty : a) -> (val : a) -> Binder a

    A let binder

    ty

      the type of the bound variable

    val

      the bound value

  Hole : (ty : a) -> Binder a

    A hole that can occur during elaboration, and must be filled

    ty

      the type of the value that will eventually be put into the hole

  GHole : (ty : a) -> Binder a

    A hole that will later become a top-level metavariable

  Guess : (ty : a) -> (val : a) -> Binder a

    A hole with a solution in it. Computationally inert.

    ty

      the type of the value in the hole

    val

      the value in the hole

  PVar : (ty : a) -> Binder a

    A pattern variable. These bindings surround the terms that make
    up the left and right sides of pattern-matching definition
    clauses.

    ty

      the type of the pattern variable

  PVTy : (ty : a) -> Binder a

    The type of a pattern binding. This is to `PVar` as `Pi` is to
    `Lam`.

    ty

      the type of the pattern variable

data Const : Type

  Primitive constants

  I : Int -> Const
  BI : Integer -> Const
  Fl : Double -> Const
  Ch : Char -> Const
  Str : String -> Const
  B8 : Bits8 -> Const
  B16 : Bits16 -> Const
  B32 : Bits32 -> Const
  B64 : Bits64 -> Const
  AType : ArithTy -> Const
  StrType : Const
  VoidType : Const
  Forgot : Const
  WorldType : Const
  TheWorld : Const
data ErrorReportPart : Type

  Error reports are a list of report parts

  TextPart : String -> ErrorReportPart

    A human-readable string

  NamePart : TTName -> ErrorReportPart

    An Idris name (to be semantically coloured)

  TermPart : TT -> ErrorReportPart

    An Idris term, to be pretty printed

  RawPart : Raw -> ErrorReportPart

    A Raw term to be displayed by the compiler

  SubReport : List ErrorReportPart -> ErrorReportPart

    An indented sub-report, to provide more details

FileLoc : (filename : String) -> (start : (Int, Int)) -> (end : (Int, Int)) -> SourceLocation

  Either a source span or a source location. `start` and `end`
  will be the same if it's a point location.

  filename

    The file name of the source location

  start

    The line and column of the beginning of the source span

  end

    The line and column of the end of the source span

data IntTy : Type
  ITFixed : NativeTy -> IntTy
  ITNative : IntTy
  ITBig : IntTy
  ITChar : IntTy
data NameType : Type

  Types of named references

  Bound : NameType

    A reference which is just bound, e.g. by intro

  Ref : NameType

    A reference to a de Bruijn-indexed variable

  DCon : Int -> Int -> NameType

    Data constructor with tag and number

  TCon : Int -> Int -> NameType

    Type constructor with tag and number

data NativeTy : Type
  IT8 : NativeTy
  IT16 : NativeTy
  IT32 : NativeTy
  IT64 : NativeTy
interface Quotable

  Things with a canonical representation as a reflected term.

  This interface is intended to be used during proof automation and the
  construction of custom tactics.

  quotedTy : Quotable a t => t

    A representation of the type `a`.

    This is to enable quoting polymorphic datatypes

  quote : Quotable a t => a -> t

    Quote a particular element of `a`.

    Each equation should look something like `quote (Foo x y) = `(Foo ~(quote x) ~(quote y))`

data Raw : Type

  Raw terms without types

  Var : TTName -> Raw

    Variables, global or local

  RBind : TTName -> Binder Raw -> Raw -> Raw

    Bind a variable

  RApp : Raw -> Raw -> Raw

    Application

  RType : Raw

    The type of types

  RUType : Universe -> Raw

    Alternative universes for dealing with uniqueness

  RConstant : Const -> Raw

    Embed a constant

interface ReflConst
  toConst : ReflConst a => a -> Const
record SourceLocation

  A source location in an Idris file

  FileLoc : (filename : String) -> (start : (Int, Int)) -> (end : (Int, Int)) -> SourceLocation

    Either a source span or a source location. `start` and `end`
    will be the same if it's a point location.

    filename

      The file name of the source location

    start

      The line and column of the beginning of the source span

    end

      The line and column of the end of the source span

  filename : (rec : SourceLocation) -> String

    The file name of the source location

  start : (rec : SourceLocation) -> (Int, Int)

    The line and column of the beginning of the source span

  end : (rec : SourceLocation) -> (Int, Int)

    The line and column of the end of the source span

data SpecialName : Type
  WhereN : Int -> TTName -> TTName -> SpecialName
  WithN : Int -> TTName -> SpecialName
  ImplementationN : TTName -> List String -> SpecialName
  ParentN : TTName -> String -> SpecialName
  MethodN : TTName -> SpecialName
  CaseN : SourceLocation -> TTName -> SpecialName
  ImplementationCtorN : TTName -> SpecialName
  MetaN : TTName -> TTName -> SpecialName
data TT : Type

  Reflection of the well typed core language

  P : NameType -> TTName -> TT -> TT

    A reference to some name (P for Parameter)

  V : Int -> TT

    de Bruijn variables

  Bind : TTName -> Binder TT -> TT -> TT

    Bind a variable

  App : TT -> TT -> TT

    Apply one term to another

  TConst : Const -> TT

    Embed a constant

  Erased : TT

    Erased terms

  TType : TTUExp -> TT

    The type of types along (with universe constraints)

  UType : Universe -> TT

    Alternative universes for dealing with uniqueness

data TTName : Type
  UN : String -> TTName

    A user-provided name

  NS : TTName -> List String -> TTName

    A name in some namespace.

    The namespace is in reverse order, so `(NS (UN "foo") ["B", "A"])`
    represents the name `A.B.foo`

  MN : Int -> String -> TTName

    Machine-chosen names

  SN : SpecialName -> TTName

    Special names, to make conflicts impossible and language features
    predictable

data TTUExp : Type
  UVar : String -> Int -> TTUExp

    Universe variable

  UVal : Int -> TTUExp

    Explicit universe level

data Tactic : Type

  A representation of Idris's old tactics that can be returned from custom
  tactic implementations. Generate these using `applyTactic`.

  Try : Tactic -> Tactic -> Tactic

    Try the first tactic and resort to the second one on failure

  GoalType : String -> Tactic -> Tactic

    Only run if the goal has the right type

  Refine : TTName -> Tactic

    Resolve function name, find matching arguments in the
    context and compute the proof target

  Seq : Tactic -> Tactic -> Tactic

    Apply both tactics in sequence

  Claim : TTName -> TT -> Tactic

    Introduce a new hole with a particular type

  Unfocus : Tactic

    Move the current hole to the end

  Trivial : Tactic

    Intelligently construct the proof target from the context

  Search : Int -> Tactic

    Build a proof by applying contructors up to a maximum depth

  Implementation : Tactic

    Resolve an interface

  Solve : Tactic

    Infer the proof target from the context

  Intros : Tactic

    introduce all variables into the context

  Intro : TTName -> Tactic

    Introduce a named variable into the context, use the
    first one if the given name is not found

  ApplyTactic : TT -> Tactic

    Invoke the reflected rep. of another tactic

  Reflect : TT -> Tactic

    Turn a value into its reflected representation

  ByReflection : TT -> Tactic

    Use a `%reflection` function

  Fill : Raw -> Tactic

    Turn a raw value back into a term

  Exact : TT -> Tactic

    Use the given value to conclude the proof

  Focus : TTName -> Tactic

    Focus on a particular hole

  Rewrite : TT -> Tactic

    Rewrite with an equality

  Induction : TT -> Tactic

    Perform induction on a particular expression

  Case : TT -> Tactic

    Perform case analysis on a particular expression

  LetTac : TTName -> TT -> Tactic

    Name a reflected term

  LetTacTy : TTName -> TT -> TT -> Tactic

    Name a reflected term and type it

  Compute : Tactic

    Normalise the goal

  Skip : Tactic

    Do nothing

  Fail : List ErrorReportPart -> Tactic

    Fail with an error message

  SourceFC : Tactic

    Attempt to fill the hole with source code information

data Universe : Type

  The various universes involved in the uniqueness mechanism

  NullType : Universe
  UniqueType : Universe
  AllTypes : Universe
quoteRawBinderRaw : Binder Raw -> Raw
quoteRawBinderTT : Binder Raw -> TT
quoteRawRaw : Raw -> Raw
quoteRawTT : Raw -> TT
quoteTTBinderRaw : Binder TT -> Raw
quoteTTRaw : TT -> Raw
reflectConstant : ReflConst a => a -> Const