{-# OPTIONS --without-K --safe #-}

module Text.Parser.Types.Core where

open import Level using (Level; Setω)
open import Level.Bounded using (Set≤; theSet; Lift; ⊤)
open import Data.Nat.Base using (ℕ; _<_)

--------------------------------------------------------------------------------
-- PARAMETERS

-- A parser is parametrised by some types, type constructors and one function.

record Parameters (l : Level) : Setω where
   field
-- Token-related parameters:
-- * Tok: tokens
     Tok    : Set≤ l
-- * Toks: sized input (~ Vec Tok)
     Toks    : ℕ → Set≤ l
-- The monad stack used
     M : Set l → Set l
-- The action allowing us to track consumed tokens
     recordToken : theSet Tok → M (Lift ⊤)

--------------------------------------------------------------------------------
-- SUCCESS

-- A successful partial parse of an A is a value A together leftovers
-- which are proven to be smaller than the input

infix 1 _^_,_
record Success {l} (Toks : ℕ → Set≤ l) (A : Set≤ l) (n : ℕ) : Set l where
  constructor _^_,_
  field
    value     : Lift A
    {size}    : ℕ
    .small    : size < n
    leftovers : Lift (Toks size)