{-# OPTIONS --without-K --safe #-}
module Text.Parser.Combinators.Numbers where
open import Data.Char.Base using (Char)
open import Data.Integer.Base using (ℤ; -_; +_)
open import Data.List.Base as List using ([]; _∷_)
open import Data.List.NonEmpty as List⁺ using ()
open import Data.Nat.Base using (ℕ; _+_; _*_)
open import Data.Product as Product using (_,_; uncurry)
open import Data.List.Sized.Interface
open import Data.Sum.Base using ([_,_]′)
open import Data.Maybe.Base using (maybe′)
open import Function.Base using (const; id; _$_; _∘′_)
open import Category.Monad using (RawMonadPlus)
open import Relation.Unary
open import Relation.Binary.PropositionalEquality.Decidable using (DecidableEquality)
open import Data.Subset using (Subset; into)
open import Level.Bounded using (theSet; [_])
open import Text.Parser.Types
open import Text.Parser.Combinators
module _ {l} {P : Parameters l} (open Parameters P)
{{𝕄 : RawMonadPlus M}}
{{𝕊 : Sized Tok Toks}}
{{𝔻 : DecidableEquality (theSet Tok)}}
{{ℂ : Subset Char (theSet Tok)}} where
private module ℂ = Subset ℂ
decimalDigit : ∀[ Parser P [ ℕ ] ]
decimalDigit = alts $ List.map (uncurry $ λ v c → v <$ exact (ℂ.into c))
$ (0 , '0') ∷ (1 , '1') ∷ (2 , '2') ∷ (3 , '3') ∷ (4 , '4')
∷ (5 , '5') ∷ (6 , '6') ∷ (7 , '7') ∷ (8 , '8') ∷ (9 , '9') ∷ []
decimalℕ : ∀[ Parser P [ ℕ ] ]
decimalℕ = convert <$> list⁺ decimalDigit where
convert = List⁺.foldl (λ ih v → ih * 10 + v) id
decimalℤ : ∀[ Parser P [ ℤ ] ]
decimalℤ = uncurry convert <$> (sign <?&> decimalℕ) where
sign = anyOf (List.map ℂ.into $ '-' ∷ '−' ∷ []) <⊎> exact (ℂ.into '+')
convert = λ s → maybe′ [ const (-_) , const id ]′ id s ∘′ +_