--1 Predefined functions for concrete syntax

-- The definitions of these constants are hard-coded in GF, and defined
-- in [AppPredefined.hs ../src/GF/Grammar/AppPredefined.hs]. Applying
-- them to run-time variables leads to compiler errors that are often
-- only detected at the code generation time.

resource Predef = {

-- This type of booleans is for internal use only.

  param PBool = PTrue | PFalse ;

  oper Error : Type = variants {} ;          -- the empty type
  oper Int   : Type = variants {} ;          -- the type of integers
  oper Ints  : Int -> Type = variants {} ;   -- the type of integers from 0 to n

  oper error  : Str        -> Error    = variants {} ; -- forms error message
  oper length : Tok ->        Int      = variants {} ; -- length of string
  oper drop   : Int -> Tok -> Tok      = variants {} ; -- drop prefix of length
  oper take   : Int -> Tok -> Tok      = variants {} ; -- take prefix of length
  oper tk     : Int -> Tok -> Tok      = variants {} ; -- drop suffix of length
  oper dp     : Int -> Tok -> Tok      = variants {} ; -- take suffix of length
  oper eqInt  : Int -> Int -> PBool    = variants {} ; -- test if equal integers
  oper lessInt: Int -> Int -> PBool    = variants {} ; -- test order of integers
  oper plus   : Int -> Int -> Int      = variants {} ; -- add integers
  oper eqStr  : Tok -> Tok -> PBool    = variants {} ; -- test if equal strings
  oper occur  : Tok -> Tok -> PBool    = variants {} ; -- test if occurs as substring
  oper occurs : Tok -> Tok -> PBool    = variants {} ; -- test if any char occurs
  oper show   : (P : Type) -> P -> Tok = variants {} ; -- convert param to string
  oper read   : (P : Type) -> Tok -> P = variants {} ; -- convert string to param
  oper toStr  : (L : Type) -> L -> Str = variants {} ; -- find the "first" string
  oper mapStr : (L : Type) -> (Str -> Str) -> L -> L = variants {} ; 
               -- map all strings in a data structure; experimental ---

} ;

