{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Text.Ascii
(
AsciiText,
empty,
singleton,
ascii,
cons,
snoc,
uncons,
unsnoc,
length,
map,
intercalate,
intersperse,
transpose,
reverse,
replace,
justifyLeft,
justifyRight,
center,
foldl,
foldl',
foldr,
foldr',
concat,
concatMap,
scanl,
scanr,
mapAccumL,
mapAccumR,
replicate,
unfoldr,
unfoldrN,
take,
takeEnd,
drop,
dropEnd,
takeWhile,
takeWhileEnd,
dropWhile,
dropWhileEnd,
dropAround,
strip,
stripStart,
stripEnd,
splitAt,
breakOn,
breakOnEnd,
break,
span,
group,
groupBy,
inits,
tails,
splitOn,
split,
chunksOf,
lines,
unlines,
words,
unwords,
stripPrefix,
stripSuffix,
stripInfix,
commonPrefixes,
filter,
breakOnAll,
find,
partition,
index,
findIndex,
count,
zip,
zipWith,
fromText,
eitherFromText,
fromByteString,
eitherFromByteString,
toText,
toByteString,
textWise,
byteStringWise,
packedChars,
chars,
packedBytes,
bytes,
)
where
import Control.Category ((.))
import Data.Bifunctor (first)
import Data.Bool (Bool (False, True), otherwise, (&&))
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Optics as BSO
import Data.Char (isAscii)
import Data.Coerce (coerce)
import Data.Foldable (Foldable (foldMap))
import qualified Data.Foldable as F
import Data.Int (Int64)
import qualified Data.List as L
import Data.Maybe (Maybe (Just, Nothing))
import Data.Text (Text)
import qualified Data.Text as T
import Data.Text.Encoding (decodeUtf8, encodeUtf8)
import Data.Word (Word8)
import Optics.Coerce (coerceA, coerceB, coerceS, coerceT)
import Optics.Getter (Getter, view)
import Optics.Iso (Iso')
import Optics.IxFold (IxFold)
import Optics.IxTraversal (IxTraversal')
import Optics.Optic (castOptic)
import Optics.Prism (Prism', prism')
import Optics.Review (Review, review)
import Text.Ascii.Internal (AsciiChar (AsciiChar), AsciiText (AsciiText))
import Text.Ascii.QQ (ascii, char)
import Prelude
( Int,
not,
pure,
($),
(+),
(-),
(/=),
(<),
(<$>),
(<=),
(<>),
(==),
(>),
(>=),
(||),
)
import qualified Prelude as P
empty :: AsciiText
empty :: AsciiText
empty = ByteString -> AsciiText
coerce ByteString
BS.empty
{-# INLINE [1] singleton #-}
singleton :: AsciiChar -> AsciiText
singleton :: AsciiChar -> AsciiText
singleton = (Word8 -> ByteString) -> AsciiChar -> AsciiText
coerce Word8 -> ByteString
BS.singleton
{-# INLINE cons #-}
cons :: AsciiChar -> AsciiText -> AsciiText
cons :: AsciiChar -> AsciiText -> AsciiText
cons = (Word8 -> ByteString -> ByteString)
-> AsciiChar -> AsciiText -> AsciiText
coerce Word8 -> ByteString -> ByteString
BS.cons
{-# INLINE snoc #-}
snoc :: AsciiText -> AsciiChar -> AsciiText
snoc :: AsciiText -> AsciiChar -> AsciiText
snoc = (ByteString -> Word8 -> ByteString)
-> AsciiText -> AsciiChar -> AsciiText
coerce ByteString -> Word8 -> ByteString
BS.snoc
{-# INLINE uncons #-}
uncons :: AsciiText -> Maybe (AsciiChar, AsciiText)
uncons :: AsciiText -> Maybe (AsciiChar, AsciiText)
uncons = (ByteString -> Maybe (Word8, ByteString))
-> AsciiText -> Maybe (AsciiChar, AsciiText)
coerce ByteString -> Maybe (Word8, ByteString)
BS.uncons
{-# INLINE unsnoc #-}
unsnoc :: AsciiText -> Maybe (AsciiText, AsciiChar)
unsnoc :: AsciiText -> Maybe (AsciiText, AsciiChar)
unsnoc = (ByteString -> Maybe (ByteString, Word8))
-> AsciiText -> Maybe (AsciiText, AsciiChar)
coerce ByteString -> Maybe (ByteString, Word8)
BS.unsnoc
{-# INLINE length #-}
length :: AsciiText -> Int
length :: AsciiText -> Int
length = (ByteString -> Int) -> AsciiText -> Int
coerce ByteString -> Int
BS.length
{-# INLINE map #-}
map :: (AsciiChar -> AsciiChar) -> AsciiText -> AsciiText
map :: (AsciiChar -> AsciiChar) -> AsciiText -> AsciiText
map = ((Word8 -> Word8) -> ByteString -> ByteString)
-> (AsciiChar -> AsciiChar) -> AsciiText -> AsciiText
coerce (Word8 -> Word8) -> ByteString -> ByteString
BS.map
{-# INLINE [1] intercalate #-}
intercalate :: AsciiText -> [AsciiText] -> AsciiText
intercalate :: AsciiText -> [AsciiText] -> AsciiText
intercalate = (ByteString -> [ByteString] -> ByteString)
-> AsciiText -> [AsciiText] -> AsciiText
coerce ByteString -> [ByteString] -> ByteString
BS.intercalate
intersperse :: AsciiChar -> AsciiText -> AsciiText
intersperse :: AsciiChar -> AsciiText -> AsciiText
intersperse = (Word8 -> ByteString -> ByteString)
-> AsciiChar -> AsciiText -> AsciiText
coerce Word8 -> ByteString -> ByteString
BS.intersperse
transpose :: [AsciiText] -> [AsciiText]
transpose :: [AsciiText] -> [AsciiText]
transpose = ([ByteString] -> [ByteString]) -> [AsciiText] -> [AsciiText]
coerce [ByteString] -> [ByteString]
BS.transpose
reverse :: AsciiText -> AsciiText
reverse :: AsciiText -> AsciiText
reverse = (ByteString -> ByteString) -> AsciiText -> AsciiText
coerce ByteString -> ByteString
BS.reverse
replace ::
AsciiText ->
AsciiText ->
AsciiText ->
AsciiText
replace :: AsciiText -> AsciiText -> AsciiText -> AsciiText
replace AsciiText
needle AsciiText
replacement AsciiText
haystack
| AsciiText -> Int
length AsciiText
needle Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 Bool -> Bool -> Bool
|| AsciiText -> Int
length AsciiText
haystack Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = AsciiText
haystack
| AsciiText -> Int
length AsciiText
needle Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> AsciiText -> Int
length AsciiText
haystack = AsciiText
haystack
| Bool
otherwise = AsciiText -> [AsciiText] -> AsciiText
intercalate AsciiText
replacement ([AsciiText] -> AsciiText)
-> (AsciiText -> [AsciiText]) -> AsciiText -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. AsciiText -> AsciiText -> [AsciiText]
splitOn AsciiText
needle (AsciiText -> AsciiText) -> AsciiText -> AsciiText
forall a b. (a -> b) -> a -> b
$ AsciiText
haystack
justifyLeft :: Int -> AsciiChar -> AsciiText -> AsciiText
justifyLeft :: Int -> AsciiChar -> AsciiText -> AsciiText
justifyLeft Int
n AsciiChar
c AsciiText
t = AsciiText
t AsciiText -> AsciiText -> AsciiText
forall a. Semigroup a => a -> a -> a
<> Int -> AsciiText -> AsciiText
replicate (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- AsciiText -> Int
length AsciiText
t) (AsciiChar -> AsciiText
singleton AsciiChar
c)
justifyRight :: Int -> AsciiChar -> AsciiText -> AsciiText
justifyRight :: Int -> AsciiChar -> AsciiText -> AsciiText
justifyRight Int
n AsciiChar
c AsciiText
t = Int -> AsciiText -> AsciiText
replicate (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- AsciiText -> Int
length AsciiText
t) (AsciiChar -> AsciiText
singleton AsciiChar
c) AsciiText -> AsciiText -> AsciiText
forall a. Semigroup a => a -> a -> a
<> AsciiText
t
center :: Int -> AsciiChar -> AsciiText -> AsciiText
center :: Int -> AsciiChar -> AsciiText -> AsciiText
center Int
n AsciiChar
c AsciiText
t
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= AsciiText -> Int
length AsciiText
t = AsciiText
t
| Int -> Bool
forall a. Integral a => a -> Bool
P.even (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- AsciiText -> Int
length AsciiText
t) = AsciiText
copied AsciiText -> AsciiText -> AsciiText
forall a. Semigroup a => a -> a -> a
<> AsciiText
t AsciiText -> AsciiText -> AsciiText
forall a. Semigroup a => a -> a -> a
<> AsciiText
copied
| Bool
otherwise = AsciiText
copied AsciiText -> AsciiText -> AsciiText
forall a. Semigroup a => a -> a -> a
<> AsciiChar -> AsciiText
singleton AsciiChar
c AsciiText -> AsciiText -> AsciiText
forall a. Semigroup a => a -> a -> a
<> AsciiText
t AsciiText -> AsciiText -> AsciiText
forall a. Semigroup a => a -> a -> a
<> AsciiText
copied
where
copied :: AsciiText
copied :: AsciiText
copied = Int -> AsciiText -> AsciiText
replicate ((Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- AsciiText -> Int
length AsciiText
t) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`P.div` Int
2) (AsciiChar -> AsciiText
singleton AsciiChar
c)
{-# INLINE foldl #-}
foldl :: (a -> AsciiChar -> a) -> a -> AsciiText -> a
foldl :: forall a. (a -> AsciiChar -> a) -> a -> AsciiText -> a
foldl a -> AsciiChar -> a
f a
x (AsciiText ByteString
bs) = (a -> Word8 -> a) -> a -> ByteString -> a
forall a. (a -> Word8 -> a) -> a -> ByteString -> a
BS.foldl ((a -> AsciiChar -> a) -> a -> Word8 -> a
coerce a -> AsciiChar -> a
f) a
x ByteString
bs
{-# INLINE foldl' #-}
foldl' :: (a -> AsciiChar -> a) -> a -> AsciiText -> a
foldl' :: forall a. (a -> AsciiChar -> a) -> a -> AsciiText -> a
foldl' a -> AsciiChar -> a
f a
x (AsciiText ByteString
bs) = (a -> Word8 -> a) -> a -> ByteString -> a
forall a. (a -> Word8 -> a) -> a -> ByteString -> a
BS.foldl' ((a -> AsciiChar -> a) -> a -> Word8 -> a
coerce a -> AsciiChar -> a
f) a
x ByteString
bs
{-# INLINE foldr #-}
foldr :: (AsciiChar -> a -> a) -> a -> AsciiText -> a
foldr :: forall a. (AsciiChar -> a -> a) -> a -> AsciiText -> a
foldr AsciiChar -> a -> a
f a
x (AsciiText ByteString
bs) = (Word8 -> a -> a) -> a -> ByteString -> a
forall a. (Word8 -> a -> a) -> a -> ByteString -> a
BS.foldr ((AsciiChar -> a -> a) -> Word8 -> a -> a
coerce AsciiChar -> a -> a
f) a
x ByteString
bs
{-# INLINE foldr' #-}
foldr' :: (AsciiChar -> a -> a) -> a -> AsciiText -> a
foldr' :: forall a. (AsciiChar -> a -> a) -> a -> AsciiText -> a
foldr' AsciiChar -> a -> a
f a
x (AsciiText ByteString
bs) = (Word8 -> a -> a) -> a -> ByteString -> a
forall a. (Word8 -> a -> a) -> a -> ByteString -> a
BS.foldr' ((AsciiChar -> a -> a) -> Word8 -> a -> a
coerce AsciiChar -> a -> a
f) a
x ByteString
bs
concat :: [AsciiText] -> AsciiText
concat :: [AsciiText] -> AsciiText
concat = ([ByteString] -> ByteString) -> [AsciiText] -> AsciiText
coerce [ByteString] -> ByteString
BS.concat
concatMap :: (AsciiChar -> AsciiText) -> AsciiText -> AsciiText
concatMap :: (AsciiChar -> AsciiText) -> AsciiText -> AsciiText
concatMap = ((Word8 -> ByteString) -> ByteString -> ByteString)
-> (AsciiChar -> AsciiText) -> AsciiText -> AsciiText
coerce (Word8 -> ByteString) -> ByteString -> ByteString
BS.concatMap
{-# INLINE scanl #-}
scanl ::
(AsciiChar -> AsciiChar -> AsciiChar) ->
AsciiChar ->
AsciiText ->
AsciiText
scanl :: (AsciiChar -> AsciiChar -> AsciiChar)
-> AsciiChar -> AsciiText -> AsciiText
scanl = ((Word8 -> Word8 -> Word8) -> Word8 -> ByteString -> ByteString)
-> (AsciiChar -> AsciiChar -> AsciiChar)
-> AsciiChar
-> AsciiText
-> AsciiText
coerce (Word8 -> Word8 -> Word8) -> Word8 -> ByteString -> ByteString
BS.scanl
{-# INLINE scanr #-}
scanr ::
(AsciiChar -> AsciiChar -> AsciiChar) ->
AsciiChar ->
AsciiText ->
AsciiText
scanr :: (AsciiChar -> AsciiChar -> AsciiChar)
-> AsciiChar -> AsciiText -> AsciiText
scanr = ((Word8 -> Word8 -> Word8) -> Word8 -> ByteString -> ByteString)
-> (AsciiChar -> AsciiChar -> AsciiChar)
-> AsciiChar
-> AsciiText
-> AsciiText
coerce (Word8 -> Word8 -> Word8) -> Word8 -> ByteString -> ByteString
BS.scanr
{-# INLINE mapAccumL #-}
mapAccumL :: (a -> AsciiChar -> (a, AsciiChar)) -> a -> AsciiText -> (a, AsciiText)
mapAccumL :: forall a.
(a -> AsciiChar -> (a, AsciiChar))
-> a -> AsciiText -> (a, AsciiText)
mapAccumL a -> AsciiChar -> (a, AsciiChar)
f a
x (AsciiText ByteString
bs) = ByteString -> AsciiText
AsciiText (ByteString -> AsciiText) -> (a, ByteString) -> (a, AsciiText)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> Word8 -> (a, Word8)) -> a -> ByteString -> (a, ByteString)
forall acc.
(acc -> Word8 -> (acc, Word8))
-> acc -> ByteString -> (acc, ByteString)
BS.mapAccumL ((a -> AsciiChar -> (a, AsciiChar)) -> a -> Word8 -> (a, Word8)
coerce a -> AsciiChar -> (a, AsciiChar)
f) a
x ByteString
bs
{-# INLINE mapAccumR #-}
mapAccumR :: (a -> AsciiChar -> (a, AsciiChar)) -> a -> AsciiText -> (a, AsciiText)
mapAccumR :: forall a.
(a -> AsciiChar -> (a, AsciiChar))
-> a -> AsciiText -> (a, AsciiText)
mapAccumR a -> AsciiChar -> (a, AsciiChar)
f a
x (AsciiText ByteString
bs) = ByteString -> AsciiText
AsciiText (ByteString -> AsciiText) -> (a, ByteString) -> (a, AsciiText)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> Word8 -> (a, Word8)) -> a -> ByteString -> (a, ByteString)
forall acc.
(acc -> Word8 -> (acc, Word8))
-> acc -> ByteString -> (acc, ByteString)
BS.mapAccumL ((a -> AsciiChar -> (a, AsciiChar)) -> a -> Word8 -> (a, Word8)
coerce a -> AsciiChar -> (a, AsciiChar)
f) a
x ByteString
bs
replicate :: Int -> AsciiText -> AsciiText
replicate :: Int -> AsciiText -> AsciiText
replicate Int
n AsciiText
t
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = AsciiText
empty
| Bool
otherwise = [AsciiText] -> AsciiText
concat ([AsciiText] -> AsciiText)
-> (AsciiText -> [AsciiText]) -> AsciiText -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> AsciiText -> [AsciiText]
forall a. Int -> a -> [a]
P.replicate Int
n (AsciiText -> AsciiText) -> AsciiText -> AsciiText
forall a b. (a -> b) -> a -> b
$ AsciiText
t
{-# INLINE unfoldr #-}
unfoldr :: (a -> Maybe (AsciiChar, a)) -> a -> AsciiText
unfoldr :: forall a. (a -> Maybe (AsciiChar, a)) -> a -> AsciiText
unfoldr a -> Maybe (AsciiChar, a)
f = ByteString -> AsciiText
AsciiText (ByteString -> AsciiText) -> (a -> ByteString) -> a -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (a -> Maybe (Word8, a)) -> a -> ByteString
forall a. (a -> Maybe (Word8, a)) -> a -> ByteString
BS.unfoldr ((a -> Maybe (AsciiChar, a)) -> a -> Maybe (Word8, a)
coerce a -> Maybe (AsciiChar, a)
f)
{-# INLINE unfoldrN #-}
unfoldrN :: Int -> (a -> Maybe (AsciiChar, a)) -> a -> (AsciiText, Maybe a)
unfoldrN :: forall a.
Int -> (a -> Maybe (AsciiChar, a)) -> a -> (AsciiText, Maybe a)
unfoldrN Int
n a -> Maybe (AsciiChar, a)
f = (ByteString -> AsciiText)
-> (ByteString, Maybe a) -> (AsciiText, Maybe a)
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first ByteString -> AsciiText
AsciiText ((ByteString, Maybe a) -> (AsciiText, Maybe a))
-> (a -> (ByteString, Maybe a)) -> a -> (AsciiText, Maybe a)
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> (a -> Maybe (Word8, a)) -> a -> (ByteString, Maybe a)
forall a.
Int -> (a -> Maybe (Word8, a)) -> a -> (ByteString, Maybe a)
BS.unfoldrN Int
n ((a -> Maybe (AsciiChar, a)) -> a -> Maybe (Word8, a)
coerce a -> Maybe (AsciiChar, a)
f)
{-# INLINE take #-}
take :: Int -> AsciiText -> AsciiText
take :: Int -> AsciiText -> AsciiText
take = (Int -> ByteString -> ByteString) -> Int -> AsciiText -> AsciiText
coerce Int -> ByteString -> ByteString
BS.take
takeEnd :: Int -> AsciiText -> AsciiText
takeEnd :: Int -> AsciiText -> AsciiText
takeEnd Int
n AsciiText
t = Int -> AsciiText -> AsciiText
drop (AsciiText -> Int
length AsciiText
t Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) AsciiText
t
{-# INLINE drop #-}
drop :: Int -> AsciiText -> AsciiText
drop :: Int -> AsciiText -> AsciiText
drop = (Int -> ByteString -> ByteString) -> Int -> AsciiText -> AsciiText
coerce Int -> ByteString -> ByteString
BS.drop
dropEnd :: Int -> AsciiText -> AsciiText
dropEnd :: Int -> AsciiText -> AsciiText
dropEnd Int
n AsciiText
t = Int -> AsciiText -> AsciiText
take (AsciiText -> Int
length AsciiText
t Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) AsciiText
t
{-# INLINE [1] takeWhile #-}
takeWhile :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
takeWhile :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
takeWhile AsciiChar -> Bool
f (AsciiText ByteString
at) = ByteString -> AsciiText
AsciiText (ByteString -> AsciiText)
-> (ByteString -> ByteString) -> ByteString -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Word8 -> Bool) -> ByteString -> ByteString
BS.takeWhile ((AsciiChar -> Bool) -> Word8 -> Bool
coerce AsciiChar -> Bool
f) (ByteString -> AsciiText) -> ByteString -> AsciiText
forall a b. (a -> b) -> a -> b
$ ByteString
at
{-# INLINE takeWhileEnd #-}
takeWhileEnd :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
takeWhileEnd :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
takeWhileEnd AsciiChar -> Bool
f = ByteString -> AsciiText
AsciiText (ByteString -> AsciiText)
-> (AsciiText -> ByteString) -> AsciiText -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Word8 -> Bool) -> ByteString -> ByteString
BS.takeWhileEnd ((AsciiChar -> Bool) -> Word8 -> Bool
coerce AsciiChar -> Bool
f) (ByteString -> ByteString)
-> (AsciiText -> ByteString) -> AsciiText -> ByteString
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. AsciiText -> ByteString
coerce
{-# INLINE [1] dropWhile #-}
dropWhile :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropWhile :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropWhile AsciiChar -> Bool
f (AsciiText ByteString
at) = ByteString -> AsciiText
AsciiText (ByteString -> AsciiText)
-> (ByteString -> ByteString) -> ByteString -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Word8 -> Bool) -> ByteString -> ByteString
BS.dropWhile ((AsciiChar -> Bool) -> Word8 -> Bool
coerce AsciiChar -> Bool
f) (ByteString -> AsciiText) -> ByteString -> AsciiText
forall a b. (a -> b) -> a -> b
$ ByteString
at
{-# INLINE dropWhileEnd #-}
dropWhileEnd :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropWhileEnd :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropWhileEnd AsciiChar -> Bool
f = ByteString -> AsciiText
AsciiText (ByteString -> AsciiText)
-> (AsciiText -> ByteString) -> AsciiText -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Word8 -> Bool) -> ByteString -> ByteString
BS.dropWhileEnd ((AsciiChar -> Bool) -> Word8 -> Bool
coerce AsciiChar -> Bool
f) (ByteString -> ByteString)
-> (AsciiText -> ByteString) -> AsciiText -> ByteString
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. AsciiText -> ByteString
coerce
dropAround :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropAround :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropAround AsciiChar -> Bool
p = (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropWhile AsciiChar -> Bool
p (AsciiText -> AsciiText)
-> (AsciiText -> AsciiText) -> AsciiText -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropWhileEnd AsciiChar -> Bool
p
strip :: AsciiText -> AsciiText
strip :: AsciiText -> AsciiText
strip = (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropAround AsciiChar -> Bool
isSpace
stripStart :: AsciiText -> AsciiText
stripStart :: AsciiText -> AsciiText
stripStart = (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropWhile AsciiChar -> Bool
isSpace
stripEnd :: AsciiText -> AsciiText
stripEnd :: AsciiText -> AsciiText
stripEnd = (AsciiChar -> Bool) -> AsciiText -> AsciiText
dropWhileEnd AsciiChar -> Bool
isSpace
{-# INLINE splitAt #-}
splitAt :: Int -> AsciiText -> (AsciiText, AsciiText)
splitAt :: Int -> AsciiText -> (AsciiText, AsciiText)
splitAt = (Int -> ByteString -> (ByteString, ByteString))
-> Int -> AsciiText -> (AsciiText, AsciiText)
coerce Int -> ByteString -> (ByteString, ByteString)
BS.splitAt
breakOn :: AsciiText -> AsciiText -> (AsciiText, AsciiText)
breakOn :: AsciiText -> AsciiText -> (AsciiText, AsciiText)
breakOn needle :: AsciiText
needle@(AsciiText ByteString
n) haystack :: AsciiText
haystack@(AsciiText ByteString
h)
| AsciiText -> Int
length AsciiText
needle Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = (AsciiText
empty, AsciiText
haystack)
| Bool
otherwise = case ByteString -> ByteString -> [Int]
indices ByteString
n ByteString
h of
[] -> (AsciiText
haystack, AsciiText
empty)
Int
ix : [Int]
_ -> Int -> AsciiText -> (AsciiText, AsciiText)
splitAt Int
ix AsciiText
haystack
breakOnEnd :: AsciiText -> AsciiText -> (AsciiText, AsciiText)
breakOnEnd :: AsciiText -> AsciiText -> (AsciiText, AsciiText)
breakOnEnd needle :: AsciiText
needle@(AsciiText ByteString
n) haystack :: AsciiText
haystack@(AsciiText ByteString
h)
| AsciiText -> Int
length AsciiText
needle Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = (AsciiText
haystack, AsciiText
empty)
| Bool
otherwise = case [Int] -> Maybe Int
go ([Int] -> Maybe Int)
-> (ByteString -> [Int]) -> ByteString -> Maybe Int
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> ByteString -> [Int]
indices ByteString
n (ByteString -> Maybe Int) -> ByteString -> Maybe Int
forall a b. (a -> b) -> a -> b
$ ByteString
h of
Maybe Int
Nothing -> (AsciiText
empty, AsciiText
haystack)
Just Int
ix -> Int -> AsciiText -> (AsciiText, AsciiText)
splitAt (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ AsciiText -> Int
length AsciiText
needle) AsciiText
haystack
where
go :: [Int] -> Maybe Int
go :: [Int] -> Maybe Int
go = \case
[] -> Maybe Int
forall a. Maybe a
Nothing
[Int
i] -> Int -> Maybe Int
forall a. a -> Maybe a
Just Int
i
(Int
_ : [Int]
is) -> [Int] -> Maybe Int
go [Int]
is
break :: (AsciiChar -> Bool) -> AsciiText -> (AsciiText, AsciiText)
break :: (AsciiChar -> Bool) -> AsciiText -> (AsciiText, AsciiText)
break = ((Word8 -> Bool) -> ByteString -> (ByteString, ByteString))
-> (AsciiChar -> Bool) -> AsciiText -> (AsciiText, AsciiText)
coerce (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
BS.break
{-# INLINE [1] span #-}
span :: (AsciiChar -> Bool) -> AsciiText -> (AsciiText, AsciiText)
span :: (AsciiChar -> Bool) -> AsciiText -> (AsciiText, AsciiText)
span = ((Word8 -> Bool) -> ByteString -> (ByteString, ByteString))
-> (AsciiChar -> Bool) -> AsciiText -> (AsciiText, AsciiText)
coerce (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
BS.span
group :: AsciiText -> [AsciiText]
group :: AsciiText -> [AsciiText]
group = (ByteString -> [ByteString]) -> AsciiText -> [AsciiText]
coerce ByteString -> [ByteString]
BS.group
groupBy :: (AsciiChar -> AsciiChar -> Bool) -> AsciiText -> [AsciiText]
groupBy :: (AsciiChar -> AsciiChar -> Bool) -> AsciiText -> [AsciiText]
groupBy = ((Word8 -> Word8 -> Bool) -> ByteString -> [ByteString])
-> (AsciiChar -> AsciiChar -> Bool) -> AsciiText -> [AsciiText]
coerce (Word8 -> Word8 -> Bool) -> ByteString -> [ByteString]
BS.groupBy
inits :: AsciiText -> [AsciiText]
inits :: AsciiText -> [AsciiText]
inits = (ByteString -> [ByteString]) -> AsciiText -> [AsciiText]
coerce ByteString -> [ByteString]
BS.inits
tails :: AsciiText -> [AsciiText]
tails :: AsciiText -> [AsciiText]
tails = (ByteString -> [ByteString]) -> AsciiText -> [AsciiText]
coerce ByteString -> [ByteString]
BS.tails
splitOn :: AsciiText -> AsciiText -> [AsciiText]
splitOn :: AsciiText -> AsciiText -> [AsciiText]
splitOn needle :: AsciiText
needle@(AsciiText ByteString
n) haystack :: AsciiText
haystack@(AsciiText ByteString
h)
| Int
needleLen Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = [AsciiText
haystack]
| AsciiText -> Int
length AsciiText
haystack Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = [AsciiText
empty]
| Int
needleLen Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = (AsciiChar -> Bool) -> AsciiText -> [AsciiText]
split (AsciiChar -> AsciiChar -> Bool
forall a. Eq a => a -> a -> Bool
== (Word8 -> AsciiChar
AsciiChar (Word8 -> AsciiChar)
-> (ByteString -> Word8) -> ByteString -> AsciiChar
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> Word8
BS.head (ByteString -> AsciiChar) -> ByteString -> AsciiChar
forall a b. (a -> b) -> a -> b
$ ByteString
n)) AsciiText
haystack
| Bool
otherwise = Int -> [Int] -> [AsciiText]
go Int
0 (ByteString -> ByteString -> [Int]
indices ByteString
n ByteString
h)
where
needleLen :: Int
needleLen :: Int
needleLen = AsciiText -> Int
length AsciiText
needle
go :: Int -> [Int] -> [AsciiText]
go :: Int -> [Int] -> [AsciiText]
go Int
pos = \case
[] -> [Int -> AsciiText -> AsciiText
drop Int
pos AsciiText
haystack]
(Int
ix : [Int]
ixes) ->
let chunkLen :: Int
chunkLen = Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
pos
segment :: AsciiText
segment = Int -> AsciiText -> AsciiText
take Int
chunkLen (AsciiText -> AsciiText)
-> (AsciiText -> AsciiText) -> AsciiText -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> AsciiText -> AsciiText
drop Int
pos (AsciiText -> AsciiText) -> AsciiText -> AsciiText
forall a b. (a -> b) -> a -> b
$ AsciiText
haystack
in AsciiText
segment AsciiText -> [AsciiText] -> [AsciiText]
forall a. a -> [a] -> [a]
: Int -> [Int] -> [AsciiText]
go (Int
pos Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
chunkLen Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
needleLen) [Int]
ixes
{-# INLINE split #-}
split :: (AsciiChar -> Bool) -> AsciiText -> [AsciiText]
split :: (AsciiChar -> Bool) -> AsciiText -> [AsciiText]
split = ((Word8 -> Bool) -> ByteString -> [ByteString])
-> (AsciiChar -> Bool) -> AsciiText -> [AsciiText]
coerce (Word8 -> Bool) -> ByteString -> [ByteString]
BS.splitWith
chunksOf :: Int -> AsciiText -> [AsciiText]
chunksOf :: Int -> AsciiText -> [AsciiText]
chunksOf Int
n AsciiText
t
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = []
| AsciiText
t AsciiText -> AsciiText -> Bool
forall a. Eq a => a -> a -> Bool
== AsciiText
empty = []
| Bool
otherwise = case Int -> AsciiText -> (AsciiText, AsciiText)
splitAt Int
n AsciiText
t of
(AsciiText
h, AsciiText
t') -> AsciiText
h AsciiText -> [AsciiText] -> [AsciiText]
forall a. a -> [a] -> [a]
: Int -> AsciiText -> [AsciiText]
chunksOf Int
n AsciiText
t'
lines :: AsciiText -> [AsciiText]
lines :: AsciiText -> [AsciiText]
lines (AsciiText ByteString
bs) = [ByteString] -> [AsciiText]
coerce ([ByteString] -> [AsciiText])
-> (ByteString -> [ByteString]) -> ByteString -> [AsciiText]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> [ByteString]
go (ByteString -> [AsciiText]) -> ByteString -> [AsciiText]
forall a b. (a -> b) -> a -> b
$ ByteString
bs
where
go :: ByteString -> [ByteString]
go :: ByteString -> [ByteString]
go ByteString
rest = case ByteString -> Maybe (Word8, ByteString)
BS.uncons ByteString
rest of
Maybe (Word8, ByteString)
Nothing -> []
Just (Word8, ByteString)
_ -> case (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
BS.break (Word8
0x0a Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
==) ByteString
rest of
(ByteString
h, ByteString
t) ->
ByteString
h ByteString -> [ByteString] -> [ByteString]
forall a. a -> [a] -> [a]
: case ByteString -> Maybe (Word8, ByteString)
BS.uncons ByteString
t of
Maybe (Word8, ByteString)
Nothing -> []
Just (Word8
_, ByteString
t') -> ByteString -> [ByteString]
go ByteString
t'
words :: AsciiText -> [AsciiText]
words :: AsciiText -> [AsciiText]
words (AsciiText ByteString
bs) = [ByteString] -> [AsciiText]
coerce ([ByteString] -> [AsciiText])
-> (ByteString -> [ByteString]) -> ByteString -> [AsciiText]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> [ByteString]
go (ByteString -> [AsciiText]) -> ByteString -> [AsciiText]
forall a b. (a -> b) -> a -> b
$ ByteString
bs
where
go :: ByteString -> [ByteString]
go :: ByteString -> [ByteString]
go ByteString
rest =
let rest' :: ByteString
rest' = (Word8 -> Bool) -> ByteString -> ByteString
BS.dropWhile Word8 -> Bool
isSep ByteString
rest
in case ByteString -> Int
BS.length ByteString
rest' of
Int
0 -> []
Int
_ -> case (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
BS.break Word8 -> Bool
isSep ByteString
rest' of
(ByteString
h, ByteString
t) -> ByteString
h ByteString -> [ByteString] -> [ByteString]
forall a. a -> [a] -> [a]
: ByteString -> [ByteString]
go ByteString
t
isSep :: Word8 -> Bool
isSep :: Word8 -> Bool
isSep Word8
w8
| Word8
w8 Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
32 = Bool
True
| Word8
9 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
13 = Bool
True
| Bool
otherwise = Bool
False
unlines :: (Foldable f) => f AsciiText -> AsciiText
unlines :: forall (f :: * -> *). Foldable f => f AsciiText -> AsciiText
unlines = (AsciiText -> AsciiText) -> f AsciiText -> AsciiText
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (AsciiText -> AsciiChar -> AsciiText
`snoc` [char| '\n' |])
unwords :: [AsciiText] -> AsciiText
unwords :: [AsciiText] -> AsciiText
unwords = AsciiText -> [AsciiText] -> AsciiText
intercalate [ascii| " " |]
stripPrefix :: AsciiText -> AsciiText -> Maybe AsciiText
stripPrefix :: AsciiText -> AsciiText -> Maybe AsciiText
stripPrefix = (ByteString -> ByteString -> Maybe ByteString)
-> AsciiText -> AsciiText -> Maybe AsciiText
coerce ByteString -> ByteString -> Maybe ByteString
BS.stripPrefix
stripSuffix :: AsciiText -> AsciiText -> Maybe AsciiText
stripSuffix :: AsciiText -> AsciiText -> Maybe AsciiText
stripSuffix = (ByteString -> ByteString -> Maybe ByteString)
-> AsciiText -> AsciiText -> Maybe AsciiText
coerce ByteString -> ByteString -> Maybe ByteString
BS.stripSuffix
stripInfix :: AsciiText -> AsciiText -> Maybe (AsciiText, AsciiText)
stripInfix :: AsciiText -> AsciiText -> Maybe (AsciiText, AsciiText)
stripInfix needle :: AsciiText
needle@(AsciiText ByteString
n) haystack :: AsciiText
haystack@(AsciiText ByteString
h)
| Int -> Int -> Int
forall a. Ord a => a -> a -> a
P.min (AsciiText -> Int
length AsciiText
needle) (AsciiText -> Int
length AsciiText
haystack) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Maybe (AsciiText, AsciiText)
forall a. Maybe a
Nothing
| Bool
otherwise = case ByteString -> ByteString -> [Int]
indices ByteString
n ByteString
h of
[] -> Maybe (AsciiText, AsciiText)
forall a. Maybe a
Nothing
(Int
ix : [Int]
_) -> (AsciiText, AsciiText) -> Maybe (AsciiText, AsciiText)
forall a. a -> Maybe a
Just (Int -> AsciiText -> AsciiText
take Int
ix AsciiText
haystack, Int -> AsciiText -> AsciiText
drop (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ AsciiText -> Int
length AsciiText
needle) AsciiText
haystack)
commonPrefixes :: AsciiText -> AsciiText -> Maybe (AsciiText, AsciiText, AsciiText)
commonPrefixes :: AsciiText -> AsciiText -> Maybe (AsciiText, AsciiText, AsciiText)
commonPrefixes (AsciiText ByteString
t1) (AsciiText ByteString
t2) =
Int -> (AsciiText, AsciiText, AsciiText)
go2 (Int -> (AsciiText, AsciiText, AsciiText))
-> Maybe Int -> Maybe (AsciiText, AsciiText, AsciiText)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Maybe Int -> Int -> Maybe Int) -> Maybe Int -> [Int] -> Maybe Int
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' Maybe Int -> Int -> Maybe Int
go Maybe Int
forall a. Maybe a
Nothing [Int
0 .. Int -> Int -> Int
forall a. Ord a => a -> a -> a
P.min (ByteString -> Int
BS.length ByteString
t1) (ByteString -> Int
BS.length ByteString
t2) Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
where
go :: Maybe Int -> Int -> Maybe Int
go :: Maybe Int -> Int -> Maybe Int
go Maybe Int
acc Int
i
| ByteString -> Int -> Word8
BS.index ByteString
t1 Int
i Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== ByteString -> Int -> Word8
BS.index ByteString
t2 Int
i = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
i
| Bool
otherwise = Maybe Int
acc
go2 :: Int -> (AsciiText, AsciiText, AsciiText)
go2 :: Int -> (AsciiText, AsciiText, AsciiText)
go2 Int
i = case Int -> ByteString -> (ByteString, ByteString)
BS.splitAt (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ByteString
t1 of
(ByteString
h, ByteString
t) -> (ByteString, ByteString, ByteString)
-> (AsciiText, AsciiText, AsciiText)
coerce (ByteString
h, ByteString
t, Int -> ByteString -> ByteString
BS.drop (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ByteString
t2)
{-# INLINE filter #-}
filter :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
filter :: (AsciiChar -> Bool) -> AsciiText -> AsciiText
filter = ((Word8 -> Bool) -> ByteString -> ByteString)
-> (AsciiChar -> Bool) -> AsciiText -> AsciiText
coerce (Word8 -> Bool) -> ByteString -> ByteString
BS.filter
breakOnAll :: AsciiText -> AsciiText -> [(AsciiText, AsciiText)]
breakOnAll :: AsciiText -> AsciiText -> [(AsciiText, AsciiText)]
breakOnAll needle :: AsciiText
needle@(AsciiText ByteString
n) haystack :: AsciiText
haystack@(AsciiText ByteString
h)
| AsciiText -> Int
length AsciiText
needle Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = [(AsciiText
haystack, AsciiText
empty)]
| AsciiText -> Int
length AsciiText
haystack Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = []
| Bool
otherwise = (Int -> AsciiText -> (AsciiText, AsciiText)
`splitAt` AsciiText
haystack) (Int -> (AsciiText, AsciiText))
-> [Int] -> [(AsciiText, AsciiText)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ByteString -> ByteString -> [Int]
indices ByteString
n ByteString
h
{-# INLINE find #-}
find :: (AsciiChar -> Bool) -> AsciiText -> Maybe AsciiChar
find :: (AsciiChar -> Bool) -> AsciiText -> Maybe AsciiChar
find = ((Word8 -> Bool) -> ByteString -> Maybe Word8)
-> (AsciiChar -> Bool) -> AsciiText -> Maybe AsciiChar
coerce (Word8 -> Bool) -> ByteString -> Maybe Word8
BS.find
partition :: (AsciiChar -> Bool) -> AsciiText -> (AsciiText, AsciiText)
partition :: (AsciiChar -> Bool) -> AsciiText -> (AsciiText, AsciiText)
partition = ((Word8 -> Bool) -> ByteString -> (ByteString, ByteString))
-> (AsciiChar -> Bool) -> AsciiText -> (AsciiText, AsciiText)
coerce (Word8 -> Bool) -> ByteString -> (ByteString, ByteString)
BS.partition
index :: AsciiText -> Int -> Maybe AsciiChar
index :: AsciiText -> Int -> Maybe AsciiChar
index AsciiText
at Int
i
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= AsciiText -> Int
length AsciiText
at = Maybe AsciiChar
forall a. Maybe a
Nothing
| Bool
otherwise = AsciiChar -> Maybe AsciiChar
forall a. a -> Maybe a
Just (AsciiChar -> Maybe AsciiChar)
-> (Int -> AsciiChar) -> Int -> Maybe AsciiChar
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (ByteString -> Int -> Word8) -> AsciiText -> Int -> AsciiChar
coerce ByteString -> Int -> Word8
BS.index AsciiText
at (Int -> Maybe AsciiChar) -> Int -> Maybe AsciiChar
forall a b. (a -> b) -> a -> b
$ Int
i
{-# INLINE [1] findIndex #-}
findIndex :: (AsciiChar -> Bool) -> AsciiText -> Maybe Int
findIndex :: (AsciiChar -> Bool) -> AsciiText -> Maybe Int
findIndex = ((Word8 -> Bool) -> ByteString -> Maybe Int)
-> (AsciiChar -> Bool) -> AsciiText -> Maybe Int
coerce (Word8 -> Bool) -> ByteString -> Maybe Int
BS.findIndex
count :: AsciiText -> AsciiText -> Int
count :: AsciiText -> AsciiText -> Int
count needle :: AsciiText
needle@(AsciiText ByteString
n) haystack :: AsciiText
haystack@(AsciiText ByteString
h)
| Int -> Int -> Int
forall a. Ord a => a -> a -> a
P.min (AsciiText -> Int
length AsciiText
needle) (AsciiText -> Int
length AsciiText
haystack) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Int
0
| AsciiText -> Int
length AsciiText
needle Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = Word8 -> ByteString -> Int
BS.count (ByteString -> Word8
BS.head ByteString
n) ByteString
h
| Bool
otherwise = [Int] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
P.length ([Int] -> Int) -> (ByteString -> [Int]) -> ByteString -> Int
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> ByteString -> [Int]
indices ByteString
n (ByteString -> Int) -> ByteString -> Int
forall a b. (a -> b) -> a -> b
$ ByteString
h
zip :: AsciiText -> AsciiText -> [(AsciiChar, AsciiChar)]
zip :: AsciiText -> AsciiText -> [(AsciiChar, AsciiChar)]
zip = (ByteString -> ByteString -> [(Word8, Word8)])
-> AsciiText -> AsciiText -> [(AsciiChar, AsciiChar)]
coerce ByteString -> ByteString -> [(Word8, Word8)]
BS.zip
zipWith ::
(AsciiChar -> AsciiChar -> AsciiChar) -> AsciiText -> AsciiText -> AsciiText
zipWith :: (AsciiChar -> AsciiChar -> AsciiChar)
-> AsciiText -> AsciiText -> AsciiText
zipWith AsciiChar -> AsciiChar -> AsciiChar
f AsciiText
t1 AsciiText
t2 = ((AsciiText, AsciiText)
-> Maybe (AsciiChar, (AsciiText, AsciiText)))
-> (AsciiText, AsciiText) -> AsciiText
forall a. (a -> Maybe (AsciiChar, a)) -> a -> AsciiText
unfoldr (AsciiText, AsciiText) -> Maybe (AsciiChar, (AsciiText, AsciiText))
go (AsciiText
t1, AsciiText
t2)
where
go :: (AsciiText, AsciiText) -> Maybe (AsciiChar, (AsciiText, AsciiText))
go :: (AsciiText, AsciiText) -> Maybe (AsciiChar, (AsciiText, AsciiText))
go (AsciiText
acc1, AsciiText
acc2) = do
(AsciiChar
h1, AsciiText
t1') <- AsciiText -> Maybe (AsciiChar, AsciiText)
uncons AsciiText
acc1
(AsciiChar
h2, AsciiText
t2') <- AsciiText -> Maybe (AsciiChar, AsciiText)
uncons AsciiText
acc2
(AsciiChar, (AsciiText, AsciiText))
-> Maybe (AsciiChar, (AsciiText, AsciiText))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AsciiChar -> AsciiChar -> AsciiChar
f AsciiChar
h1 AsciiChar
h2, (AsciiText
t1', AsciiText
t2'))
fromText :: Text -> Maybe AsciiText
fromText :: Text -> Maybe AsciiText
fromText Text
t = case (Char -> Bool) -> Text -> Maybe Char
T.find (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Char -> Bool
isAscii) Text
t of
Maybe Char
Nothing -> AsciiText -> Maybe AsciiText
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AsciiText -> Maybe AsciiText)
-> (Text -> AsciiText) -> Text -> Maybe AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> AsciiText
AsciiText (ByteString -> AsciiText)
-> (Text -> ByteString) -> Text -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> ByteString
encodeUtf8 (Text -> Maybe AsciiText) -> Text -> Maybe AsciiText
forall a b. (a -> b) -> a -> b
$ Text
t
Just Char
_ -> Maybe AsciiText
forall a. Maybe a
Nothing
eitherFromText :: Text -> P.Either P.Char AsciiText
eitherFromText :: Text -> Either Char AsciiText
eitherFromText Text
t = case (Char -> Bool) -> Text -> Maybe Char
T.find (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Char -> Bool
isAscii) Text
t of
Maybe Char
Nothing -> AsciiText -> Either Char AsciiText
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AsciiText -> Either Char AsciiText)
-> (Text -> AsciiText) -> Text -> Either Char AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> AsciiText
AsciiText (ByteString -> AsciiText)
-> (Text -> ByteString) -> Text -> AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> ByteString
encodeUtf8 (Text -> Either Char AsciiText) -> Text -> Either Char AsciiText
forall a b. (a -> b) -> a -> b
$ Text
t
Just Char
c -> Char -> Either Char AsciiText
forall a b. a -> Either a b
P.Left Char
c
fromByteString :: ByteString -> Maybe AsciiText
fromByteString :: ByteString -> Maybe AsciiText
fromByteString ByteString
bs = case (Word8 -> Bool) -> ByteString -> Maybe Word8
BS.find (Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
> Word8
127) ByteString
bs of
Maybe Word8
Nothing -> AsciiText -> Maybe AsciiText
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AsciiText -> Maybe AsciiText)
-> (ByteString -> AsciiText) -> ByteString -> Maybe AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> AsciiText
AsciiText (ByteString -> Maybe AsciiText) -> ByteString -> Maybe AsciiText
forall a b. (a -> b) -> a -> b
$ ByteString
bs
Just Word8
_ -> Maybe AsciiText
forall a. Maybe a
Nothing
eitherFromByteString :: ByteString -> P.Either Word8 AsciiText
eitherFromByteString :: ByteString -> Either Word8 AsciiText
eitherFromByteString ByteString
bs = case (Word8 -> Bool) -> ByteString -> Maybe Word8
BS.find (Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
> Word8
127) ByteString
bs of
Maybe Word8
Nothing -> AsciiText -> Either Word8 AsciiText
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AsciiText -> Either Word8 AsciiText)
-> (ByteString -> AsciiText)
-> ByteString
-> Either Word8 AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> AsciiText
AsciiText (ByteString -> Either Word8 AsciiText)
-> ByteString -> Either Word8 AsciiText
forall a b. (a -> b) -> a -> b
$ ByteString
bs
Just Word8
w8 -> Word8 -> Either Word8 AsciiText
forall a b. a -> Either a b
P.Left Word8
w8
toText :: AsciiText -> Text
toText :: AsciiText -> Text
toText (AsciiText ByteString
bs) = ByteString -> Text
decodeUtf8 ByteString
bs
toByteString :: AsciiText -> ByteString
toByteString :: AsciiText -> ByteString
toByteString = AsciiText -> ByteString
coerce
textWise :: Prism' Text AsciiText
textWise :: Prism' Text AsciiText
textWise = (AsciiText -> Text)
-> (Text -> Maybe AsciiText) -> Prism' Text AsciiText
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' AsciiText -> Text
toText Text -> Maybe AsciiText
fromText
byteStringWise :: Prism' ByteString AsciiText
byteStringWise :: Prism' ByteString AsciiText
byteStringWise = (AsciiText -> ByteString)
-> (ByteString -> Maybe AsciiText) -> Prism' ByteString AsciiText
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' AsciiText -> ByteString
toByteString ByteString -> Maybe AsciiText
fromByteString
packedChars :: Iso' [AsciiChar] AsciiText
packedChars :: Iso' [AsciiChar] AsciiText
packedChars =
Optic An_Iso NoIx [Word8] [AsciiChar] AsciiText AsciiText
-> Iso' [AsciiChar] AsciiText
forall s s' k (is :: IxList) t a b.
Coercible s s' =>
Optic k is s t a b -> Optic k is s' t a b
coerceS (Optic An_Iso NoIx [Word8] [AsciiChar] AsciiText AsciiText
-> Iso' [AsciiChar] AsciiText)
-> (Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [AsciiChar] AsciiText AsciiText)
-> Iso' [Word8] ByteString
-> Iso' [AsciiChar] AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
-> Optic An_Iso NoIx [Word8] [AsciiChar] AsciiText AsciiText
forall t t' k (is :: IxList) s a b.
Coercible t t' =>
Optic k is s t a b -> Optic k is s t' a b
coerceT (Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
-> Optic An_Iso NoIx [Word8] [AsciiChar] AsciiText AsciiText)
-> (Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText)
-> Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [AsciiChar] AsciiText AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
forall a a' k (is :: IxList) s t b.
Coercible a a' =>
Optic k is s t a b -> Optic k is s t a' b
coerceA (Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText)
-> (Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText)
-> Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText
forall b b' k (is :: IxList) s t a.
Coercible b b' =>
Optic k is s t a b -> Optic k is s t a b'
coerceB (Iso' [Word8] ByteString -> Iso' [AsciiChar] AsciiText)
-> Iso' [Word8] ByteString -> Iso' [AsciiChar] AsciiText
forall a b. (a -> b) -> a -> b
$ forall t. IsByteString t => Iso' [Word8] t
BSO.packedBytes @ByteString
chars :: IxTraversal' Int64 AsciiText AsciiChar
chars :: IxTraversal' Int64 AsciiText AsciiChar
chars = Optic
A_Traversal (WithIx Int64) ByteString AsciiText AsciiChar AsciiChar
-> IxTraversal' Int64 AsciiText AsciiChar
forall s s' k (is :: IxList) t a b.
Coercible s s' =>
Optic k is s t a b -> Optic k is s' t a b
coerceS (Optic
A_Traversal (WithIx Int64) ByteString AsciiText AsciiChar AsciiChar
-> IxTraversal' Int64 AsciiText AsciiChar)
-> (IxTraversal' Int64 ByteString Word8
-> Optic
A_Traversal
(WithIx Int64)
ByteString
AsciiText
AsciiChar
AsciiChar)
-> IxTraversal' Int64 ByteString Word8
-> IxTraversal' Int64 AsciiText AsciiChar
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Optic
A_Traversal
(WithIx Int64)
ByteString
ByteString
AsciiChar
AsciiChar
-> Optic
A_Traversal (WithIx Int64) ByteString AsciiText AsciiChar AsciiChar
forall t t' k (is :: IxList) s a b.
Coercible t t' =>
Optic k is s t a b -> Optic k is s t' a b
coerceT (Optic
A_Traversal
(WithIx Int64)
ByteString
ByteString
AsciiChar
AsciiChar
-> Optic
A_Traversal
(WithIx Int64)
ByteString
AsciiText
AsciiChar
AsciiChar)
-> (IxTraversal' Int64 ByteString Word8
-> Optic
A_Traversal
(WithIx Int64)
ByteString
ByteString
AsciiChar
AsciiChar)
-> IxTraversal' Int64 ByteString Word8
-> Optic
A_Traversal (WithIx Int64) ByteString AsciiText AsciiChar AsciiChar
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Optic
A_Traversal (WithIx Int64) ByteString ByteString Word8 AsciiChar
-> Optic
A_Traversal
(WithIx Int64)
ByteString
ByteString
AsciiChar
AsciiChar
forall a a' k (is :: IxList) s t b.
Coercible a a' =>
Optic k is s t a b -> Optic k is s t a' b
coerceA (Optic
A_Traversal (WithIx Int64) ByteString ByteString Word8 AsciiChar
-> Optic
A_Traversal
(WithIx Int64)
ByteString
ByteString
AsciiChar
AsciiChar)
-> (IxTraversal' Int64 ByteString Word8
-> Optic
A_Traversal (WithIx Int64) ByteString ByteString Word8 AsciiChar)
-> IxTraversal' Int64 ByteString Word8
-> Optic
A_Traversal
(WithIx Int64)
ByteString
ByteString
AsciiChar
AsciiChar
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IxTraversal' Int64 ByteString Word8
-> Optic
A_Traversal (WithIx Int64) ByteString ByteString Word8 AsciiChar
forall b b' k (is :: IxList) s t a.
Coercible b b' =>
Optic k is s t a b -> Optic k is s t a b'
coerceB (IxTraversal' Int64 ByteString Word8
-> IxTraversal' Int64 AsciiText AsciiChar)
-> IxTraversal' Int64 ByteString Word8
-> IxTraversal' Int64 AsciiText AsciiChar
forall a b. (a -> b) -> a -> b
$ forall t. IsByteString t => IxTraversal' Int64 t Word8
BSO.bytes @ByteString
packedBytes :: Prism' [Word8] AsciiText
packedBytes :: Prism' [Word8] AsciiText
packedBytes = (AsciiText -> [Word8])
-> ([Word8] -> Maybe AsciiText) -> Prism' [Word8] AsciiText
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' (Optic' A_Review NoIx [Word8] AsciiText -> AsciiText -> [Word8]
forall k (is :: IxList) t b.
Is k A_Review =>
Optic' k is t b -> b -> t
review Optic' A_Review NoIx [Word8] AsciiText
go) (([Word8] -> AsciiText) -> Maybe [Word8] -> Maybe AsciiText
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
P.fmap (Optic' A_Getter NoIx [Word8] AsciiText -> [Word8] -> AsciiText
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' A_Getter NoIx [Word8] AsciiText
go2) (Maybe [Word8] -> Maybe AsciiText)
-> ([Word8] -> Maybe [Word8]) -> [Word8] -> Maybe AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Word8 -> Maybe Word8) -> [Word8] -> Maybe [Word8]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
P.traverse Word8 -> Maybe Word8
asciify)
where
go :: Review [Word8] AsciiText
go :: Optic' A_Review NoIx [Word8] AsciiText
go = Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
-> Optic' A_Review NoIx [Word8] AsciiText
forall destKind srcKind (is :: IxList) s t a b.
Is srcKind destKind =>
Optic srcKind is s t a b -> Optic destKind is s t a b
castOptic (Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
-> Optic' A_Review NoIx [Word8] AsciiText)
-> (Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText)
-> Iso' [Word8] ByteString
-> Optic' A_Review NoIx [Word8] AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
forall a a' k (is :: IxList) s t b.
Coercible a a' =>
Optic k is s t a b -> Optic k is s t a' b
coerceA (Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText)
-> (Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText)
-> Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText
forall b b' k (is :: IxList) s t a.
Coercible b b' =>
Optic k is s t a b -> Optic k is s t a b'
coerceB (Iso' [Word8] ByteString -> Optic' A_Review NoIx [Word8] AsciiText)
-> Iso' [Word8] ByteString
-> Optic' A_Review NoIx [Word8] AsciiText
forall a b. (a -> b) -> a -> b
$ forall t. IsByteString t => Iso' [Word8] t
BSO.packedBytes @ByteString
go2 :: Getter [Word8] AsciiText
go2 :: Optic' A_Getter NoIx [Word8] AsciiText
go2 = Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
-> Optic' A_Getter NoIx [Word8] AsciiText
forall destKind srcKind (is :: IxList) s t a b.
Is srcKind destKind =>
Optic srcKind is s t a b -> Optic destKind is s t a b
castOptic (Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
-> Optic' A_Getter NoIx [Word8] AsciiText)
-> (Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText)
-> Iso' [Word8] ByteString
-> Optic' A_Getter NoIx [Word8] AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
forall a a' k (is :: IxList) s t b.
Coercible a a' =>
Optic k is s t a b -> Optic k is s t a' b
coerceA (Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText)
-> (Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText)
-> Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] AsciiText AsciiText
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Iso' [Word8] ByteString
-> Optic An_Iso NoIx [Word8] [Word8] ByteString AsciiText
forall b b' k (is :: IxList) s t a.
Coercible b b' =>
Optic k is s t a b -> Optic k is s t a b'
coerceB (Iso' [Word8] ByteString -> Optic' A_Getter NoIx [Word8] AsciiText)
-> Iso' [Word8] ByteString
-> Optic' A_Getter NoIx [Word8] AsciiText
forall a b. (a -> b) -> a -> b
$ forall t. IsByteString t => Iso' [Word8] t
BSO.packedBytes @ByteString
bytes :: IxFold Int64 AsciiText Word8
bytes :: IxFold Int64 AsciiText Word8
bytes = Optic A_Traversal (WithIx Int64) AsciiText AsciiText Word8 Word8
-> IxFold Int64 AsciiText Word8
forall destKind srcKind (is :: IxList) s t a b.
Is srcKind destKind =>
Optic srcKind is s t a b -> Optic destKind is s t a b
castOptic (Optic A_Traversal (WithIx Int64) AsciiText AsciiText Word8 Word8
-> IxFold Int64 AsciiText Word8)
-> (IxTraversal' Int64 ByteString Word8
-> Optic
A_Traversal (WithIx Int64) AsciiText AsciiText Word8 Word8)
-> IxTraversal' Int64 ByteString Word8
-> IxFold Int64 AsciiText Word8
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Optic A_Traversal (WithIx Int64) ByteString AsciiText Word8 Word8
-> Optic A_Traversal (WithIx Int64) AsciiText AsciiText Word8 Word8
forall s s' k (is :: IxList) t a b.
Coercible s s' =>
Optic k is s t a b -> Optic k is s' t a b
coerceS (Optic A_Traversal (WithIx Int64) ByteString AsciiText Word8 Word8
-> Optic
A_Traversal (WithIx Int64) AsciiText AsciiText Word8 Word8)
-> (IxTraversal' Int64 ByteString Word8
-> Optic
A_Traversal (WithIx Int64) ByteString AsciiText Word8 Word8)
-> IxTraversal' Int64 ByteString Word8
-> Optic A_Traversal (WithIx Int64) AsciiText AsciiText Word8 Word8
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IxTraversal' Int64 ByteString Word8
-> Optic
A_Traversal (WithIx Int64) ByteString AsciiText Word8 Word8
forall t t' k (is :: IxList) s a b.
Coercible t t' =>
Optic k is s t a b -> Optic k is s t' a b
coerceT (IxTraversal' Int64 ByteString Word8
-> IxFold Int64 AsciiText Word8)
-> IxTraversal' Int64 ByteString Word8
-> IxFold Int64 AsciiText Word8
forall a b. (a -> b) -> a -> b
$ forall t. IsByteString t => IxTraversal' Int64 t Word8
BSO.bytes @ByteString
isSpace :: AsciiChar -> Bool
isSpace :: AsciiChar -> Bool
isSpace (AsciiChar Word8
w8)
| Word8
w8 Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
32 = Bool
True
| Word8
9 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
13 = Bool
True
| Bool
otherwise = Bool
False
asciify :: Word8 -> Maybe Word8
asciify :: Word8 -> Maybe Word8
asciify Word8
w8
| Word8
w8 Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
127 = Word8 -> Maybe Word8
forall a. a -> Maybe a
Just Word8
w8
| Bool
otherwise = Maybe Word8
forall a. Maybe a
Nothing
indices :: ByteString -> ByteString -> [Int]
indices :: ByteString -> ByteString -> [Int]
indices ByteString
needle ByteString
haystack
| Int -> Int -> Int
forall a. Ord a => a -> a -> a
P.min Int
needleLen Int
haystackLen Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = []
| Int
needleLen Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = Word8 -> ByteString -> [Int]
BS.elemIndices (ByteString -> Word8
BS.head ByteString
needle) ByteString
haystack
| Bool
otherwise = (Int -> Maybe (Int, Int)) -> Int -> [Int]
forall b a. (b -> Maybe (a, b)) -> b -> [a]
L.unfoldr Int -> Maybe (Int, Int)
go Int
0
where
go :: Int -> Maybe (Int, Int)
go :: Int -> Maybe (Int, Int)
go Int
j
| Int
j Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> (Int
haystackLen Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
needleLen) = Maybe (Int, Int)
forall a. Maybe a
Nothing
| ByteString -> Int -> Word8
BS.index ByteString
needle Int
1 Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= ByteString -> Int -> Word8
BS.index ByteString
haystack (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) = Int -> Maybe (Int, Int)
go (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
kay)
| Bool
otherwise = do
let fragment :: ByteString
fragment = Int -> ByteString -> ByteString
BS.take Int
needleLen (ByteString -> ByteString)
-> (ByteString -> ByteString) -> ByteString -> ByteString
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> ByteString -> ByteString
BS.drop Int
j (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ ByteString
haystack
if ByteString
fragment ByteString -> ByteString -> Bool
forall a. Eq a => a -> a -> Bool
== ByteString
needle
then (Int, Int) -> Maybe (Int, Int)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
j, Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
needleLen)
else Int -> Maybe (Int, Int)
go (Int
j Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
ell)
kay :: Int
kay :: Int
kay
| ByteString -> Word8
BS.head ByteString
needle Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== ByteString -> Int -> Word8
BS.index ByteString
needle Int
1 = Int
2
| Bool
otherwise = Int
1
ell :: Int
ell :: Int
ell
| ByteString -> Word8
BS.head ByteString
needle Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== ByteString -> Int -> Word8
BS.index ByteString
needle Int
1 = Int
1
| Bool
otherwise = Int
2
needleLen :: Int
needleLen :: Int
needleLen = ByteString -> Int
BS.length ByteString
needle
haystackLen :: Int
haystackLen :: Int
haystackLen = ByteString -> Int
BS.length ByteString
haystack