{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}

-- |
-- Module: Text.Ascii.Internal
-- Copyright: (C) 2021 Koz Ross
-- License: Apache 2.0
-- Maintainer: Koz Ross <koz.ross@retro-freedom.nz>
-- Stability: unstable, not subject to PVP
-- Portability: GHC only
--
-- This is an internal module, and is /not/ subject to the PVP. It can change
-- in any way, at any time, and should not be depended on unless you know
-- /exactly/ what you are doing. You have been warned.
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)

-- | Represents valid ASCII characters, which are bytes from @0x00@ to @0x7f@.
--
-- @since 1.0.0
newtype AsciiChar = AsciiChar {AsciiChar -> Word8
toByte :: Word8}
  deriving
    ( -- | @since 1.0.0
      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,
      -- | @since 1.0.0
      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,
      -- | @since 1.0.0
      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,
      -- | @since 1.0.0
      AsciiChar -> ()
(AsciiChar -> ()) -> NFData AsciiChar
forall a. (a -> ()) -> NFData a
$crnf :: AsciiChar -> ()
rnf :: AsciiChar -> ()
NFData
    )
    via Word8
  deriving stock
    ( -- | @since 1.0.0
      Typeable
    )

-- | @since 1.0.0
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
"'"

-- | @since 1.0.0
instance Bounded AsciiChar where
  {-# INLINEABLE minBound #-}
  minBound :: AsciiChar
minBound = Word8 -> AsciiChar
AsciiChar Word8
0
  {-# INLINEABLE maxBound #-}
  maxBound :: AsciiChar
maxBound = Word8 -> AsciiChar
AsciiChar Word8
127

-- | @since 1.0.1
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

-- | View an 'AsciiChar' as its underlying byte. You can pattern match on this,
-- but since there are more bytes than valid ASCII characters, you cannot use
-- this to construct.
--
-- @since 1.0.0
pattern AsByte :: Word8 -> AsciiChar
pattern $mAsByte :: forall {r}. AsciiChar -> (Word8 -> r) -> ((# #) -> r) -> r
AsByte w8 <- AsciiChar w8

-- | View an 'AsciiChar' as a 'Char'. You can pattern match on this, but since
-- there are more 'Char's than valid ASCII characters, you cannot use this to
-- construct.
--
-- @since 1.0.0
pattern AsChar :: Char -> AsciiChar
pattern $mAsChar :: forall {r}. AsciiChar -> (Char -> r) -> ((# #) -> r) -> r
AsChar c <- AsciiChar (isJustAscii -> Just c)

{-# COMPLETE AsByte #-}

{-# COMPLETE AsChar #-}

-- | A string of ASCII characters, represented as a packed byte array.
--
-- @since 1.0.0
newtype AsciiText = AsciiText ByteString
  deriving
    ( -- | @since 1.0.0
      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,
      -- | @since 1.0.0
      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,
      -- | @since 1.0.0
      AsciiText -> ()
(AsciiText -> ()) -> NFData AsciiText
forall a. (a -> ()) -> NFData a
$crnf :: AsciiText -> ()
rnf :: AsciiText -> ()
NFData,
      -- | @since 1.0.0
      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,
      -- | @since 1.0.0
      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,
      -- | @since 1.0.0
      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,
      -- | @since 1.2
      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,
      -- | @since 1.2
      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,
      -- | @since 1.2
      LeftReductive AsciiText
LeftReductive AsciiText => LeftCancellative AsciiText
forall m. LeftReductive m => LeftCancellative m
LeftCancellative,
      -- | @since 1.2
      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,
      -- | @since 1.2
      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,
      -- | @since 1.2
      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,
      -- | @since 1.2
      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,
      -- | @since 1.2
      MonoidNull AsciiText
MonoidNull AsciiText => PositiveMonoid AsciiText
forall m. MonoidNull m => PositiveMonoid m
PositiveMonoid,
      -- | @since 1.2
      RightReductive AsciiText
RightReductive AsciiText => RightCancellative AsciiText
forall m. RightReductive m => RightCancellative m
RightCancellative,
      -- | @since 1.2
      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,
      -- | @since 1.2
      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,
      -- | @since 1.2
      Factorial AsciiText
Factorial AsciiText => StableFactorial AsciiText
forall m. Factorial m => StableFactorial m
StableFactorial
    )
    via ByteString

-- | @since 1.0.0
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

-- | @since 1.0.1
type instance Index AsciiText = Int

-- | @since 1.0.1
type instance IxValue AsciiText = AsciiChar

-- | @since 1.0.1
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')

-- | @since 1.0.1
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

-- | @since 1.0.1
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

-- | @since 1.0.1
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

-- | @since 1.0.1
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)

-- Helpers

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