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

open import Text.Parser.Types.Core using (Parameters)

module Text.Parser.Success {l} (P : Parameters l) where

open import Level.Bounded as Level≤ using (_≤l_; Set≤; Σ; _×_; mkSet≤; theSet; lift; lower)
open import Data.Nat.Base using (; zero; suc; _≤_; _<_)
open import Data.Nat.Properties using (≤-trans; <⇒≤; ≤-refl)
open import Data.Maybe.Base as Maybe using (Maybe; nothing; just)
open import Data.Product using (_,_)
open import Data.List.Sized.Interface using (Sized)
open import Function.Base using (_∘′_; _$_)
open import Relation.Unary using (IUniversal; _⇒_)

open Text.Parser.Types.Core
open import Text.Parser.Types P
open Parameters P
open Success

module _ {A B : Set≤ l} where

  map : (theSet A  theSet B)  ∀[ Success Toks A  Success Toks B ]
  map f (a ^ m≤n , s) = Level≤.map f a ^ m≤n , s

  guardM : (theSet A  Maybe (theSet B)) 
           ∀[ Success Toks A  Maybe ∘′ Success Toks B ]
  guardM f (a ^ m≤n , s) = Maybe.map ((_^ m≤n , s) ∘′ lift) (f (lower a))

module _ {A : Set≤ l} {m n : } where

  ≤-lift : .(le : m  n)  Success Toks A m  Success Toks A n
  ≤-lift m≤n (a ^ p<m , s) = a ^ ≤-trans p<m m≤n , s

  <-lift : .(le : m < n)  Success Toks A m  Success Toks A n
  <-lift m<n = ≤-lift (<⇒≤ m<n)

module _ {A : Set≤ l} {b} {{b≤l : b ≤l l}} {B : theSet A  Set b} where

  and :  {n} (p : Success Toks A n) 
        Success Toks (mkSet≤ (B (lower $ value p))) (size p) 
        Success Toks (Σ A B) n
  and (a ^ m<n , v) q = <-lift m<n (map (lower a ,_) q)

module _ {A B : Set≤ l} where

  and′ :  {n} (p : Success Toks A n)  Success Toks B (size p) 
         Success Toks (A × B) n
  and′ (a ^ m<n , v) q = <-lift m<n (map (lower a ,_) q)

module _ {{𝕊 : Sized Tok Toks}} where

  view :  {n}  theSet (Toks n)  Maybe (Success Toks Tok n)
  view {zero}   ts = nothing
  view {suc n}  ts = just $ let (t , ts) = lower (Sized.view 𝕊 (lift ts))
                            in lift t ^ ≤-refl , lift ts