{-# OPTIONS --without-K --safe #-} module Text.Parser.Combinators.Char where open import Data.Bool.Base using (T; not) open import Data.Char.Base using (Char) open import Data.List.Base as List using ([]; _∷_; null) open import Data.List.NonEmpty as List⁺ using (_∷_) open import Data.Nat.Base using (ℕ) open import Data.String.Base as String using (String) open import Data.Sum.Base using () open import Category.Monad using (RawMonadPlus) open import Function.Base using (_∘′_; _$′_) open import Relation.Unary open import Induction.Nat.Strong using (□_) open import Data.List.Sized.Interface using (Sized) open import Data.Subset using (Subset; into) open import Relation.Binary.PropositionalEquality.Decidable using (DecidableEquality) open import Level.Bounded open import Text.Parser.Types open import Text.Parser.Combinators open import Text.Parser.Combinators.Numbers module _ {l} {P : Parameters l} (open Parameters P) {{𝕊 : Sized Tok Toks}} {{𝕄 : RawMonadPlus M}} {{𝔻 : DecidableEquality (theSet Tok)}} {{ℂ : Subset Char (theSet Tok)}} where module ℂ = Subset ℂ char : Char → ∀[ Parser P Tok ] char = exact ∘′ ℂ.into anyCharBut : Char → ∀[ Parser P Tok ] anyCharBut = anyTokenBut ∘′ ℂ.into space : ∀[ Parser P Tok ] space = anyOf $′ List.map ℂ.into $′ ' ' ∷ '\t' ∷ '\n' ∷ [] spaces : ∀[ Parser P (List⁺ Tok) ] spaces = list⁺ space text : (t : String) {_ : T (not $′ null $′ String.toList t)} → ∀[ Parser P (List⁺ Tok) ] text t {pr} with String.toList t | pr ... | [] | () ... | x ∷ xs | _ = exacts $′ List⁺.map ℂ.into (x ∷ xs) module _ {A : Set≤ l} where parens : ∀[ □ Parser P A ⇒ Parser P A ] parens = between (char '(') (box (char ')')) parens? : ∀[ Parser P A ⇒ Parser P A ] parens? = between? (char '(') (box (char ')')) withSpaces : ∀[ Parser P A ⇒ Parser P A ] withSpaces A = spaces ?&> A <&? box spaces lowerAlpha : ∀[ Parser P Tok ] lowerAlpha = anyOf $′ List.map ℂ.into $′ String.toList "abcdefghijklmnopqrstuvwxyz" upperAlpha : ∀[ Parser P Tok ] upperAlpha = anyOf $′ List.map ℂ.into $′ String.toList "ABCDEFGHIJKLMNOPQRSTUVWXYZ" alpha : ∀[ Parser P Tok ] alpha = lowerAlpha <|> upperAlpha alphas⁺ : ∀[ Parser P (List⁺ Tok) ] alphas⁺ = list⁺ alpha num : ∀[ Parser P [ ℕ ] ] num = decimalDigit alphanum : ∀[ Parser P (Tok ⊎ [ ℕ ]) ] alphanum = alpha <⊎> num