{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}
module Text.Ascii.Internal where
import Control.DeepSeq (NFData)
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import Data.CaseInsensitive (FoldCase (foldCase))
import Data.Char (chr, isAscii)
import Data.Coerce (coerce)
import Data.Hashable (Hashable)
import qualified Data.List.NonEmpty as NE
import Data.Monoid.Factorial (FactorialMonoid)
import Data.Monoid.GCD (LeftGCDMonoid, RightGCDMonoid)
import Data.Monoid.Monus (OverlappingGCDMonoid)
import Data.Monoid.Null (MonoidNull, PositiveMonoid)
import Data.Semigroup.Cancellative (LeftCancellative, LeftReductive, RightCancellative, RightReductive)
import Data.Semigroup.Factorial (Factorial, StableFactorial)
import Data.Word (Word8)
import GHC.Exts (IsList (Item, fromList, fromListN, toList))
import Numeric (showHex)
import Optics.AffineTraversal (An_AffineTraversal, atraversal)
import Optics.At.Core (Index, IxValue, Ixed (IxKind, ix))
import Text.Megaparsec.Stream
( Stream
( Token,
Tokens,
chunkLength,
chunkToTokens,
take1_,
takeN_,
takeWhile_,
tokenToChunk,
tokensToChunk
),
TraversableStream (reachOffset),
VisualStream (showTokens),
)
import Type.Reflection (Typeable)
newtype AsciiChar = AsciiChar {AsciiChar -> Word8
toByte :: Word8}
deriving
(
AsciiChar -> AsciiChar -> Bool
(AsciiChar -> AsciiChar -> Bool)
-> (AsciiChar -> AsciiChar -> Bool) -> Eq AsciiChar
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AsciiChar -> AsciiChar -> Bool
== :: AsciiChar -> AsciiChar -> Bool
$c/= :: AsciiChar -> AsciiChar -> Bool
/= :: AsciiChar -> AsciiChar -> Bool
Eq,
Eq AsciiChar
Eq AsciiChar =>
(AsciiChar -> AsciiChar -> Ordering)
-> (AsciiChar -> AsciiChar -> Bool)
-> (AsciiChar -> AsciiChar -> Bool)
-> (AsciiChar -> AsciiChar -> Bool)
-> (AsciiChar -> AsciiChar -> Bool)
-> (AsciiChar -> AsciiChar -> AsciiChar)
-> (AsciiChar -> AsciiChar -> AsciiChar)
-> Ord AsciiChar
AsciiChar -> AsciiChar -> Bool
AsciiChar -> AsciiChar -> Ordering
AsciiChar -> AsciiChar -> AsciiChar
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: AsciiChar -> AsciiChar -> Ordering
compare :: AsciiChar -> AsciiChar -> Ordering
$c< :: AsciiChar -> AsciiChar -> Bool
< :: AsciiChar -> AsciiChar -> Bool
$c<= :: AsciiChar -> AsciiChar -> Bool
<= :: AsciiChar -> AsciiChar -> Bool
$c> :: AsciiChar -> AsciiChar -> Bool
> :: AsciiChar -> AsciiChar -> Bool
$c>= :: AsciiChar -> AsciiChar -> Bool
>= :: AsciiChar -> AsciiChar -> Bool
$cmax :: AsciiChar -> AsciiChar -> AsciiChar
max :: AsciiChar -> AsciiChar -> AsciiChar
$cmin :: AsciiChar -> AsciiChar -> AsciiChar
min :: AsciiChar -> AsciiChar -> AsciiChar
Ord,
Eq AsciiChar
Eq AsciiChar =>
(Int -> AsciiChar -> Int)
-> (AsciiChar -> Int) -> Hashable AsciiChar
Int -> AsciiChar -> Int
AsciiChar -> Int
forall a. Eq a => (Int -> a -> Int) -> (a -> Int) -> Hashable a
$chashWithSalt :: Int -> AsciiChar -> Int
hashWithSalt :: Int -> AsciiChar -> Int
$chash :: AsciiChar -> Int
hash :: AsciiChar -> Int
Hashable,
AsciiChar -> ()
(AsciiChar -> ()) -> NFData AsciiChar
forall a. (a -> ()) -> NFData a
$crnf :: AsciiChar -> ()
rnf :: AsciiChar -> ()
NFData
)
via Word8
deriving stock
(
Typeable
)
instance Show AsciiChar where
{-# INLINEABLE show #-}
show :: AsciiChar -> String
show (AsciiChar Word8
w8) = String
"'0x" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Word8 -> ShowS
forall a. Integral a => a -> ShowS
showHex Word8
w8 String
"'"
instance Bounded AsciiChar where
{-# INLINEABLE minBound #-}
minBound :: AsciiChar
minBound = Word8 -> AsciiChar
AsciiChar Word8
0
{-# INLINEABLE maxBound #-}
maxBound :: AsciiChar
maxBound = Word8 -> AsciiChar
AsciiChar Word8
127
instance FoldCase AsciiChar where
{-# INLINEABLE foldCase #-}
foldCase :: AsciiChar -> AsciiChar
foldCase ac :: AsciiChar
ac@(AsciiChar Word8
w8)
| Word8
65 Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
w8 Bool -> Bool -> Bool
&& Word8
w8 Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
90 = Word8 -> AsciiChar
AsciiChar (Word8
w8 Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
+ Word8
32)
| Bool
otherwise = AsciiChar
ac
pattern AsByte :: Word8 -> AsciiChar
pattern $mAsByte :: forall {r}. AsciiChar -> (Word8 -> r) -> ((# #) -> r) -> r
AsByte w8 <- AsciiChar w8
pattern AsChar :: Char -> AsciiChar
pattern $mAsChar :: forall {r}. AsciiChar -> (Char -> r) -> ((# #) -> r) -> r
AsChar c <- AsciiChar (isJustAscii -> Just c)
{-# COMPLETE AsByte #-}
{-# COMPLETE AsChar #-}
newtype AsciiText = AsciiText ByteString
deriving
(
AsciiText -> AsciiText -> Bool
(AsciiText -> AsciiText -> Bool)
-> (AsciiText -> AsciiText -> Bool) -> Eq AsciiText
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AsciiText -> AsciiText -> Bool
== :: AsciiText -> AsciiText -> Bool
$c/= :: AsciiText -> AsciiText -> Bool
/= :: AsciiText -> AsciiText -> Bool
Eq,
Eq AsciiText
Eq AsciiText =>
(AsciiText -> AsciiText -> Ordering)
-> (AsciiText -> AsciiText -> Bool)
-> (AsciiText -> AsciiText -> Bool)
-> (AsciiText -> AsciiText -> Bool)
-> (AsciiText -> AsciiText -> Bool)
-> (AsciiText -> AsciiText -> AsciiText)
-> (AsciiText -> AsciiText -> AsciiText)
-> Ord AsciiText
AsciiText -> AsciiText -> Bool
AsciiText -> AsciiText -> Ordering
AsciiText -> AsciiText -> AsciiText
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: AsciiText -> AsciiText -> Ordering
compare :: AsciiText -> AsciiText -> Ordering
$c< :: AsciiText -> AsciiText -> Bool
< :: AsciiText -> AsciiText -> Bool
$c<= :: AsciiText -> AsciiText -> Bool
<= :: AsciiText -> AsciiText -> Bool
$c> :: AsciiText -> AsciiText -> Bool
> :: AsciiText -> AsciiText -> Bool
$c>= :: AsciiText -> AsciiText -> Bool
>= :: AsciiText -> AsciiText -> Bool
$cmax :: AsciiText -> AsciiText -> AsciiText
max :: AsciiText -> AsciiText -> AsciiText
$cmin :: AsciiText -> AsciiText -> AsciiText
min :: AsciiText -> AsciiText -> AsciiText
Ord,
AsciiText -> ()
(AsciiText -> ()) -> NFData AsciiText
forall a. (a -> ()) -> NFData a
$crnf :: AsciiText -> ()
rnf :: AsciiText -> ()
NFData,
NonEmpty AsciiText -> AsciiText
AsciiText -> AsciiText -> AsciiText
(AsciiText -> AsciiText -> AsciiText)
-> (NonEmpty AsciiText -> AsciiText)
-> (forall b. Integral b => b -> AsciiText -> AsciiText)
-> Semigroup AsciiText
forall b. Integral b => b -> AsciiText -> AsciiText
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: AsciiText -> AsciiText -> AsciiText
<> :: AsciiText -> AsciiText -> AsciiText
$csconcat :: NonEmpty AsciiText -> AsciiText
sconcat :: NonEmpty AsciiText -> AsciiText
$cstimes :: forall b. Integral b => b -> AsciiText -> AsciiText
stimes :: forall b. Integral b => b -> AsciiText -> AsciiText
Semigroup,
Semigroup AsciiText
AsciiText
Semigroup AsciiText =>
AsciiText
-> (AsciiText -> AsciiText -> AsciiText)
-> ([AsciiText] -> AsciiText)
-> Monoid AsciiText
[AsciiText] -> AsciiText
AsciiText -> AsciiText -> AsciiText
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: AsciiText
mempty :: AsciiText
$cmappend :: AsciiText -> AsciiText -> AsciiText
mappend :: AsciiText -> AsciiText -> AsciiText
$cmconcat :: [AsciiText] -> AsciiText
mconcat :: [AsciiText] -> AsciiText
Monoid,
Int -> AsciiText -> ShowS
[AsciiText] -> ShowS
AsciiText -> String
(Int -> AsciiText -> ShowS)
-> (AsciiText -> String)
-> ([AsciiText] -> ShowS)
-> Show AsciiText
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AsciiText -> ShowS
showsPrec :: Int -> AsciiText -> ShowS
$cshow :: AsciiText -> String
show :: AsciiText -> String
$cshowList :: [AsciiText] -> ShowS
showList :: [AsciiText] -> ShowS
Show,
Semigroup AsciiText
Semigroup AsciiText =>
(AsciiText -> [AsciiText])
-> (AsciiText -> AsciiText)
-> (AsciiText -> AsciiText)
-> (forall a. (a -> AsciiText -> a) -> a -> AsciiText -> a)
-> (forall a. (a -> AsciiText -> a) -> a -> AsciiText -> a)
-> (forall a. (AsciiText -> a -> a) -> a -> AsciiText -> a)
-> (AsciiText -> Int)
-> (forall n. Monoid n => (AsciiText -> n) -> AsciiText -> n)
-> (AsciiText -> AsciiText)
-> Factorial AsciiText
AsciiText -> Int
AsciiText -> [AsciiText]
AsciiText -> AsciiText
forall m.
Semigroup m =>
(m -> [m])
-> (m -> m)
-> (m -> m)
-> (forall a. (a -> m -> a) -> a -> m -> a)
-> (forall a. (a -> m -> a) -> a -> m -> a)
-> (forall a. (m -> a -> a) -> a -> m -> a)
-> (m -> Int)
-> (forall n. Monoid n => (m -> n) -> m -> n)
-> (m -> m)
-> Factorial m
forall n. Monoid n => (AsciiText -> n) -> AsciiText -> n
forall a. (a -> AsciiText -> a) -> a -> AsciiText -> a
forall a. (AsciiText -> a -> a) -> a -> AsciiText -> a
$cfactors :: AsciiText -> [AsciiText]
factors :: AsciiText -> [AsciiText]
$cprimePrefix :: AsciiText -> AsciiText
primePrefix :: AsciiText -> AsciiText
$cprimeSuffix :: AsciiText -> AsciiText
primeSuffix :: AsciiText -> AsciiText
$cfoldl :: forall a. (a -> AsciiText -> a) -> a -> AsciiText -> a
foldl :: forall a. (a -> AsciiText -> a) -> a -> AsciiText -> a
$cfoldl' :: forall a. (a -> AsciiText -> a) -> a -> AsciiText -> a
foldl' :: forall a. (a -> AsciiText -> a) -> a -> AsciiText -> a
$cfoldr :: forall a. (AsciiText -> a -> a) -> a -> AsciiText -> a
foldr :: forall a. (AsciiText -> a -> a) -> a -> AsciiText -> a
$clength :: AsciiText -> Int
length :: AsciiText -> Int
$cfoldMap :: forall n. Monoid n => (AsciiText -> n) -> AsciiText -> n
foldMap :: forall n. Monoid n => (AsciiText -> n) -> AsciiText -> n
$creverse :: AsciiText -> AsciiText
reverse :: AsciiText -> AsciiText
Factorial,
MonoidNull AsciiText
Factorial AsciiText
Int -> AsciiText -> (AsciiText, AsciiText)
Int -> AsciiText -> AsciiText
(Factorial AsciiText, MonoidNull AsciiText) =>
(AsciiText -> Maybe (AsciiText, AsciiText))
-> (AsciiText -> Maybe (AsciiText, AsciiText))
-> (AsciiText -> [AsciiText])
-> (AsciiText -> [AsciiText])
-> ((AsciiText -> Bool) -> AsciiText -> (AsciiText, AsciiText))
-> ((AsciiText -> Bool) -> AsciiText -> (AsciiText, AsciiText))
-> ((AsciiText -> Bool) -> AsciiText -> [AsciiText])
-> ((AsciiText -> Bool) -> AsciiText -> AsciiText)
-> ((AsciiText -> Bool) -> AsciiText -> AsciiText)
-> (forall s.
s
-> (s -> AsciiText -> Maybe s)
-> AsciiText
-> (AsciiText, AsciiText, s))
-> (forall s.
s
-> (s -> AsciiText -> Maybe s)
-> AsciiText
-> (AsciiText, AsciiText, s))
-> (Int -> AsciiText -> (AsciiText, AsciiText))
-> (Int -> AsciiText -> AsciiText)
-> (Int -> AsciiText -> AsciiText)
-> FactorialMonoid AsciiText
AsciiText -> [AsciiText]
AsciiText -> Maybe (AsciiText, AsciiText)
(AsciiText -> Bool) -> AsciiText -> [AsciiText]
(AsciiText -> Bool) -> AsciiText -> (AsciiText, AsciiText)
(AsciiText -> Bool) -> AsciiText -> AsciiText
forall s.
s
-> (s -> AsciiText -> Maybe s)
-> AsciiText
-> (AsciiText, AsciiText, s)
forall m.
(Factorial m, MonoidNull m) =>
(m -> Maybe (m, m))
-> (m -> Maybe (m, m))
-> (m -> [m])
-> (m -> [m])
-> ((m -> Bool) -> m -> (m, m))
-> ((m -> Bool) -> m -> (m, m))
-> ((m -> Bool) -> m -> [m])
-> ((m -> Bool) -> m -> m)
-> ((m -> Bool) -> m -> m)
-> (forall s. s -> (s -> m -> Maybe s) -> m -> (m, m, s))
-> (forall s. s -> (s -> m -> Maybe s) -> m -> (m, m, s))
-> (Int -> m -> (m, m))
-> (Int -> m -> m)
-> (Int -> m -> m)
-> FactorialMonoid m
$csplitPrimePrefix :: AsciiText -> Maybe (AsciiText, AsciiText)
splitPrimePrefix :: AsciiText -> Maybe (AsciiText, AsciiText)
$csplitPrimeSuffix :: AsciiText -> Maybe (AsciiText, AsciiText)
splitPrimeSuffix :: AsciiText -> Maybe (AsciiText, AsciiText)
$cinits :: AsciiText -> [AsciiText]
inits :: AsciiText -> [AsciiText]
$ctails :: AsciiText -> [AsciiText]
tails :: AsciiText -> [AsciiText]
$cspan :: (AsciiText -> Bool) -> AsciiText -> (AsciiText, AsciiText)
span :: (AsciiText -> Bool) -> AsciiText -> (AsciiText, AsciiText)
$cbreak :: (AsciiText -> Bool) -> AsciiText -> (AsciiText, AsciiText)
break :: (AsciiText -> Bool) -> AsciiText -> (AsciiText, AsciiText)
$csplit :: (AsciiText -> Bool) -> AsciiText -> [AsciiText]
split :: (AsciiText -> Bool) -> AsciiText -> [AsciiText]
$ctakeWhile :: (AsciiText -> Bool) -> AsciiText -> AsciiText
takeWhile :: (AsciiText -> Bool) -> AsciiText -> AsciiText
$cdropWhile :: (AsciiText -> Bool) -> AsciiText -> AsciiText
dropWhile :: (AsciiText -> Bool) -> AsciiText -> AsciiText
$cspanMaybe :: forall s.
s
-> (s -> AsciiText -> Maybe s)
-> AsciiText
-> (AsciiText, AsciiText, s)
spanMaybe :: forall s.
s
-> (s -> AsciiText -> Maybe s)
-> AsciiText
-> (AsciiText, AsciiText, s)
$cspanMaybe' :: forall s.
s
-> (s -> AsciiText -> Maybe s)
-> AsciiText
-> (AsciiText, AsciiText, s)
spanMaybe' :: forall s.
s
-> (s -> AsciiText -> Maybe s)
-> AsciiText
-> (AsciiText, AsciiText, s)
$csplitAt :: Int -> AsciiText -> (AsciiText, AsciiText)
splitAt :: Int -> AsciiText -> (AsciiText, AsciiText)
$cdrop :: Int -> AsciiText -> AsciiText
drop :: Int -> AsciiText -> AsciiText
$ctake :: Int -> AsciiText -> AsciiText
take :: Int -> AsciiText -> AsciiText
FactorialMonoid,
LeftReductive AsciiText
LeftReductive AsciiText => LeftCancellative AsciiText
forall m. LeftReductive m => LeftCancellative m
LeftCancellative,
Monoid AsciiText
LeftReductive AsciiText
(Monoid AsciiText, LeftReductive AsciiText) =>
(AsciiText -> AsciiText -> AsciiText)
-> (AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText))
-> LeftGCDMonoid AsciiText
AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText)
AsciiText -> AsciiText -> AsciiText
forall m.
(Monoid m, LeftReductive m) =>
(m -> m -> m) -> (m -> m -> (m, m, m)) -> LeftGCDMonoid m
$ccommonPrefix :: AsciiText -> AsciiText -> AsciiText
commonPrefix :: AsciiText -> AsciiText -> AsciiText
$cstripCommonPrefix :: AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText)
stripCommonPrefix :: AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText)
LeftGCDMonoid,
Semigroup AsciiText
Semigroup AsciiText =>
(AsciiText -> AsciiText -> Bool)
-> (AsciiText -> AsciiText -> Maybe AsciiText)
-> LeftReductive AsciiText
AsciiText -> AsciiText -> Bool
AsciiText -> AsciiText -> Maybe AsciiText
forall m.
Semigroup m =>
(m -> m -> Bool) -> (m -> m -> Maybe m) -> LeftReductive m
$cisPrefixOf :: AsciiText -> AsciiText -> Bool
isPrefixOf :: AsciiText -> AsciiText -> Bool
$cstripPrefix :: AsciiText -> AsciiText -> Maybe AsciiText
stripPrefix :: AsciiText -> AsciiText -> Maybe AsciiText
LeftReductive,
Monoid AsciiText
Monoid AsciiText => (AsciiText -> Bool) -> MonoidNull AsciiText
AsciiText -> Bool
forall m. Monoid m => (m -> Bool) -> MonoidNull m
$cnull :: AsciiText -> Bool
null :: AsciiText -> Bool
MonoidNull,
Monoid AsciiText
RightReductive AsciiText
LeftReductive AsciiText
(Monoid AsciiText, LeftReductive AsciiText,
RightReductive AsciiText) =>
(AsciiText -> AsciiText -> AsciiText)
-> (AsciiText -> AsciiText -> AsciiText)
-> (AsciiText -> AsciiText -> AsciiText)
-> (AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText))
-> OverlappingGCDMonoid AsciiText
AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText)
AsciiText -> AsciiText -> AsciiText
forall m.
(Monoid m, LeftReductive m, RightReductive m) =>
(m -> m -> m)
-> (m -> m -> m)
-> (m -> m -> m)
-> (m -> m -> (m, m, m))
-> OverlappingGCDMonoid m
$cstripPrefixOverlap :: AsciiText -> AsciiText -> AsciiText
stripPrefixOverlap :: AsciiText -> AsciiText -> AsciiText
$cstripSuffixOverlap :: AsciiText -> AsciiText -> AsciiText
stripSuffixOverlap :: AsciiText -> AsciiText -> AsciiText
$coverlap :: AsciiText -> AsciiText -> AsciiText
overlap :: AsciiText -> AsciiText -> AsciiText
$cstripOverlap :: AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText)
stripOverlap :: AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText)
OverlappingGCDMonoid,
MonoidNull AsciiText
MonoidNull AsciiText => PositiveMonoid AsciiText
forall m. MonoidNull m => PositiveMonoid m
PositiveMonoid,
RightReductive AsciiText
RightReductive AsciiText => RightCancellative AsciiText
forall m. RightReductive m => RightCancellative m
RightCancellative,
Monoid AsciiText
RightReductive AsciiText
(Monoid AsciiText, RightReductive AsciiText) =>
(AsciiText -> AsciiText -> AsciiText)
-> (AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText))
-> RightGCDMonoid AsciiText
AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText)
AsciiText -> AsciiText -> AsciiText
forall m.
(Monoid m, RightReductive m) =>
(m -> m -> m) -> (m -> m -> (m, m, m)) -> RightGCDMonoid m
$ccommonSuffix :: AsciiText -> AsciiText -> AsciiText
commonSuffix :: AsciiText -> AsciiText -> AsciiText
$cstripCommonSuffix :: AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText)
stripCommonSuffix :: AsciiText -> AsciiText -> (AsciiText, AsciiText, AsciiText)
RightGCDMonoid,
Semigroup AsciiText
Semigroup AsciiText =>
(AsciiText -> AsciiText -> Bool)
-> (AsciiText -> AsciiText -> Maybe AsciiText)
-> RightReductive AsciiText
AsciiText -> AsciiText -> Bool
AsciiText -> AsciiText -> Maybe AsciiText
forall m.
Semigroup m =>
(m -> m -> Bool) -> (m -> m -> Maybe m) -> RightReductive m
$cisSuffixOf :: AsciiText -> AsciiText -> Bool
isSuffixOf :: AsciiText -> AsciiText -> Bool
$cstripSuffix :: AsciiText -> AsciiText -> Maybe AsciiText
stripSuffix :: AsciiText -> AsciiText -> Maybe AsciiText
RightReductive,
Factorial AsciiText
Factorial AsciiText => StableFactorial AsciiText
forall m. Factorial m => StableFactorial m
StableFactorial
)
via ByteString
instance IsList AsciiText where
type Item AsciiText = AsciiChar
{-# INLINEABLE fromList #-}
fromList :: [Item AsciiText] -> AsciiText
fromList =
forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @ByteString @AsciiText
(ByteString -> AsciiText)
-> ([AsciiChar] -> ByteString) -> [AsciiChar] -> AsciiText
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Word8] -> ByteString
[Item ByteString] -> ByteString
forall l. IsList l => [Item l] -> l
fromList
([Word8] -> ByteString)
-> ([AsciiChar] -> [Word8]) -> [AsciiChar] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @[AsciiChar] @[Word8]
{-# INLINEABLE fromListN #-}
fromListN :: Int -> [Item AsciiText] -> AsciiText
fromListN Int
n =
forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @ByteString @AsciiText
(ByteString -> AsciiText)
-> ([AsciiChar] -> ByteString) -> [AsciiChar] -> AsciiText
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Item ByteString] -> ByteString
forall l. IsList l => Int -> [Item l] -> l
fromListN Int
n
([Word8] -> ByteString)
-> ([AsciiChar] -> [Word8]) -> [AsciiChar] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @[AsciiChar] @[Word8]
{-# INLINEABLE toList #-}
toList :: AsciiText -> [Item AsciiText]
toList = [Word8] -> [AsciiChar]
forall a b. Coercible a b => a -> b
coerce ([Word8] -> [AsciiChar])
-> (AsciiText -> [Word8]) -> AsciiText -> [AsciiChar]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Word8]
ByteString -> [Item ByteString]
forall l. IsList l => l -> [Item l]
toList (ByteString -> [Word8])
-> (AsciiText -> ByteString) -> AsciiText -> [Word8]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @AsciiText @ByteString
type instance Index AsciiText = Int
type instance IxValue AsciiText = AsciiChar
instance Ixed AsciiText where
type IxKind AsciiText = An_AffineTraversal
{-# INLINEABLE ix #-}
ix :: Index AsciiText
-> Optic' (IxKind AsciiText) NoIx AsciiText (IxValue AsciiText)
ix Index AsciiText
i = (AsciiText -> Either AsciiText AsciiChar)
-> (AsciiText -> AsciiChar -> AsciiText)
-> AffineTraversal AsciiText AsciiText AsciiChar AsciiChar
forall s t a b.
(s -> Either t a) -> (s -> b -> t) -> AffineTraversal s t a b
atraversal AsciiText -> Either AsciiText AsciiChar
get AsciiText -> AsciiChar -> AsciiText
put
where
get :: AsciiText -> Either AsciiText AsciiChar
get :: AsciiText -> Either AsciiText AsciiChar
get (AsciiText ByteString
at) = case ByteString
at ByteString -> Int -> Maybe Word8
BS.!? Int
Index AsciiText
i of
Maybe Word8
Nothing -> AsciiText -> Either AsciiText AsciiChar
forall a b. a -> Either a b
Left (AsciiText -> Either AsciiText AsciiChar)
-> (ByteString -> AsciiText)
-> ByteString
-> Either AsciiText AsciiChar
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> AsciiText
AsciiText (ByteString -> Either AsciiText AsciiChar)
-> ByteString -> Either AsciiText AsciiChar
forall a b. (a -> b) -> a -> b
$ ByteString
at
Just Word8
w8 -> AsciiChar -> Either AsciiText AsciiChar
forall a b. b -> Either a b
Right (AsciiChar -> Either AsciiText AsciiChar)
-> (Word8 -> AsciiChar) -> Word8 -> Either AsciiText AsciiChar
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> AsciiChar
AsciiChar (Word8 -> Either AsciiText AsciiChar)
-> Word8 -> Either AsciiText AsciiChar
forall a b. (a -> b) -> a -> b
$ Word8
w8
put :: AsciiText -> AsciiChar -> AsciiText
put :: AsciiText -> AsciiChar -> AsciiText
put (AsciiText ByteString
at) (AsciiChar Word8
ac) = case Int -> ByteString -> (ByteString, ByteString)
BS.splitAt Int
Index AsciiText
i ByteString
at of
(ByteString
lead, ByteString
end) -> case ByteString -> Maybe (Word8, ByteString)
BS.uncons ByteString
end of
Maybe (Word8, ByteString)
Nothing -> ByteString -> AsciiText
AsciiText ByteString
at
Just (Word8
_, ByteString
end') -> ByteString -> AsciiText
AsciiText (ByteString
lead ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> Word8 -> ByteString
BS.singleton Word8
ac ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
end')
instance FoldCase AsciiText where
{-# INLINEABLE foldCase #-}
foldCase :: AsciiText -> AsciiText
foldCase (AsciiText ByteString
bs) = ByteString -> AsciiText
AsciiText (ByteString -> AsciiText)
-> (ByteString -> ByteString) -> ByteString -> AsciiText
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word8 -> Word8) -> ByteString -> ByteString
BS.map Word8 -> Word8
go (ByteString -> AsciiText) -> ByteString -> AsciiText
forall a b. (a -> b) -> a -> b
$ ByteString
bs
where
go :: Word8 -> Word8
go :: Word8 -> Word8
go Word8
w8
| Word8
65 Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
w8 Bool -> Bool -> Bool
&& Word8
w8 Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
90 = Word8
w8 Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
+ Word8
32
| Bool
otherwise = Word8
w8
instance Stream AsciiText where
type Token AsciiText = AsciiChar
type Tokens AsciiText = AsciiText
{-# INLINEABLE tokenToChunk #-}
tokenToChunk :: Proxy AsciiText -> Token AsciiText -> Tokens AsciiText
tokenToChunk Proxy AsciiText
_ = (Word8 -> ByteString) -> AsciiChar -> AsciiText
forall a b. Coercible a b => a -> b
coerce Word8 -> ByteString
BS.singleton
{-# INLINEABLE tokensToChunk #-}
tokensToChunk :: Proxy AsciiText -> [Token AsciiText] -> Tokens AsciiText
tokensToChunk Proxy AsciiText
_ = [Item AsciiText] -> AsciiText
[Token AsciiText] -> Tokens AsciiText
forall l. IsList l => [Item l] -> l
fromList
{-# INLINEABLE chunkToTokens #-}
chunkToTokens :: Proxy AsciiText -> Tokens AsciiText -> [Token AsciiText]
chunkToTokens Proxy AsciiText
_ = Tokens AsciiText -> [Token AsciiText]
AsciiText -> [Item AsciiText]
forall l. IsList l => l -> [Item l]
toList
{-# INLINEABLE chunkLength #-}
chunkLength :: Proxy AsciiText -> Tokens AsciiText -> Int
chunkLength Proxy AsciiText
_ = (ByteString -> Int) -> AsciiText -> Int
forall a b. Coercible a b => a -> b
coerce ByteString -> Int
BS.length
{-# INLINEABLE take1_ #-}
take1_ :: AsciiText -> Maybe (Token AsciiText, AsciiText)
take1_ = (ByteString -> Maybe (Word8, ByteString))
-> AsciiText -> Maybe (AsciiChar, AsciiText)
forall a b. Coercible a b => a -> b
coerce ByteString -> Maybe (Word8, ByteString)
BS.uncons
{-# INLINEABLE takeN_ #-}
takeN_ :: Int -> AsciiText -> Maybe (Tokens AsciiText, AsciiText)
takeN_ Int
n at :: AsciiText
at@(AsciiText ByteString
bs)
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = (AsciiText, AsciiText) -> Maybe (AsciiText, AsciiText)
forall a. a -> Maybe a
Just (ByteString -> AsciiText
forall a b. Coercible a b => a -> b
coerce ByteString
BS.empty, AsciiText
at)
| ByteString -> Int
BS.length ByteString
bs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Maybe (Tokens AsciiText, AsciiText)
Maybe (AsciiText, AsciiText)
forall a. Maybe a
Nothing
| Bool
otherwise = (AsciiText, AsciiText) -> Maybe (Tokens AsciiText, AsciiText)
(AsciiText, AsciiText) -> Maybe (AsciiText, AsciiText)
forall a. a -> Maybe a
Just ((AsciiText, AsciiText) -> Maybe (Tokens AsciiText, AsciiText))
-> (ByteString -> (AsciiText, AsciiText))
-> ByteString
-> Maybe (Tokens AsciiText, AsciiText)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ByteString, ByteString) -> (AsciiText, AsciiText)
forall a b. Coercible a b => a -> b
coerce ((ByteString, ByteString) -> (AsciiText, AsciiText))
-> (ByteString -> (ByteString, ByteString))
-> ByteString
-> (AsciiText, AsciiText)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ByteString -> (ByteString, ByteString)
BS.splitAt Int
n (ByteString -> Maybe (Tokens AsciiText, AsciiText))
-> ByteString -> Maybe (Tokens AsciiText, AsciiText)
forall a b. (a -> b) -> a -> b
$ ByteString
bs
{-# INLINEABLE takeWhile_ #-}
takeWhile_ :: (Token AsciiText -> Bool)
-> AsciiText -> (Tokens AsciiText, AsciiText)
takeWhile_ = ((Word8 -> Bool) -> ByteString -> (ByteString, ByteString))
-> (AsciiChar -> Bool) -> AsciiText -> (AsciiText, AsciiText)
forall a b. Coercible a b => a -> b
coerce (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
BS.span
instance VisualStream AsciiText where
{-# INLINEABLE showTokens #-}
showTokens :: Proxy AsciiText -> NonEmpty (Token AsciiText) -> String
showTokens Proxy AsciiText
_ = (Word8 -> Char) -> [Word8] -> String
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Char
chr (Int -> Char) -> (Word8 -> Int) -> Word8 -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral) ([Word8] -> String)
-> (NonEmpty AsciiChar -> [Word8]) -> NonEmpty AsciiChar -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @_ @[Word8] ([AsciiChar] -> [Word8])
-> (NonEmpty AsciiChar -> [AsciiChar])
-> NonEmpty AsciiChar
-> [Word8]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty AsciiChar -> [AsciiChar]
forall a. NonEmpty a -> [a]
NE.toList
instance TraversableStream AsciiText where
{-# INLINEABLE reachOffset #-}
reachOffset :: Int -> PosState AsciiText -> (Maybe String, PosState AsciiText)
reachOffset Int
o PosState AsciiText
ps = (Maybe String, PosState AsciiText)
-> (Maybe String, PosState AsciiText)
forall a b. Coercible a b => a -> b
coerce (Int -> PosState AsciiText -> (Maybe String, PosState AsciiText)
forall s.
TraversableStream s =>
Int -> PosState s -> (Maybe String, PosState s)
reachOffset Int
o PosState AsciiText
ps)
isJustAscii :: Word8 -> Maybe Char
isJustAscii :: Word8 -> Maybe Char
isJustAscii Word8
w8 =
if Char -> Bool
isAscii Char
asChar
then Char -> Maybe Char
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Char
asChar
else Maybe Char
forall a. Maybe a
Nothing
where
asChar :: Char
asChar :: Char
asChar = Int -> Char
chr (Int -> Char) -> (Word8 -> Int) -> Word8 -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word8 -> Char) -> Word8 -> Char
forall a b. (a -> b) -> a -> b
$ Word8
w8