{-# LANGUAGE DerivingStrategies, DeriveAnyClass #-}
{-# LANGUAGE NoImplicitPrelude, ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
module DSV.NumberViews
( InvalidNat (..), byteStringNatView, textNatView
, byteStringNatView_, textNatView_
, InvalidRational (..), byteStringRationalView, textRationalView
, byteStringRationalView_, textRationalView_
, InvalidDollars (..), byteStringDollarsView, textDollarsView
, byteStringDollarsView_, textDollarsView_
) where
import DSV.AttoView
import DSV.ByteString
import DSV.IO
import DSV.Numbers
import DSV.Prelude
import DSV.Text
import DSV.TextReaderView
import DSV.UTF8
import DSV.Validation
import DSV.ViewType
import qualified Data.Attoparsec.ByteString.Char8
data InvalidNat = InvalidNat
deriving stock (Eq, Show)
deriving anyclass Exception
byteStringNatView :: View InvalidNat ByteString Natural
byteStringNatView = attoByteStringView InvalidNat p
where
p = Data.Attoparsec.ByteString.Char8.decimal
byteStringNatView_ :: View () ByteString Natural
byteStringNatView_ = discardViewError byteStringNatView
textNatView :: View InvalidNat Text Natural
textNatView = textReaderView InvalidNat textReadDecimal
textNatView_ :: View () Text Natural
textNatView_ = discardViewError textNatView
data InvalidRational = InvalidRational
deriving stock (Eq, Show)
deriving anyclass Exception
byteStringRationalView :: View InvalidRational ByteString Rational
byteStringRationalView =
textRationalView .
overViewError (\InvalidUtf8 -> InvalidRational) utf8TextView
byteStringRationalView_ :: View () ByteString Rational
byteStringRationalView_ = discardViewError byteStringRationalView
textRationalView :: View InvalidRational Text Rational
textRationalView = textReaderView InvalidRational textReadRational
textRationalView_ :: View () Text Rational
textRationalView_ = discardViewError textRationalView
data InvalidDollars = InvalidDollars
deriving stock (Eq, Show)
deriving anyclass Exception
byteStringDollarsView :: View InvalidDollars ByteString Rational
byteStringDollarsView =
textDollarsView .
overViewError (\InvalidUtf8 -> InvalidDollars) utf8TextView
byteStringDollarsView_ :: View () ByteString Rational
byteStringDollarsView_ = discardViewError byteStringDollarsView
textDollarsView :: View InvalidDollars Text Rational
textDollarsView =
overViewError
(\InvalidRational -> InvalidDollars)
textRationalView
.
View (
maybe (Failure InvalidDollars) Success .
textStripPrefix "$"
)
textDollarsView_ :: View () Text Rational
textDollarsView_ = discardViewError textDollarsView