-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | An efficient packed Unicode text type. -- -- An efficient packed, immutable Unicode text type (both strict and -- lazy). -- -- The Text type represents Unicode character strings, in a time -- and space-efficient manner. This package provides text processing -- capabilities that are optimized for performance critical use, both in -- terms of large data quantities and high speed. -- -- The Text type provides character-encoding, type-safe case -- conversion via whole-string case conversion functions (see -- Data.Text). It also provides a range of functions for -- converting Text values to and from ByteStrings, using -- several standard encodings (see Data.Text.Encoding). -- -- Efficient locale-sensitive support for text IO is also supported (see -- Data.Text.IO). -- -- These modules are intended to be imported qualified, to avoid name -- clashes with Prelude functions, e.g. -- --
-- import qualified Data.Text as T ---- --
-- import qualified Data.Text.Array as A ---- -- The names in this module resemble those in the Array family of -- modules, but are shorter due to the assumption of qualified naming. module Data.Text.Array -- | Immutable array type. type Array = ByteArray pattern ByteArray :: () => ByteArray# -> ByteArray -- | Mutable array type, for use in the ST monad. type MArray = MutableByteArray pattern MutableByteArray :: () => MutableByteArray# s -> MutableByteArray s resizeM :: MArray s -> Int -> ST s (MArray s) shrinkM :: MArray s -> Int -> ST s () -- | Copy some elements of a mutable array. copyM :: MArray s -> Int -> MArray s -> Int -> Int -> ST s () -- | Copy some elements of an immutable array. copyI :: Int -> MArray s -> Int -> Array -> Int -> ST s () -- | Copy from pointer. copyFromPointer :: MArray s -> Int -> Ptr Word8 -> Int -> ST s () -- | Copy to pointer. copyToPointer :: Array -> Int -> Ptr Word8 -> Int -> ST s () -- | An empty immutable array. empty :: Array -- | Compare portions of two arrays for equality. No bounds checking is -- performed. equal :: Array -> Int -> Array -> Int -> Int -> Bool -- | Compare portions of two arrays. No bounds checking is performed. compare :: Array -> Int -> Array -> Int -> Int -> Ordering -- | Run an action in the ST monad and return an immutable array of its -- result. run :: (forall s. () => ST s (MArray s)) -> Array -- | Run an action in the ST monad and return an immutable array of its -- result paired with whatever else the action returns. run2 :: (forall s. () => ST s (MArray s, a)) -> (Array, a) -- | Convert an immutable array to a list. toList :: Array -> Int -> Int -> [Word8] -- | Freeze a mutable array. Do not mutate the MArray afterwards! unsafeFreeze :: MArray s -> ST s Array -- | Unchecked read of an immutable array. May return garbage or crash on -- an out-of-bounds access. unsafeIndex :: Array -> Int -> Word8 -- | Create an uninitialized mutable array. new :: Int -> ST s (MArray s) -- | Create an uninitialized mutable pinned array. newPinned :: Int -> ST s (MArray s) newFilled :: Int -> Int -> ST s (MArray s) -- | Unchecked write of a mutable array. May return garbage or crash on an -- out-of-bounds access. unsafeWrite :: MArray s -> Int -> Word8 -> ST s () tile :: MArray s -> Int -> ST s () getSizeofMArray :: MArray s -> ST s Int -- | Types and functions for dealing with encoding and decoding errors in -- Unicode text. -- -- The standard functions for encoding and decoding text are strict, -- which is to say that they throw exceptions on invalid input. This is -- often unhelpful on real world input, so alternative functions exist -- that accept custom handlers for dealing with invalid inputs. These -- OnError handlers are normal Haskell functions. You can use one -- of the presupplied functions in this module, or you can write a custom -- handler of your own. module Data.Text.Encoding.Error -- | An exception type for representing Unicode encoding errors. data UnicodeException -- | Could not decode a byte sequence because it was invalid under the -- given encoding, or ran out of input in mid-decode. DecodeError :: String -> Maybe Word8 -> UnicodeException -- | Tried to encode a character that could not be represented under the -- given encoding, or ran out of input in mid-encode. -- | Deprecated: This constructor is never used, and will be -- removed. EncodeError :: String -> Maybe Char -> UnicodeException -- | Function type for handling a coding error. It is supplied with two -- inputs: -- --
-- >>> Data.Text.unpack (pack "\55555") -- "\65533" --pack :: String -> Text -- | Warning: this is an internal module, and does not have a stable -- API or name. Functions in this module may not check or enforce -- preconditions expected by public modules. Use at your own risk! module Data.Text.Internal.StrictBuilder -- | A delayed representation of strict Text. data StrictTextBuilder StrictTextBuilder :: {-# UNPACK #-} !Int -> (forall s. () => MArray s -> Int -> ST s ()) -> StrictTextBuilder [sbLength] :: StrictTextBuilder -> {-# UNPACK #-} !Int [sbWrite] :: StrictTextBuilder -> forall s. () => MArray s -> Int -> ST s () -- | A delayed representation of strict Text. -- | Deprecated: Use StrictTextBuilder instead type StrictBuilder = StrictTextBuilder -- | Use StrictBuilder to build Text. toText :: StrictTextBuilder -> Text fromChar :: Char -> StrictTextBuilder -- | Copy Text in a StrictBuilder fromText :: Text -> StrictTextBuilder -- | Copy a ByteString. -- -- Unsafe: This may not be valid UTF-8 text. unsafeFromByteString :: ByteString -> StrictTextBuilder -- | Unsafe: This may not be valid UTF-8 text. unsafeFromWord8 :: Word8 -> StrictTextBuilder instance GHC.Internal.Base.Monoid Data.Text.Internal.StrictBuilder.StrictTextBuilder instance GHC.Internal.Base.Semigroup Data.Text.Internal.StrictBuilder.StrictTextBuilder -- | Fast substring search for Text, based on work by Boyer, Moore, -- Horspool, Sunday, and Lundh. -- -- References: -- --
-- getNucleotides :: Text -> Text -- getNucleotides = -- unstream -- . filter isNucleotide -- . toLower -- . stream -- where -- isNucleotide chr = -- chr == 'a' || -- chr == 'c' || -- chr == 't' || -- chr == 'g' --module Data.Text.Internal.Fusion.Common -- | O(1) Convert a character into a Stream -- -- Properties -- --
-- unstream . singleton = singleton --singleton :: Char -> Stream Char -- | O(n) Convert a list into a Stream. -- -- Properties -- --
-- unstream . streamList = pack --streamList :: [a] -> Stream a -- | O(n) Convert a Stream into a list. -- -- Properties -- --
-- unstreamList . stream = unpack --unstreamList :: Stream a -> [a] -- | Stream the UTF-8-like packed encoding used by GHC to represent -- constant strings in generated code. -- -- This encoding uses the byte sequence "xc0x80" to represent NUL, and -- the string is NUL-terminated. -- -- Properties -- --
-- unstream . streamCString# addr# = unpackCString# addr# --streamCString# :: Addr# -> Stream Char -- | O(n) Adds a character to the front of a Stream Char. -- -- Properties -- --
-- unstream . cons c . stream = cons c --cons :: Char -> Stream Char -> Stream Char -- | O(n) Adds a character to the end of a stream. -- -- Properties -- --
-- unstream . snoc c . stream = snoc c --snoc :: Stream Char -> Char -> Stream Char -- | O(n) Appends one Stream to the other. -- -- Properties -- --
-- unstream (append (stream t1) (stream t2)) = append t1 t2 --append :: Stream Char -> Stream Char -> Stream Char -- | O(1) Returns the first character of a Stream -- Char, which must be non-empty. This is a partial function, -- consider using uncons. -- -- Properties -- --
-- head . stream = head --head :: HasCallStack => Stream Char -> Char -- | O(1) Returns the first character and remainder of a -- Stream Char, or Nothing if empty. -- -- Properties -- --
-- fmap fst . uncons . stream = fmap fst . uncons ---- --
-- fmap (unstream . snd) . uncons . stream = fmap snd . uncons --uncons :: Stream Char -> Maybe (Char, Stream Char) -- | O(n) Returns the last character of a Stream Char, -- which must be non-empty. -- -- Properties -- --
-- last . stream = last --last :: HasCallStack => Stream Char -> Char -- | O(1) Returns all characters after the head of a Stream -- Char, which must be non-empty. This is a partial function, -- consider using uncons. -- -- Properties -- --
-- unstream . tail . stream = tail --tail :: HasCallStack => Stream Char -> Stream Char -- | O(1) Returns all but the last character of a Stream -- Char, which must be non-empty. -- -- Properties -- --
-- unstream . init . stream = init --init :: HasCallStack => Stream Char -> Stream Char -- | O(1) Tests whether a Stream Char is empty or not. -- -- Properties -- --
-- null . stream = null --null :: Stream Char -> Bool -- | O(n) Returns the number of characters in a string. lengthI :: Integral a => Stream Char -> a -- | O(n) Compares the count of characters in a string to a number. -- -- This function gives the same answer as comparing against the result of -- lengthI, but can short circuit if the count of characters is -- greater than the number or if the stream can't possibly be as long as -- the number supplied, and hence be more efficient. compareLengthI :: Integral a => Stream Char -> a -> Ordering -- | O(n) Indicate whether a string contains exactly one element. -- -- Properties -- --
-- isSingleton . stream = isSingleton --isSingleton :: Stream Char -> Bool -- | O(n) map f xs is the Stream Char -- obtained by applying f to each element of xs. -- -- Properties -- --
-- unstream . map f . stream = map f --map :: (Char -> Char) -> Stream Char -> Stream Char -- | intercalate str strs inserts the stream str in between the streams -- strs and concatenates the result. -- -- Properties -- --
-- intercalate s = concat . intersperse s --intercalate :: Stream Char -> [Stream Char] -> Stream Char -- | O(n) Take a character and place it between each of the -- characters of a 'Stream Char'. -- -- Properties -- --
-- unstream . intersperse c . stream = intersperse c --intersperse :: Char -> Stream Char -> Stream Char -- | O(n) Convert a string to folded case. This function is mainly -- useful for performing caseless (or case insensitive) string -- comparisons. -- -- A string x is a caseless match for a string y if and -- only if: -- --
-- toCaseFold x == toCaseFold y ---- -- The result string may be longer than the input string, and may differ -- from applying toLower to the input string. For instance, the -- Armenian small ligature men now (U+FB13) is case folded to the bigram -- men now (U+0574 U+0576), while the micro sign (U+00B5) is case folded -- to the Greek small letter letter mu (U+03BC) instead of itself. toCaseFold :: Stream Char -> Stream Char -- | O(n) Convert a string to lower case, using simple case -- conversion. The result string may be longer than the input string. For -- instance, the Latin capital letter I with dot above (U+0130) maps to -- the sequence Latin small letter i (U+0069) followed by combining dot -- above (U+0307). -- -- Properties -- --
-- unstream . toLower . stream = toLower --toLower :: Stream Char -> Stream Char -- | O(n) Convert a string to title case, using simple case -- conversion. -- -- The first letter (as determined by isLetter) of the input is -- converted to title case, as is every subsequent letter that -- immediately follows a non-letter. Every letter that immediately -- follows another letter is converted to lower case. -- -- The result string may be longer than the input string. For example, -- the Latin small ligature fl (U+FB02) is converted to the sequence Latin -- capital letter F (U+0046) followed by Latin small letter l (U+006C). -- -- This function is not idempotent. Consider lower-case letter ʼn -- (U+0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE). Then -- toTitle "ʼn" = "ʼN": the first (and the only) -- letter of the input is converted to title case, becoming two letters. -- Now ʼ (U+02BC MODIFIER LETTER APOSTROPHE) is a modifier -- letter and as such is recognised as a letter by isLetter, so -- toTitle "ʼN" = "'n". -- -- Note: this function does not take language or culture specific -- rules into account. For instance, in English, different style guides -- disagree on whether the book name "The Hill of the Red Fox" is -- correctly title cased—but this function will capitalize every -- word. -- -- Properties -- --
-- unstream . toTitle . stream = toTitle --toTitle :: Stream Char -> Stream Char -- | O(n) Convert a string to upper case, using simple case -- conversion. The result string may be longer than the input string. For -- instance, the German eszett (U+00DF) maps to the two-letter sequence -- SS. -- -- Properties -- --
-- unstream . toUpper . stream = toUpper --toUpper :: Stream Char -> Stream Char justifyLeftI :: Integral a => a -> Char -> Stream Char -> Stream Char -- | foldl, applied to a binary operator, a starting value (typically the -- left-identity of the operator), and a Stream, reduces the -- Stream using the binary operator, from left to right. -- -- Properties -- --
-- foldl f z0 . stream = foldl f z0 --foldl :: (b -> Char -> b) -> b -> Stream Char -> b -- | A strict version of foldl. -- -- Properties -- --
-- foldl' f z0 . stream = foldl' f z0 --foldl' :: (b -> Char -> b) -> b -> Stream Char -> b -- | foldl1 is a variant of foldl that has no starting value argument, and -- thus must be applied to non-empty Streams. -- -- Properties -- --
-- foldl1 f . stream = foldl1 f --foldl1 :: HasCallStack => (Char -> Char -> Char) -> Stream Char -> Char -- | A strict version of foldl1. -- -- Properties -- --
-- foldl1' f . stream = foldl1' f --foldl1' :: HasCallStack => (Char -> Char -> Char) -> Stream Char -> Char -- | foldr, applied to a binary operator, a starting value -- (typically the right-identity of the operator), and a stream, reduces -- the stream using the binary operator, from right to left. -- -- Properties -- --
-- foldr f z0 . stream = foldr f z0 --foldr :: (Char -> b -> b) -> b -> Stream Char -> b -- | foldr1 is a variant of foldr that has no starting value -- argument, and thus must be applied to non-empty streams. -- -- Properties -- --
-- foldr1 f . stream = foldr1 f --foldr1 :: HasCallStack => (Char -> Char -> Char) -> Stream Char -> Char -- | A monadic version of foldl. -- -- Properties -- --
-- foldlM' f z0 . stream = foldlM' f z0 --foldlM' :: Monad m => (b -> Char -> m b) -> b -> Stream Char -> m b -- | O(n) Concatenate a list of streams. -- -- Properties -- --
-- unstream . concat . fmap stream = concat --concat :: [Stream Char] -> Stream Char -- | Map a function over a stream that results in a stream and concatenate -- the results. -- -- Properties -- --
-- unstream . concatMap (stream . f) . stream = concatMap f --concatMap :: (Char -> Stream Char) -> Stream Char -> Stream Char -- | O(n) any p xs determines if any character in the -- stream xs satisfies the predicate p. -- -- Properties -- --
-- any f . stream = any f --any :: (Char -> Bool) -> Stream Char -> Bool -- | O(n) all p xs determines if all characters in the -- Text xs satisfy the predicate p. -- -- Properties -- --
-- all f . stream = all f --all :: (Char -> Bool) -> Stream Char -> Bool -- | O(n) maximum returns the maximum value from a stream, which -- must be non-empty. -- -- Properties -- --
-- maximum . stream = maximum --maximum :: HasCallStack => Stream Char -> Char -- | O(n) minimum returns the minimum value from a Text, -- which must be non-empty. -- -- Properties -- --
-- minimum . stream = minimum --minimum :: HasCallStack => Stream Char -> Char -- | O(n) scanl is similar to foldl, but returns a -- stream of successive reduced values from the left. Conceptually, if we -- write the input stream as a list then we have: -- --
-- scanl f z [x1, x2, ...] == [z, z 'f' x1, (z 'f' x1) 'f' x2, ...] ---- -- Properties -- --
-- head (scanl f z xs) = z ---- --
-- last (scanl f z xs) = foldl f z xs --scanl :: (Char -> Char -> Char) -> Char -> Stream Char -> Stream Char -- | O(n) replicateCharI n c is a -- Stream Char of length n with c the -- value of every element. replicateCharI :: Integral a => a -> Char -> Stream Char -- | O(n*m) replicateI n t is a -- Stream Char consisting of the input t repeated -- n times. replicateI :: Int64 -> Stream Char -> Stream Char -- | O(n), where n is the length of the result. The unfoldr -- function is analogous to the List unfoldr. unfoldr builds a -- stream from a seed value. The function takes the element and returns -- Nothing if it is done producing the stream or returns Just (a,b), in -- which case, a is the next Char in the string, and b is the seed value -- for further production. -- -- Properties -- --
-- unstream . unfoldr f z = unfoldr f z --unfoldr :: (a -> Maybe (Char, a)) -> a -> Stream Char -- | O(n) Like unfoldr, unfoldrNI builds a stream from -- a seed value. However, the length of the result is limited by the -- first argument to unfoldrNI. This function is more efficient -- than unfoldr when the length of the result is known. -- -- Properties -- --
-- unstream (unfoldrNI n f z) = unfoldrN n f z --unfoldrNI :: Integral a => a -> (b -> Maybe (Char, b)) -> b -> Stream Char -- | O(n) take n, applied to a stream, returns the -- prefix of the stream of length n, or the stream itself if -- n is greater than the length of the stream. -- -- Properties -- --
-- unstream . take n . stream = take n --take :: Integral a => a -> Stream Char -> Stream Char -- | O(n) drop n, applied to a stream, returns the -- suffix of the stream after the first n characters, or the -- empty stream if n is greater than the length of the stream. -- -- Properties -- --
-- unstream . drop n . stream = drop n --drop :: Integral a => a -> Stream Char -> Stream Char -- | takeWhile, applied to a predicate p and a stream, -- returns the longest prefix (possibly empty) of elements that satisfy -- p. -- -- Properties -- --
-- unstream . takeWhile p . stream = takeWhile p --takeWhile :: (Char -> Bool) -> Stream Char -> Stream Char -- | dropWhile p xs returns the suffix remaining after -- takeWhile p xs. -- -- Properties -- --
-- unstream . dropWhile p . stream = dropWhile p --dropWhile :: (Char -> Bool) -> Stream Char -> Stream Char -- | O(n) The isPrefixOf function takes two Streams -- and returns True if and only if the first is a prefix of the -- second. -- -- Properties -- --
-- isPrefixOf (stream t1) (stream t2) = isPrefixOf t1 t2 --isPrefixOf :: Eq a => Stream a -> Stream a -> Bool -- | O(n) elem is the stream membership predicate. -- -- Properties -- --
-- elem c . stream = elem c --elem :: Char -> Stream Char -> Bool -- | O(n) filter, applied to a predicate and a stream, -- returns a stream containing those characters that satisfy the -- predicate. -- -- Properties -- --
-- unstream . filter p . stream = filter p --filter :: (Char -> Bool) -> Stream Char -> Stream Char -- | O(n) The findBy function takes a predicate and a stream, -- and returns the first element in matching the predicate, or -- Nothing if there is no such element. -- -- Properties -- --
-- findBy p . stream = find p --findBy :: (Char -> Bool) -> Stream Char -> Maybe Char -- | O(n) Stream index (subscript) operator, starting from 0. -- -- Properties -- --
-- indexI (stream t) n = index t n --indexI :: (HasCallStack, Integral a) => Stream Char -> a -> Char -- | The findIndexI function takes a predicate and a stream and -- returns the index of the first element in the stream satisfying the -- predicate. -- -- Properties -- --
-- findIndexI p . stream = findIndex p --findIndexI :: Integral a => (Char -> Bool) -> Stream Char -> Maybe a -- | O(n) The countCharI function returns the number of times -- the query element appears in the given stream. -- -- Properties -- --
-- countCharI c . stream = countChar c --countCharI :: Integral a => Char -> Stream Char -> a -- | zipWith generalises zip by zipping with the function given as -- the first argument, instead of a tupling function. -- -- Properties -- --
-- unstream (zipWith f (stream t1) (stream t2)) = zipWith f t1 t2 --zipWith :: (a -> a -> b) -> Stream a -> Stream a -> Stream b -- | Warning: this is an internal module, and does not have a stable -- API or name. Functions in this module may not check or enforce -- preconditions expected by public modules. Use at your own risk! -- -- Internals of Data.Text.Encoding. module Data.Text.Internal.Encoding -- | Validate a ByteString as UTF-8-encoded text. To be continued -- using validateUtf8More. -- -- See also validateUtf8More for details on the result of this -- function. -- --
-- validateUtf8Chunk = validateUtf8More startUtf8State ---- --
-- validateUtf8Chunk chunk = (n, ms) ---- --
validateUtf8Chunk (take n chunk) = -- (n, Just startUtf8State)
-- validateUtf8More s chunk = (n, ms) ---- --
ms -- = Nothing ==> validateUtf8More s (chunk <> -- more) = (n, Nothing)
ms = Just s' ==> validateUtf8More s -- (chunk <> more) = first (length chunk -- +) (validateUtf8More s' more)
-- decodeUtf8Chunk = decodeUtf8More startUtf8State ---- -- Given: -- --
-- decodeUtf8Chunk chunk = (builder, rest, ms) ---- -- builder is a prefix and rest is a suffix of -- chunk. -- --
-- encodeUtf8 (strictBuilderToText builder) <> rest = chunk --decodeUtf8Chunk :: ByteString -> (StrictTextBuilder, ByteString, Maybe Utf8State) -- | Decode another chunk in an ongoing UTF-8 stream. -- -- Returns a triple: -- --
-- (pre, suf, ms) = decodeUtf8More s chunk ---- --
s2b pre `append` suf -- = p2b s `append` chunkwhere
s2b = encodeUtf8 -- . toText p2b = partUtf8ToByteString
suf = chunk
(pre1, suf1, Just s1) = decodeUtf8More -- s chunk1 (pre2, suf2, ms2) = decodeUtf8More s1 chunk2 (pre3, -- suf3, ms3) = decodeUtf8More s (chunk1 `B.append` chunk2) --we have:
s2b (pre1 <> pre2) = s2b pre3 ms2 = -- ms3
-- unstream . stream = id ---- --
-- stream . unstream = id --stream :: Text -> Stream Char -- | O(n) streamLn t = stream (t <> -- '\n') streamLn :: Text -> Stream Char -- | O(n) Convert Stream Char into a Text. -- -- Properties -- --
-- unstream . stream = id ---- --
-- stream . unstream = id --unstream :: Stream Char -> Text -- | O(n) Converts Text into a Stream Char, but -- iterates backwards through the text. -- -- Properties -- --
-- unstream . reverseStream = reverse --reverseStream :: Text -> Stream Char -- | O(n) Returns the number of characters in a Stream. -- -- Properties -- --
-- length . stream = length --length :: Stream Char -> Int -- | O(n) Reverse the characters of a Stream returning -- Text. -- -- Properties -- --
-- reverse . stream = reverse --reverse :: Stream Char -> Text -- | O(n) Perform the equivalent of scanr over a list, only -- with the input and result reversed. -- -- Properties -- --
-- reverse . reverseScanr f c . reverseStream = scanr f c --reverseScanr :: (Char -> Char -> Char) -> Char -> Stream Char -> Stream Char -- | O(n) Like a combination of map and foldl'. -- Applies a function to each element of a Text, passing an -- accumulating parameter from left to right, and returns a final -- Text. -- -- Properties -- --
-- mapAccumL g z0 . stream = mapAccumL g z0 --mapAccumL :: (a -> Char -> (a, Char)) -> a -> Stream Char -> (a, Text) -- | O(n) Like unfoldr, unfoldrN builds a stream -- from a seed value. However, the length of the result is limited by the -- first argument to unfoldrN. This function is more efficient -- than unfoldr when the length of the result is known. -- -- Properties -- --
-- unstream (unfoldrN n f a) = unfoldrN n f a --unfoldrN :: Int -> (a -> Maybe (Char, a)) -> a -> Stream Char -- | O(n) stream index (subscript) operator, starting from 0. -- -- Properties -- --
-- index (stream t) n = index t n --index :: HasCallStack => Stream Char -> Int -> Char -- | The findIndex function takes a predicate and a stream and -- returns the index of the first element in the stream satisfying the -- predicate. -- -- Properties -- --
-- findIndex p . stream = findIndex p --findIndex :: (Char -> Bool) -> Stream Char -> Maybe Int -- | O(n) The count function returns the number of times -- the query element appears in the given stream. -- -- Properties -- --
-- countChar c . stream = countChar c --countChar :: Char -> Stream Char -> Int -- | Warning: this is an internal module, and does not have a stable -- API or name. Use at your own risk! -- -- Fusible Stream-oriented functions for converting between -- Text and several common encodings. module Data.Text.Internal.Encoding.Fusion.Common restreamUtf16LE :: Stream Char -> Stream Word8 restreamUtf16BE :: Stream Char -> Stream Word8 restreamUtf32LE :: Stream Char -> Stream Word8 restreamUtf32BE :: Stream Char -> Stream Word8 -- | Warning: this is an internal module, and does not have a stable -- API or name. Functions in this module may not check or enforce -- preconditions expected by public modules. Use at your own risk! -- -- Fusible Stream-oriented functions for converting between lazy -- Text and several common encodings. module Data.Text.Internal.Lazy.Encoding.Fusion -- | O(n) Convert a lazy ByteString into a 'Stream Char', -- using UTF-8 encoding. streamUtf8 :: OnDecodeError -> ByteString -> Stream Char -- | O(n) Convert a ByteString into a 'Stream Char', using -- little endian UTF-16 encoding. streamUtf16LE :: OnDecodeError -> ByteString -> Stream Char -- | O(n) Convert a ByteString into a 'Stream Char', using -- big endian UTF-16 encoding. streamUtf16BE :: OnDecodeError -> ByteString -> Stream Char -- | O(n) Convert a ByteString into a 'Stream Char', using -- little endian UTF-32 encoding. streamUtf32LE :: OnDecodeError -> ByteString -> Stream Char -- | O(n) Convert a ByteString into a 'Stream Char', using -- big endian UTF-32 encoding. streamUtf32BE :: OnDecodeError -> ByteString -> Stream Char -- | O(n) Convert a Stream Word8 to a lazy -- ByteString. unstream :: Stream Word8 -> ByteString -- | Warning: this is an internal module, and does not have a stable -- API or name. Functions in this module may not check or enforce -- preconditions expected by public modules. Use at your own risk! -- -- Fusible Stream-oriented functions for converting between -- Text and several common encodings. module Data.Text.Internal.Encoding.Fusion -- | Deprecated: Do not use this function streamASCII :: ByteString -> Stream Char -- | O(n) Convert a ByteString into a 'Stream Char', using -- UTF-8 encoding. streamUtf8 :: OnDecodeError -> ByteString -> Stream Char -- | O(n) Convert a ByteString into a 'Stream Char', using -- little endian UTF-16 encoding. streamUtf16LE :: OnDecodeError -> ByteString -> Stream Char -- | O(n) Convert a ByteString into a 'Stream Char', using -- big endian UTF-16 encoding. streamUtf16BE :: OnDecodeError -> ByteString -> Stream Char -- | O(n) Convert a ByteString into a 'Stream Char', using -- little endian UTF-32 encoding. streamUtf32LE :: OnDecodeError -> ByteString -> Stream Char -- | O(n) Convert a ByteString into a 'Stream Char', using -- big endian UTF-32 encoding. streamUtf32BE :: OnDecodeError -> ByteString -> Stream Char -- | O(n) Convert a Stream Word8 to a -- ByteString. unstream :: Stream Word8 -> ByteString -- | Functions for converting Text values to and from -- ByteString, using several standard encodings. -- -- To gain access to a much larger family of encodings, use the -- text-icu package. module Data.Text.Encoding -- | Decode a ByteString containing Latin-1 (aka ISO-8859-1) encoded -- text. -- -- decodeLatin1 is semantically equivalent to Data.Text.pack . -- Data.ByteString.Char8.unpack -- -- This is a total function. However, bear in mind that decoding Latin-1 -- (non-ASCII) characters to UTf-8 requires actual work and is not just -- buffer copying. decodeLatin1 :: ByteString -> Text -- | Decode a ByteString containing ASCII text. -- -- This is a total function which returns a pair of the longest ASCII -- prefix as Text, and the remaining suffix as ByteString. -- -- Important note: the pair is lazy. This lets you check for errors by -- testing whether the second component is empty, without forcing the -- first component (which does a copy). To drop references to the input -- bytestring, force the prefix (using seq or -- BangPatterns) and drop references to the suffix. -- --
-- decodeUtf8Chunk = decodeUtf8More startUtf8State ---- -- Given: -- --
-- decodeUtf8Chunk chunk = (builder, rest, ms) ---- -- builder is a prefix and rest is a suffix of -- chunk. -- --
-- encodeUtf8 (strictBuilderToText builder) <> rest = chunk --decodeUtf8Chunk :: ByteString -> (StrictTextBuilder, ByteString, Maybe Utf8State) -- | Decode another chunk in an ongoing UTF-8 stream. -- -- Returns a triple: -- --
-- (pre, suf, ms) = decodeUtf8More s chunk ---- --
s2b pre `append` suf -- = p2b s `append` chunkwhere
s2b = encodeUtf8 -- . toText p2b = partUtf8ToByteString
suf = chunk
(pre1, suf1, Just s1) = decodeUtf8More -- s chunk1 (pre2, suf2, ms2) = decodeUtf8More s1 chunk2 (pre3, -- suf3, ms3) = decodeUtf8More s (chunk1 `B.append` chunk2) --we have:
s2b (pre1 <> pre2) = s2b pre3 ms2 = -- ms3
-- validateUtf8Chunk = validateUtf8More startUtf8State ---- --
-- validateUtf8Chunk chunk = (n, ms) ---- --
validateUtf8Chunk (take n chunk) = -- (n, Just startUtf8State)
-- validateUtf8More s chunk = (n, ms) ---- --
ms -- = Nothing ==> validateUtf8More s (chunk <> -- more) = (n, Nothing)
ms = Just s' ==> validateUtf8More s -- (chunk <> more) = first (length chunk -- +) (validateUtf8More s' more)
-- import qualified Data.Text as T ---- -- To use an extended and very rich family of functions for working with -- Unicode text (including normalization, regular expressions, -- non-standard encodings, text breaking, and locales), see the -- text-icu package. module Data.Text -- | A space efficient, packed, unboxed Unicode text type. data Text -- | Type synonym for the strict flavour of Text. type StrictText = Text -- | O(n) Convert a String into a Text. Performs -- replacement on invalid scalar values, so unpack . -- pack is not id: -- --
-- >>> Data.Text.unpack (pack "\55555") -- "\65533" --pack :: String -> Text -- | O(n) Convert a Text into a String. unpack :: Text -> String -- | O(1) Convert a character into a Text. Performs replacement on -- invalid scalar values. singleton :: Char -> Text -- | O(1) The empty Text. empty :: Text -- | Bidirectional pattern synonym for empty and null (both -- O(1)), to be used together with (:<) or -- (:>). pattern Empty :: Text -- | Bidirectional pattern synonym for cons (O(n)) and -- uncons (O(1)), to be used together with Empty. pattern (:<) :: Char -> Text -> Text infixr 5 :< -- | Bidirectional pattern synonym for snoc (O(n)) and -- unsnoc (O(1)) to be used together with Empty. pattern (:>) :: Text -> Char -> Text infixl 5 :> -- | O(n) Adds a character to the front of a Text. This -- function is more costly than its List counterpart because it -- requires copying a new array. Performs replacement on invalid scalar -- values. cons :: Char -> Text -> Text infixr 5 `cons` -- | O(n) Adds a character to the end of a Text. This copies -- the entire array in the process. Performs replacement on invalid -- scalar values. snoc :: Text -> Char -> Text -- | O(n) Appends one Text to the other by copying both of -- them into a new Text. append :: Text -> Text -> Text -- | O(1) Returns the first character and rest of a Text, or -- Nothing if empty. uncons :: Text -> Maybe (Char, Text) -- | O(1) Returns all but the last character and the last character -- of a Text, or Nothing if empty. unsnoc :: Text -> Maybe (Text, Char) -- | O(1) Returns the first character of a Text, which must -- be non-empty. This is a partial function, consider using uncons -- instead. head :: HasCallStack => Text -> Char -- | O(1) Returns the last character of a Text, which must be -- non-empty. This is a partial function, consider using unsnoc -- instead. last :: HasCallStack => Text -> Char -- | O(1) Returns all characters after the head of a Text, -- which must be non-empty. This is a partial function, consider using -- uncons instead. tail :: HasCallStack => Text -> Text -- | O(1) Returns all but the last character of a Text, which -- must be non-empty. This is a partial function, consider using -- unsnoc instead. init :: HasCallStack => Text -> Text -- | O(1) Tests whether a Text is empty or not. null :: Text -> Bool -- | O(n) Returns the number of characters in a Text. length :: Text -> Int -- | O(min(n,c)) Compare the count of characters in a Text to -- a number. -- --
-- compareLength t c = compare (length t) c ---- -- This function gives the same answer as comparing against the result of -- length, but can short circuit if the count of characters is -- greater than the number, and hence be more efficient. compareLength :: Text -> Int -> Ordering -- | O(n) map f t is the Text -- obtained by applying f to each element of t. -- -- Example: -- --
-- >>> let message = pack "I am not angry. Not at all." -- -- >>> T.map (\c -> if c == '.' then '!' else c) message -- "I am not angry! Not at all!" ---- -- Performs replacement on invalid scalar values. map :: (Char -> Char) -> Text -> Text -- | O(n) The intercalate function takes a Text and a -- list of Texts and concatenates the list after interspersing the -- first argument between each element of the list. -- -- Example: -- --
-- >>> T.intercalate "NI!" ["We", "seek", "the", "Holy", "Grail"] -- "WeNI!seekNI!theNI!HolyNI!Grail" --intercalate :: Text -> [Text] -> Text -- | O(n) The intersperse function takes a character and -- places it between the characters of a Text. -- -- Example: -- --
-- >>> T.intersperse '.' "SHIELD" -- "S.H.I.E.L.D" ---- -- Performs replacement on invalid scalar values. intersperse :: Char -> Text -> Text -- | O(n) The transpose function transposes the rows and -- columns of its Text argument. Note that this function uses -- pack, unpack, and the list version of transpose, and is -- thus not very efficient. -- -- Examples: -- --
-- >>> transpose ["green","orange"] -- ["go","rr","ea","en","ng","e"] ---- --
-- >>> transpose ["blue","red"] -- ["br","le","ud","e"] --transpose :: [Text] -> [Text] reverse :: Text -> Text -- | O(m+n) Replace every non-overlapping occurrence of -- needle in haystack with replacement. -- -- This function behaves as though it was defined as follows: -- --
-- replace needle replacement haystack = -- intercalate replacement (splitOn needle haystack) ---- -- As this suggests, each occurrence is replaced exactly once. So if -- needle occurs in replacement, that occurrence will -- not itself be replaced recursively: -- --
-- >>> replace "oo" "foo" "oo" -- "foo" ---- -- In cases where several instances of needle overlap, only the -- first one will be replaced: -- --
-- >>> replace "ofo" "bar" "ofofo" -- "barfo" ---- -- In (unlikely) bad cases, this function's time complexity degrades -- towards O(n*m). replace :: HasCallStack => Text -> Text -> Text -> Text -- | O(n) Convert a string to folded case. -- -- This function is mainly useful for performing caseless (also known as -- case insensitive) string comparisons. -- -- A string x is a caseless match for a string y if and -- only if: -- --
-- toCaseFold x == toCaseFold y ---- -- The result string may be longer than the input string, and may differ -- from applying toLower to the input string. For instance, the -- Armenian small ligature "ﬓ" (men now, U+FB13) is case folded to the -- sequence "մ" (men, U+0574) followed by "ն" (now, U+0576), while the -- Greek "µ" (micro sign, U+00B5) is case folded to "μ" (small letter mu, -- U+03BC) instead of itself. toCaseFold :: Text -> Text -- | O(n) Convert a string to lower case, using simple case -- conversion. -- -- The result string may be longer than the input string. For instance, -- "İ" (Latin capital letter I with dot above, U+0130) maps to the -- sequence "i" (Latin small letter i, U+0069) followed by " ̇" -- (combining dot above, U+0307). toLower :: Text -> Text -- | O(n) Convert a string to upper case, using simple case -- conversion. -- -- The result string may be longer than the input string. For instance, -- the German "ß" (eszett, U+00DF) maps to the two-letter sequence "SS". toUpper :: Text -> Text -- | O(n) Convert a string to title case, using simple case -- conversion. -- -- The first letter (as determined by isLetter) of the input is -- converted to title case, as is every subsequent letter that -- immediately follows a non-letter. Every letter that immediately -- follows another letter is converted to lower case. -- -- This function is not idempotent. Consider lower-case letter ʼn -- (U+0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE). Then -- toTitle "ʼn" = "ʼN": the first (and the only) -- letter of the input is converted to title case, becoming two letters. -- Now ʼ (U+02BC MODIFIER LETTER APOSTROPHE) is a modifier -- letter and as such is recognised as a letter by isLetter, so -- toTitle "ʼN" = "'n". -- -- The result string may be longer than the input string. For example, -- the Latin small ligature fl (U+FB02) is converted to the sequence Latin -- capital letter F (U+0046) followed by Latin small letter l (U+006C). -- -- Note: this function does not take language or culture specific -- rules into account. For instance, in English, different style guides -- disagree on whether the book name "The Hill of the Red Fox" is -- correctly title cased—but this function will capitalize every -- word. toTitle :: Text -> Text -- | O(n) Left-justify a string to the given length, using the -- specified fill character on the right. Performs replacement on invalid -- scalar values. -- -- Examples: -- --
-- >>> justifyLeft 7 'x' "foo" -- "fooxxxx" ---- --
-- >>> justifyLeft 3 'x' "foobar" -- "foobar" --justifyLeft :: Int -> Char -> Text -> Text -- | O(n) Right-justify a string to the given length, using the -- specified fill character on the left. Performs replacement on invalid -- scalar values. -- -- Examples: -- --
-- >>> justifyRight 7 'x' "bar" -- "xxxxbar" ---- --
-- >>> justifyRight 3 'x' "foobar" -- "foobar" --justifyRight :: Int -> Char -> Text -> Text -- | O(n) Center a string to the given length, using the specified -- fill character on either side. Performs replacement on invalid scalar -- values. -- -- Examples: -- --
-- >>> center 8 'x' "HS" -- "xxxHSxxx" --center :: Int -> Char -> Text -> Text -- | O(n) foldl, applied to a binary operator, a starting -- value (typically the left-identity of the operator), and a -- Text, reduces the Text using the binary operator, from -- left to right. foldl :: (a -> Char -> a) -> a -> Text -> a -- | O(n) A strict version of foldl. foldl' :: (a -> Char -> a) -> a -> Text -> a -- | O(n) A variant of foldl that has no starting value -- argument, and thus must be applied to a non-empty Text. foldl1 :: HasCallStack => (Char -> Char -> Char) -> Text -> Char -- | O(n) A strict version of foldl1. foldl1' :: HasCallStack => (Char -> Char -> Char) -> Text -> Char -- | O(n) foldr, applied to a binary operator, a starting -- value (typically the right-identity of the operator), and a -- Text, reduces the Text using the binary operator, from -- right to left. -- -- If the binary operator is strict in its second argument, use -- foldr' instead. -- -- foldr is lazy like foldr for lists: evaluation actually -- traverses the Text from left to right, only as far as it needs -- to. -- -- For example, head can be defined with O(1) complexity -- using foldr: -- --
-- head :: Text -> Char -- head = foldr const (error "head empty") ---- -- Searches from left to right with short-circuiting behavior can also be -- defined using foldr (e.g., any, all, -- find, elem). foldr :: (Char -> a -> a) -> a -> Text -> a -- | O(n) A strict version of foldr. -- -- foldr' evaluates as a right-to-left traversal using constant -- stack space. foldr' :: (Char -> a -> a) -> a -> Text -> a -- | O(n) A variant of foldr that has no starting value -- argument, and thus must be applied to a non-empty Text. foldr1 :: HasCallStack => (Char -> Char -> Char) -> Text -> Char -- | O(n) A monadic version of foldl'. foldlM' :: Monad m => (a -> Char -> m a) -> a -> Text -> m a -- | O(n) Concatenate a list of Texts. concat :: [Text] -> Text -- | O(n) Map a function over a Text that results in a -- Text, and concatenate the results. concatMap :: (Char -> Text) -> Text -> Text -- | O(n) any p t determines whether any -- character in the Text t satisfies the predicate -- p. any :: (Char -> Bool) -> Text -> Bool -- | O(n) all p t determines whether all -- characters in the Text t satisfy the predicate -- p. all :: (Char -> Bool) -> Text -> Bool -- | O(n) maximum returns the maximum value from a -- Text, which must be non-empty. maximum :: HasCallStack => Text -> Char -- | O(n) minimum returns the minimum value from a -- Text, which must be non-empty. minimum :: HasCallStack => Text -> Char -- | O(n) Test whether Text contains only ASCII code-points (i.e. -- only U+0000 through U+007F). -- -- This is a more efficient version of all -- isAscii. -- --
-- >>> isAscii "" -- True ---- --
-- >>> isAscii "abc\NUL" -- True ---- --
-- >>> isAscii "abcd€" -- False ---- --
-- isAscii t == all (< '\x80') t --isAscii :: Text -> Bool -- | O(n) scanl is similar to foldl, but returns a -- list of successive reduced values from the left. Performs replacement -- on invalid scalar values. -- --
-- scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...] ---- -- Properties -- --
-- head (scanl f z xs) = z ---- --
-- last (scanl f z xs) = foldl f z xs --scanl :: (Char -> Char -> Char) -> Char -> Text -> Text -- | O(n) scanl1 is a variant of scanl that has no -- starting value argument. Performs replacement on invalid scalar -- values. -- --
-- scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...] --scanl1 :: (Char -> Char -> Char) -> Text -> Text -- | O(n) scanr is the right-to-left dual of scanl. -- Performs replacement on invalid scalar values. -- --
-- scanr f v == reverse . scanl (flip f) v . reverse --scanr :: (Char -> Char -> Char) -> Char -> Text -> Text -- | O(n) scanr1 is a variant of scanr that has no -- starting value argument. Performs replacement on invalid scalar -- values. scanr1 :: (Char -> Char -> Char) -> Text -> Text -- | O(n) Like a combination of map and foldl'. -- Applies a function to each element of a Text, passing an -- accumulating parameter from left to right, and returns a final -- Text. Performs replacement on invalid scalar values. mapAccumL :: (a -> Char -> (a, Char)) -> a -> Text -> (a, Text) -- | The mapAccumR function behaves like a combination of map -- and a strict foldr; it applies a function to each element of a -- Text, passing an accumulating parameter from right to left, and -- returning a final value of this accumulator together with the new -- Text. Performs replacement on invalid scalar values. mapAccumR :: (a -> Char -> (a, Char)) -> a -> Text -> (a, Text) -- | O(n*m) replicate n t is a Text -- consisting of the input t repeated n times. replicate :: Int -> Text -> Text -- | O(n), where n is the length of the result. The -- unfoldr function is analogous to the List unfoldr. -- unfoldr builds a Text from a seed value. The function -- takes the element and returns Nothing if it is done producing -- the Text, otherwise Just (a,b). In this case, -- a is the next Char in the string, and b is -- the seed value for further production. Performs replacement on invalid -- scalar values. unfoldr :: (a -> Maybe (Char, a)) -> a -> Text -- | O(n) Like unfoldr, unfoldrN builds a Text -- from a seed value. However, the length of the result should be limited -- by the first argument to unfoldrN. This function is more -- efficient than unfoldr when the maximum length of the result is -- known and correct, otherwise its performance is similar to -- unfoldr. Performs replacement on invalid scalar values. unfoldrN :: Int -> (a -> Maybe (Char, a)) -> a -> Text -- | O(n) take n, applied to a Text, returns -- the prefix of the Text of length n, or the Text -- itself if n is greater than the length of the Text. take :: Int -> Text -> Text -- | O(n) takeEnd n t returns the suffix -- remaining after taking n characters from the end of -- t. -- -- Examples: -- --
-- >>> takeEnd 3 "foobar" -- "bar" --takeEnd :: Int -> Text -> Text -- | O(n) drop n, applied to a Text, returns -- the suffix of the Text after the first n characters, -- or the empty Text if n is greater than the length of -- the Text. drop :: Int -> Text -> Text -- | O(n) dropEnd n t returns the prefix -- remaining after dropping n characters from the end of -- t. -- -- Examples: -- --
-- >>> dropEnd 3 "foobar" -- "foo" --dropEnd :: Int -> Text -> Text -- | O(n) takeWhile, applied to a predicate p and a -- Text, returns the longest prefix (possibly empty) of elements -- that satisfy p. takeWhile :: (Char -> Bool) -> Text -> Text -- | O(n) takeWhileEnd, applied to a predicate p and -- a Text, returns the longest suffix (possibly empty) of elements -- that satisfy p. Examples: -- --
-- >>> takeWhileEnd (=='o') "foo" -- "oo" --takeWhileEnd :: (Char -> Bool) -> Text -> Text -- | O(n) dropWhile p t returns the suffix -- remaining after takeWhile p t. dropWhile :: (Char -> Bool) -> Text -> Text -- | O(n) dropWhileEnd p t returns the -- prefix remaining after dropping characters that satisfy the predicate -- p from the end of t. -- -- Examples: -- --
-- >>> dropWhileEnd (=='.') "foo..." -- "foo" --dropWhileEnd :: (Char -> Bool) -> Text -> Text -- | O(n) dropAround p t returns the -- substring remaining after dropping characters that satisfy the -- predicate p from both the beginning and end of t. dropAround :: (Char -> Bool) -> Text -> Text -- | O(n) Remove leading and trailing white space from a string. -- Equivalent to: -- --
-- dropAround isSpace --strip :: Text -> Text -- | O(n) Remove leading white space from a string. Equivalent to: -- --
-- dropWhile isSpace --stripStart :: Text -> Text -- | O(n) Remove trailing white space from a string. Equivalent to: -- --
-- dropWhileEnd isSpace --stripEnd :: Text -> Text -- | O(n) splitAt n t returns a pair whose first -- element is a prefix of t of length n, and whose -- second is the remainder of the string. It is equivalent to -- (take n t, drop n t). splitAt :: Int -> Text -> (Text, Text) -- | O(n+m) Find the first instance of needle (which must -- be non-null) in haystack. The first element of the -- returned tuple is the prefix of haystack before -- needle is matched. The second is the remainder of -- haystack, starting with the match. -- -- Examples: -- --
-- >>> breakOn "::" "a::b::c"
-- ("a","::b::c")
--
--
--
-- >>> breakOn "/" "foobar"
-- ("foobar","")
--
--
-- Laws:
--
-- -- append prefix match == haystack -- where (prefix, match) = breakOn needle haystack ---- -- If you need to break a string by a substring repeatedly (e.g. you want -- to break on every instance of a substring), use breakOnAll -- instead, as it has lower startup overhead. -- -- In (unlikely) bad cases, this function's time complexity degrades -- towards O(n*m). breakOn :: HasCallStack => Text -> Text -> (Text, Text) -- | O(n+m) Similar to breakOn, but searches from the end of -- the string. -- -- The first element of the returned tuple is the prefix of -- haystack up to and including the last match of -- needle. The second is the remainder of haystack, -- following the match. -- --
-- >>> breakOnEnd "::" "a::b::c"
-- ("a::b::","c")
--
breakOnEnd :: HasCallStack => Text -> Text -> (Text, Text)
-- | O(n) break is like span, but the prefix returned
-- is over elements that fail the predicate p.
--
--
-- >>> T.break (=='c') "180cm"
-- ("180","cm")
--
break :: (Char -> Bool) -> Text -> (Text, Text)
-- | O(n) span, applied to a predicate p and text
-- t, returns a pair whose first element is the longest prefix
-- (possibly empty) of t of elements that satisfy p,
-- and whose second is the remainder of the text.
--
--
-- >>> T.span (=='0') "000AB"
-- ("000","AB")
--
span :: (Char -> Bool) -> Text -> (Text, Text)
-- | O(length of prefix) spanM, applied to a monadic
-- predicate p, a text t, returns a pair (t1,
-- t2) where t1 is the longest prefix of t whose
-- elements satisfy p, and t2 is the remainder of the
-- text.
--
--
-- >>> T.spanM (\c -> state $ \i -> (fromEnum c == i, i+1)) "abcefg" `runState` 97
-- (("abc","efg"),101)
--
--
-- span is spanM specialized to Identity:
--
-- -- -- for all p :: Char -> Bool -- span p = runIdentity . spanM (pure . p) --spanM :: Monad m => (Char -> m Bool) -> Text -> m (Text, Text) -- | O(length of suffix) spanEndM, applied to a monadic -- predicate p, a text t, returns a pair (t1, -- t2) where t2 is the longest suffix of t whose -- elements satisfy p, and t1 is the remainder of the -- text. -- --
-- >>> T.spanEndM (\c -> state $ \i -> (fromEnum c == i, i-1)) "tuvxyz" `runState` 122
-- (("tuv","xyz"),118)
--
--
-- -- spanEndM p . reverse = fmap (bimap reverse reverse) . spanM p --spanEndM :: Monad m => (Char -> m Bool) -> Text -> m (Text, Text) -- | O(n) Group characters in a string by equality. group :: Text -> [Text] -- | O(n) Group characters in a string according to a predicate. groupBy :: (Char -> Char -> Bool) -> Text -> [Text] -- | O(n) Return all initial segments of the given Text, -- shortest first. inits :: Text -> [Text] -- | O(n) Return all initial segments of the given Text, -- shortest first. initsNE :: Text -> NonEmpty Text -- | O(n) Return all final segments of the given Text, -- longest first. tails :: Text -> [Text] -- | O(n) Return all final segments of the given Text, -- longest first. tailsNE :: Text -> NonEmpty Text -- | O(m+n) Break a Text into pieces separated by the first -- Text argument (which cannot be empty), consuming the delimiter. -- An empty delimiter is invalid, and will cause an error to be raised. -- -- Examples: -- --
-- >>> splitOn "\r\n" "a\r\nb\r\nd\r\ne" -- ["a","b","d","e"] ---- --
-- >>> splitOn "aaa" "aaaXaaaXaaaXaaa" -- ["","X","X","X",""] ---- --
-- >>> splitOn "x" "x" -- ["",""] ---- -- and -- --
-- intercalate s . splitOn s == id -- splitOn (singleton c) == split (==c) ---- -- (Note: the string s to split on above cannot be empty.) -- -- In (unlikely) bad cases, this function's time complexity degrades -- towards O(n*m). splitOn :: HasCallStack => Text -> Text -> [Text] -- | O(n) Splits a Text into components delimited by -- separators, where the predicate returns True for a separator element. -- The resulting components do not contain the separators. Two adjacent -- separators result in an empty component in the output. eg. -- --
-- >>> split (=='a') "aabbaca" -- ["","","bb","c",""] ---- --
-- >>> split (=='a') "" -- [""] --split :: (Char -> Bool) -> Text -> [Text] -- | O(n) Splits a Text into components of length k. -- The last element may be shorter than the other chunks, depending on -- the length of the input. Examples: -- --
-- >>> chunksOf 3 "foobarbaz" -- ["foo","bar","baz"] ---- --
-- >>> chunksOf 4 "haskell.org" -- ["hask","ell.","org"] --chunksOf :: Int -> Text -> [Text] -- | O(n) Breaks a Text up into a list of Texts at -- newline characters '\n' (LF, line feed). The resulting -- strings do not contain newlines. -- -- lines does not treat '\r' (CR, carriage return) -- as a newline character. lines :: Text -> [Text] -- | O(n) Breaks a Text up into a list of words, delimited by -- Chars representing white space. words :: Text -> [Text] -- | O(n) Joins lines, after appending a terminating newline to -- each. unlines :: [Text] -> Text -- | O(n) Joins words using single space characters. unwords :: [Text] -> Text -- | O(n) The isPrefixOf function takes two Texts and -- returns True if and only if the first is a prefix of the -- second. isPrefixOf :: Text -> Text -> Bool -- | O(n) The isSuffixOf function takes two Texts and -- returns True if and only if the first is a suffix of the -- second. isSuffixOf :: Text -> Text -> Bool -- | O(n+m) The isInfixOf function takes two Texts and -- returns True if and only if the first is contained, wholly and -- intact, anywhere within the second. -- -- In (unlikely) bad cases, this function's time complexity degrades -- towards O(n*m). isInfixOf :: Text -> Text -> Bool -- | O(n) Return the suffix of the second string if its prefix -- matches the entire first string. -- -- Examples: -- --
-- >>> stripPrefix "foo" "foobar" -- Just "bar" ---- --
-- >>> stripPrefix "" "baz" -- Just "baz" ---- --
-- >>> stripPrefix "foo" "quux" -- Nothing ---- -- This is particularly useful with the ViewPatterns extension -- to GHC, as follows: -- --
-- {-# LANGUAGE ViewPatterns #-}
-- import Data.Text as T
--
-- fnordLength :: Text -> Int
-- fnordLength (stripPrefix "fnord" -> Just suf) = T.length suf
-- fnordLength _ = -1
--
stripPrefix :: Text -> Text -> Maybe Text
-- | O(n) Return the prefix of the second string if its suffix
-- matches the entire first string.
--
-- Examples:
--
-- -- >>> stripSuffix "bar" "foobar" -- Just "foo" ---- --
-- >>> stripSuffix "" "baz" -- Just "baz" ---- --
-- >>> stripSuffix "foo" "quux" -- Nothing ---- -- This is particularly useful with the ViewPatterns extension -- to GHC, as follows: -- --
-- {-# LANGUAGE ViewPatterns #-}
-- import Data.Text as T
--
-- quuxLength :: Text -> Int
-- quuxLength (stripSuffix "quux" -> Just pre) = T.length pre
-- quuxLength _ = -1
--
stripSuffix :: Text -> Text -> Maybe Text
-- | O(n) Find the longest non-empty common prefix of two strings
-- and return it, along with the suffixes of each string at which they no
-- longer match.
--
-- If the strings do not have a common prefix or either one is empty,
-- this function returns Nothing.
--
-- Examples:
--
--
-- >>> commonPrefixes "foobar" "fooquux"
-- Just ("foo","bar","quux")
--
--
-- -- >>> commonPrefixes "veeble" "fetzer" -- Nothing ---- --
-- >>> commonPrefixes "" "baz" -- Nothing --commonPrefixes :: Text -> Text -> Maybe (Text, Text, Text) -- | O(n) filter, applied to a predicate and a Text, -- returns a Text containing those characters that satisfy the -- predicate. filter :: (Char -> Bool) -> Text -> Text -- | O(n+m) Find all non-overlapping instances of needle in -- haystack. Each element of the returned list consists of a -- pair: -- --
-- >>> breakOnAll "::" "" -- [] ---- --
-- >>> breakOnAll "/" "a/b/c/"
-- [("a","/b/c/"),("a/b","/c/"),("a/b/c","/")]
--
--
-- In (unlikely) bad cases, this function's time complexity degrades
-- towards O(n*m).
--
-- The needle parameter may not be empty.
breakOnAll :: HasCallStack => Text -> Text -> [(Text, Text)]
-- | O(n) The find function takes a predicate and a
-- Text, and returns the first element matching the predicate, or
-- Nothing if there is no such element.
find :: (Char -> Bool) -> Text -> Maybe Char
-- | O(n) The elem function takes a character and a
-- Text, and returns True if the element is found in the
-- given Text, or False otherwise.
elem :: Char -> Text -> Bool
-- | O(n) The partition function takes a predicate and a
-- Text, and returns the pair of Texts with elements which
-- do and do not satisfy the predicate, respectively; i.e.
--
-- -- partition p t == (filter p t, filter (not . p) t) --partition :: (Char -> Bool) -> Text -> (Text, Text) -- | O(n) Text index (subscript) operator, starting from 0. index :: HasCallStack => Text -> Int -> Char -- | O(n) The findIndex function takes a predicate and a -- Text and returns the index of the first element in the -- Text satisfying the predicate. findIndex :: (Char -> Bool) -> Text -> Maybe Int -- | O(n+m) The count function returns the number of times -- the query string appears in the given Text. An empty query -- string is invalid, and will cause an error to be raised. -- -- In (unlikely) bad cases, this function's time complexity degrades -- towards O(n*m). count :: HasCallStack => Text -> Text -> Int -- | O(n) zip takes two Texts and returns a list of -- corresponding pairs of bytes. If one input Text is short, -- excess elements of the longer Text are discarded. This is -- equivalent to a pair of unpack operations. zip :: Text -> Text -> [(Char, Char)] -- | O(n) zipWith generalises zip by zipping with the -- function given as the first argument, instead of a tupling function. -- Performs replacement on invalid scalar values. zipWith :: (Char -> Char -> Char) -> Text -> Text -> Text -- | Convert a value to Text. show :: Show a => a -> Text -- | O(n) Make a distinct copy of the given string, sharing no -- storage with the original string. -- -- As an example, suppose you read a large string, of which you need only -- a small portion. If you do not use copy, the entire original -- array will be kept alive in memory by the smaller string. Making a -- copy "breaks the link" to the original array, allowing it to be -- garbage collected if there are no other live references to it. copy :: Text -> Text -- | O(n) Convert a null-terminated modified UTF-8 (but with -- a standard UTF-8 representation of characters from supplementary -- planes) string to a Text. Counterpart to -- unpackCStringUtf8#. No validation is performed, malformed input -- can lead to memory access violation. unpackCString# :: Addr# -> Text -- | O(n) Convert a null-terminated ASCII string to a Text. -- Counterpart to unpackCString#. No validation is performed, -- malformed input can lead to memory access violation. unpackCStringAscii# :: Addr# -> Text -- | O(n) If t is long enough to contain n -- characters, measureOff n t returns a -- non-negative number, measuring their size in Word8. Otherwise, -- if t is shorter, return a non-positive number, which is a -- negated total count of Char available in t. If -- t is empty or n = 0, return 0. -- -- This function is used to implement take, drop, -- splitAt and length and is useful on its own in streaming -- and parsing libraries. measureOff :: Int -> Text -> Int instance Data.Binary.Class.Binary Data.Text.Internal.Text instance GHC.Internal.Data.Data.Data Data.Text.Internal.Text instance GHC.Classes.Eq Data.Text.Internal.Text instance GHC.Internal.IsList.IsList Data.Text.Internal.Text instance GHC.Internal.Data.String.IsString Data.Text.Internal.Text instance Language.Haskell.TH.Syntax.Lift Data.Text.Internal.Text instance GHC.Internal.Base.Monoid Data.Text.Internal.Text instance Control.DeepSeq.NFData Data.Text.Internal.Text instance GHC.Classes.Ord Data.Text.Internal.Text instance Text.Printf.PrintfArg Data.Text.Internal.Text instance GHC.Internal.Read.Read Data.Text.Internal.Text instance GHC.Internal.Base.Semigroup Data.Text.Internal.Text -- | Functions used frequently when reading textual data. module Data.Text.Read -- | Read some text. If the read succeeds, return its value and the -- remaining text, otherwise an error message. type Reader a = Text -> Either String (a, Text) -- | Read a decimal integer. The input must begin with at least one decimal -- digit, and is consumed until a non-digit or end of string is reached. -- -- This function does not handle leading sign characters. If you need to -- handle signed input, use signed decimal. -- -- Note: For fixed-width integer types, this function does not -- attempt to detect overflow, so a sufficiently long input may give -- incorrect results. If you are worried about overflow, use -- Integer for your result type. decimal :: Integral a => Reader a -- | Read a hexadecimal integer, consisting of an optional leading -- "0x" followed by at least one hexadecimal digit. Input is -- consumed until a non-hex-digit or end of string is reached. This -- function is case insensitive. -- -- This function does not handle leading sign characters. If you need to -- handle signed input, use signed hexadecimal. -- -- Note: For fixed-width integer types, this function does not -- attempt to detect overflow, so a sufficiently long input may give -- incorrect results. If you are worried about overflow, use -- Integer for your result type. hexadecimal :: Integral a => Reader a -- | Read an optional leading sign character ('-' or '+') -- and apply it to the result of applying the given reader. signed :: Num a => Reader a -> Reader a -- | Read a rational number. -- -- This function accepts an optional leading sign character, followed by -- at least one decimal digit. The syntax similar to that accepted by the -- read function, with the exception that a trailing '.' -- or 'e' not followed by a number is not consumed. -- -- Examples (with behaviour identical to read): -- --
-- rational "3" == Right (3.0, "") -- rational "3.1" == Right (3.1, "") -- rational "3e4" == Right (30000.0, "") -- rational "3.1e4" == Right (31000.0, "") -- rational ".3" == Left "input does not start with a digit" -- rational "e3" == Left "input does not start with a digit" ---- -- Examples of differences from read: -- --
-- rational "3.foo" == Right (3.0, ".foo") -- rational "3e" == Right (3.0, "e") --rational :: Fractional a => Reader a -- | Read a rational number. -- -- The syntax accepted by this function is the same as for -- rational. -- -- Note: This function is almost ten times faster than -- rational, but is slightly less accurate. -- -- The Double type supports about 16 decimal places of accuracy. -- For 94.2% of numbers, this function and rational give identical -- results, but for the remaining 5.8%, this function loses precision -- around the 15th decimal place. For 0.001% of numbers, this function -- will lose precision at the 13th or 14th decimal place. double :: Reader Double -- | Warning: this is an internal module, and does not have a stable -- API or name. Functions in this module may not check or enforce -- preconditions expected by public modules. Use at your own risk! -- -- A module containing private Text internals. This exposes the -- Text representation and low level construction functions. -- Modules which extend the Text system may need to use this -- module. module Data.Text.Internal.Lazy data Text -- | Empty text. Empty :: Text -- | Chunks must be non-empty, this invariant is not checked. Chunk :: {-# UNPACK #-} !Text -> Text -> Text -- | Type synonym for the lazy flavour of Text. type LazyText = Text -- | Smart constructor for Chunk. Guarantees the data type -- invariant. chunk :: Text -> Text -> Text -- | Smart constructor for Empty. empty :: Text -- | Consume the chunks of a lazy Text with a natural right fold. foldrChunks :: (Text -> a -> a) -> a -> Text -> a -- | Consume the chunks of a lazy Text with a strict, -- tail-recursive, accumulating left fold. foldlChunks :: (a -> Text -> a) -> a -> Text -> a -- | Check the invariant strictly. strictInvariant :: Text -> Bool -- | Check the invariant lazily. lazyInvariant :: Text -> Text -- | Display the internal structure of a lazy Text. showStructure :: Text -> String -- | Currently set to 16 KiB, less the memory management overhead. defaultChunkSize :: Int -- | Currently set to 128 bytes, less the memory management overhead. smallChunkSize :: Int -- | The memory management overhead. Currently this is tuned for GHC only. chunkOverhead :: Int equal :: Text -> Text -> Bool -- | This module has been renamed to Lazy. This name for the module -- will be removed in the next major release. -- | Deprecated: Use Data.Text.Internal.Lazy instead module Data.Text.Lazy.Internal -- | Warning: this is an internal module, and does not have a stable -- API or name. Functions in this module may not check or enforce -- preconditions expected by public modules. Use at your own risk! -- -- Fast substring search for lazy Text, based on work by Boyer, -- Moore, Horspool, Sunday, and Lundh. Adapted from the strict -- implementation. module Data.Text.Internal.Lazy.Search -- | O(n+m) Find the offsets of all non-overlapping indices of -- needle within haystack. -- -- This function is strict in needle, and lazy (as far as -- possible) in the chunks of haystack. -- -- In (unlikely) bad cases, this algorithm's complexity degrades towards -- O(n*m). indices :: Text -> Text -> [Int64] -- | Warning: this is an internal module, and does not have a stable -- API or name. Functions in this module may not check or enforce -- preconditions expected by public modules. Use at your own risk! -- -- Core stream fusion functionality for text. module Data.Text.Internal.Lazy.Fusion -- | O(n) Convert a Text into a 'Stream Char'. stream :: Text -> Stream Char -- | O(n) streamLn t = stream (t <> -- '\n') streamLn :: Text -> Stream Char -- | O(n) Convert a 'Stream Char' into a Text, using -- defaultChunkSize. unstream :: Stream Char -> Text -- | O(n) Convert a 'Stream Char' into a Text, using the -- given chunk size. unstreamChunks :: Int -> Stream Char -> Text -- | O(n) Returns the number of characters in a text. length :: Stream Char -> Int64 -- | O(n) Like unfoldr, unfoldrN builds a stream -- from a seed value. However, the length of the result is limited by the -- first argument to unfoldrN. This function is more efficient -- than unfoldr when the length of the result is known. unfoldrN :: Int64 -> (a -> Maybe (Char, a)) -> a -> Stream Char -- | O(n) stream index (subscript) operator, starting from 0. index :: HasCallStack => Stream Char -> Int64 -> Char -- | O(n) The count function returns the number of times -- the query element appears in the given stream. countChar :: Char -> Stream Char -> Int64 -- | Functions for converting lazy Text values to and from lazy -- ByteString, using several standard encodings. -- -- To gain access to a much larger family of encodings, use the -- text-icu package. module Data.Text.Lazy.Encoding -- | Decode a ByteString containing Latin-1 (aka ISO-8859-1) -- encoded text. decodeLatin1 :: ByteString -> Text -- | Decode a ByteString containing UTF-8 encoded text.. -- -- If the input contains any invalid UTF-8 data, the relevant exception -- will be returned, otherwise the decoded text. -- -- Note: this function is not lazy, as it must decode its -- entire input before it can return a result. If you need lazy -- (streaming) decoding, use decodeUtf8With in lenient mode. decodeUtf8' :: ByteString -> Either UnicodeException Text -- | Decode a ByteString containing UTF-8 encoded text. decodeUtf8With :: OnDecodeError -> ByteString -> Text -- | Decode text from little endian UTF-16 encoding. decodeUtf16LEWith :: OnDecodeError -> ByteString -> Text -- | Decode text from big endian UTF-16 encoding. decodeUtf16BEWith :: OnDecodeError -> ByteString -> Text -- | Decode text from little endian UTF-32 encoding. decodeUtf32LEWith :: OnDecodeError -> ByteString -> Text -- | Decode text from big endian UTF-32 encoding. decodeUtf32BEWith :: OnDecodeError -> ByteString -> Text -- | Decode a ByteString containing 7-bit ASCII encoded text. decodeASCII :: ByteString -> Text -- | Decode a ByteString containing UTF-8 encoded text that is -- known to be valid. -- -- If the input contains any invalid UTF-8 data, an exception will be -- thrown that cannot be caught in pure code. For more control over the -- handling of invalid data, use decodeUtf8' or -- decodeUtf8With. decodeUtf8 :: ByteString -> Text -- | Decode text from little endian UTF-16 encoding. -- -- If the input contains any invalid little endian UTF-16 data, an -- exception will be thrown. For more control over the handling of -- invalid data, use decodeUtf16LEWith. decodeUtf16LE :: ByteString -> Text -- | Decode text from big endian UTF-16 encoding. -- -- If the input contains any invalid big endian UTF-16 data, an exception -- will be thrown. For more control over the handling of invalid data, -- use decodeUtf16BEWith. decodeUtf16BE :: ByteString -> Text -- | Decode text from little endian UTF-32 encoding. -- -- If the input contains any invalid little endian UTF-32 data, an -- exception will be thrown. For more control over the handling of -- invalid data, use decodeUtf32LEWith. decodeUtf32LE :: ByteString -> Text -- | Decode text from big endian UTF-32 encoding. -- -- If the input contains any invalid big endian UTF-32 data, an exception -- will be thrown. For more control over the handling of invalid data, -- use decodeUtf32BEWith. decodeUtf32BE :: ByteString -> Text -- | Encode text using UTF-8 encoding. encodeUtf8 :: Text -> ByteString -- | Encode text using little endian UTF-16 encoding. encodeUtf16LE :: Text -> ByteString -- | Encode text using big endian UTF-16 encoding. encodeUtf16BE :: Text -> ByteString -- | Encode text using little endian UTF-32 encoding. encodeUtf32LE :: Text -> ByteString -- | Encode text using big endian UTF-32 encoding. encodeUtf32BE :: Text -> ByteString -- | Encode text to a ByteString Builder using UTF-8 encoding. encodeUtf8Builder :: Text -> Builder -- | Encode text using UTF-8 encoding and escape the ASCII characters using -- a BoundedPrim. -- -- Use this function is to implement efficient encoders for text-based -- formats like JSON or HTML. encodeUtf8BuilderEscaped :: BoundedPrim Word8 -> Text -> Builder -- | A time and space-efficient implementation of Unicode text using lists -- of packed arrays. -- -- Note: Read below the synopsis for important notes on the use of -- this module. -- -- The representation used by this module is suitable for high -- performance use and for streaming large quantities of data. It -- provides a means to manipulate a large body of text without requiring -- that the entire content be resident in memory. -- -- Some operations, such as concat, append, reverse -- and cons, have better time complexity than their -- Data.Text equivalents, due to the underlying representation -- being a list of chunks. For other operations, lazy Texts are -- usually within a few percent of strict ones, but often with better -- heap usage if used in a streaming fashion. For data larger than -- available memory, or if you have tight memory constraints, this module -- will be the only option. -- -- This module is intended to be imported qualified, to avoid -- name clashes with Prelude functions. eg. -- --
-- import qualified Data.Text.Lazy as L --module Data.Text.Lazy data Text -- | Type synonym for the lazy flavour of Text. type LazyText = Text -- | O(n) Convert a String into a Text. -- -- Performs replacement on invalid scalar values, so unpack . -- pack is not id: -- --
-- >>> Data.Text.Lazy.unpack (Data.Text.Lazy.pack "\55555") -- "\65533" --pack :: String -> Text -- | O(n) Convert a Text into a String. unpack :: Text -> String -- | O(1) Convert a character into a Text. Performs replacement on -- invalid scalar values. singleton :: Char -> Text -- | Smart constructor for Empty. empty :: Text -- | O(c) Convert a list of strict Texts into a lazy -- Text. fromChunks :: [Text] -> Text -- | O(n) Convert a lazy Text into a list of strict -- Texts. toChunks :: Text -> [Text] -- | O(n) Convert a lazy Text into a strict Text. toStrict :: LazyText -> StrictText -- | O(c) Convert a strict Text into a lazy Text. fromStrict :: StrictText -> LazyText -- | Consume the chunks of a lazy Text with a natural right fold. foldrChunks :: (Text -> a -> a) -> a -> Text -> a -- | Consume the chunks of a lazy Text with a strict, -- tail-recursive, accumulating left fold. foldlChunks :: (a -> Text -> a) -> a -> Text -> a -- | Empty text. pattern Empty :: () => Text -- | Bidirectional pattern synonym for cons (O(n)) and -- uncons (O(1)), to be used together with Empty. pattern (:<) :: Char -> Text -> Text infixr 5 :< -- | Bidirectional pattern synonym for snoc (O(n)) and -- unsnoc (O(1)) to be used together with Empty. pattern (:>) :: Text -> Char -> Text infixl 5 :> -- | O(1) Adds a character to the front of a Text. cons :: Char -> Text -> Text infixr 5 `cons` -- | O(n) Adds a character to the end of a Text. This copies -- the entire array in the process. snoc :: Text -> Char -> Text -- | O(n/c) Appends one Text to another. append :: Text -> Text -> Text -- | O(1) Returns the first character and rest of a Text, or -- Nothing if empty. uncons :: Text -> Maybe (Char, Text) -- | O(n/c) Returns the init and last of a -- Text, or Nothing if empty. -- -- unsnoc :: Text -> Maybe (Text, Char) -- | O(1) Returns the first character of a Text, which must -- be non-empty. This is a partial function, consider using uncons -- instead. head :: HasCallStack => Text -> Char -- | O(n/c) Returns the last character of a Text, which must -- be non-empty. This is a partial function, consider using unsnoc -- instead. last :: HasCallStack => Text -> Char -- | O(1) Returns all characters after the head of a Text, -- which must be non-empty. This is a partial function, consider using -- uncons instead. tail :: HasCallStack => Text -> Text -- | O(n/c) Returns all but the last character of a Text, -- which must be non-empty. This is a partial function, consider using -- unsnoc instead. init :: HasCallStack => Text -> Text -- | O(1) Tests whether a Text is empty or not. null :: Text -> Bool -- | O(n) Returns the number of characters in a Text. length :: Text -> Int64 -- | O(min(n,c)) Compare the count of characters in a Text to -- a number. -- --
-- compareLength t c = compare (length t) c ---- -- This function gives the same answer as comparing against the result of -- length, but can short circuit if the count of characters is -- greater than the number, and hence be more efficient. compareLength :: Text -> Int64 -> Ordering -- | O(n) map f t is the Text -- obtained by applying f to each element of t. -- Performs replacement on invalid scalar values. map :: (Char -> Char) -> Text -> Text -- | O(n) The intercalate function takes a Text and a -- list of Texts and concatenates the list after interspersing the -- first argument between each element of the list. intercalate :: Text -> [Text] -> Text -- | O(n) The intersperse function takes a character and -- places it between the characters of a Text. Performs -- replacement on invalid scalar values. intersperse :: Char -> Text -> Text -- | O(n) The transpose function transposes the rows and -- columns of its Text argument. Note that this function uses -- pack, unpack, and the list version of transpose, and is -- thus not very efficient. transpose :: [Text] -> [Text] -- | O(n) reverse t returns the elements of -- t in reverse order. reverse :: Text -> Text -- | O(m+n) Replace every non-overlapping occurrence of -- needle in haystack with replacement. -- -- This function behaves as though it was defined as follows: -- --
-- replace needle replacement haystack = -- intercalate replacement (splitOn needle haystack) ---- -- As this suggests, each occurrence is replaced exactly once. So if -- needle occurs in replacement, that occurrence will -- not itself be replaced recursively: -- --
-- replace "oo" "foo" "oo" == "foo" ---- -- In cases where several instances of needle overlap, only the -- first one will be replaced: -- --
-- replace "ofo" "bar" "ofofo" == "barfo" ---- -- In (unlikely) bad cases, this function's time complexity degrades -- towards O(n*m). replace :: HasCallStack => Text -> Text -> Text -> Text -- | O(n) Convert a string to folded case. -- -- This function is mainly useful for performing caseless (or case -- insensitive) string comparisons. -- -- A string x is a caseless match for a string y if and -- only if: -- --
-- toCaseFold x == toCaseFold y ---- -- The result string may be longer than the input string, and may differ -- from applying toLower to the input string. For instance, the -- Armenian small ligature men now (U+FB13) is case folded to the bigram -- men now (U+0574 U+0576), while the micro sign (U+00B5) is case folded -- to the Greek small letter letter mu (U+03BC) instead of itself. toCaseFold :: Text -> Text -- | O(n) Convert a string to lower case, using simple case -- conversion. -- -- The result string may be longer than the input string. For instance, -- the Latin capital letter I with dot above (U+0130) maps to the -- sequence Latin small letter i (U+0069) followed by combining dot above -- (U+0307). toLower :: Text -> Text -- | O(n) Convert a string to upper case, using simple case -- conversion. -- -- The result string may be longer than the input string. For instance, -- the German eszett (U+00DF) maps to the two-letter sequence SS. toUpper :: Text -> Text -- | O(n) Convert a string to title case, using simple case -- conversion. -- -- The first letter (as determined by isLetter) of the input is -- converted to title case, as is every subsequent letter that -- immediately follows a non-letter. Every letter that immediately -- follows another letter is converted to lower case. -- -- The result string may be longer than the input string. For example, -- the Latin small ligature fl (U+FB02) is converted to the sequence Latin -- capital letter F (U+0046) followed by Latin small letter l (U+006C). -- -- This function is not idempotent. Consider lower-case letter ʼn -- (U+0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE). Then -- toTitle "ʼn" = "ʼN": the first (and the only) -- letter of the input is converted to title case, becoming two letters. -- Now ʼ (U+02BC MODIFIER LETTER APOSTROPHE) is a modifier -- letter and as such is recognised as a letter by isLetter, so -- toTitle "ʼN" = "'n". -- -- Note: this function does not take language or culture specific -- rules into account. For instance, in English, different style guides -- disagree on whether the book name "The Hill of the Red Fox" is -- correctly title cased—but this function will capitalize every -- word. toTitle :: Text -> Text -- | O(n) Left-justify a string to the given length, using the -- specified fill character on the right. Performs replacement on invalid -- scalar values. -- -- Examples: -- --
-- justifyLeft 7 'x' "foo" == "fooxxxx" -- justifyLeft 3 'x' "foobar" == "foobar" --justifyLeft :: Int64 -> Char -> Text -> Text -- | O(n) Right-justify a string to the given length, using the -- specified fill character on the left. Performs replacement on invalid -- scalar values. -- -- Examples: -- --
-- justifyRight 7 'x' "bar" == "xxxxbar" -- justifyRight 3 'x' "foobar" == "foobar" --justifyRight :: Int64 -> Char -> Text -> Text -- | O(n) Center a string to the given length, using the specified -- fill character on either side. Performs replacement on invalid scalar -- values. -- -- Examples: -- --
-- center 8 'x' "HS" = "xxxHSxxx" --center :: Int64 -> Char -> Text -> Text -- | O(n) foldl, applied to a binary operator, a starting -- value (typically the left-identity of the operator), and a -- Text, reduces the Text using the binary operator, from -- left to right. foldl :: (a -> Char -> a) -> a -> Text -> a -- | O(n) A strict version of foldl. foldl' :: (a -> Char -> a) -> a -> Text -> a -- | O(n) A variant of foldl that has no starting value -- argument, and thus must be applied to a non-empty Text. foldl1 :: HasCallStack => (Char -> Char -> Char) -> Text -> Char -- | O(n) A strict version of foldl1. foldl1' :: HasCallStack => (Char -> Char -> Char) -> Text -> Char -- | O(n) foldr, applied to a binary operator, a starting -- value (typically the right-identity of the operator), and a -- Text, reduces the Text using the binary operator, from -- right to left. -- -- foldr is lazy like foldr for lists: evaluation actually -- traverses the Text from left to right, only as far as it needs -- to. -- -- For example, head can be defined with O(1) complexity -- using foldr: -- --
-- head :: Text -> Char -- head = foldr const (error "head empty") --foldr :: (Char -> a -> a) -> a -> Text -> a -- | O(n) A variant of foldr that has no starting value -- argument, and thus must be applied to a non-empty Text. foldr1 :: HasCallStack => (Char -> Char -> Char) -> Text -> Char -- | O(n) A monadic version of foldl'. foldlM' :: Monad m => (a -> Char -> m a) -> a -> Text -> m a -- | O(n) Concatenate a list of Texts. concat :: [Text] -> Text -- | O(n) Map a function over a Text that results in a -- Text, and concatenate the results. concatMap :: (Char -> Text) -> Text -> Text -- | O(n) any p t determines whether any -- character in the Text t satisfies the predicate -- p. any :: (Char -> Bool) -> Text -> Bool -- | O(n) all p t determines whether all -- characters in the Text t satisfy the predicate -- p. all :: (Char -> Bool) -> Text -> Bool -- | O(n) maximum returns the maximum value from a -- Text, which must be non-empty. maximum :: HasCallStack => Text -> Char -- | O(n) minimum returns the minimum value from a -- Text, which must be non-empty. minimum :: HasCallStack => Text -> Char -- | O(n) Test whether Text contains only ASCII code-points (i.e. -- only U+0000 through U+007F). -- -- This is a more efficient version of all -- isAscii. -- --
-- >>> isAscii "" -- True ---- --
-- >>> isAscii "abc\NUL" -- True ---- --
-- >>> isAscii "abcd€" -- False ---- --
-- isAscii t == all (< '\x80') t --isAscii :: Text -> Bool -- | O(n) scanl is similar to foldl, but returns a -- list of successive reduced values from the left. Performs replacement -- on invalid scalar values. -- --
-- scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...] ---- -- Note that -- --
-- last (scanl f z xs) == foldl f z xs. --scanl :: (Char -> Char -> Char) -> Char -> Text -> Text -- | O(n) scanl1 is a variant of scanl that has no -- starting value argument. Performs replacement on invalid scalar -- values. -- --
-- scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...] --scanl1 :: (Char -> Char -> Char) -> Text -> Text -- | O(n) scanr is the right-to-left dual of scanl. -- Performs replacement on invalid scalar values. -- --
-- scanr f v == reverse . scanl (flip f) v . reverse --scanr :: (Char -> Char -> Char) -> Char -> Text -> Text -- | O(n) scanr1 is a variant of scanr that has no -- starting value argument. Performs replacement on invalid scalar -- values. scanr1 :: (Char -> Char -> Char) -> Text -> Text -- | O(n) Like a combination of map and foldl'. -- Applies a function to each element of a Text, passing an -- accumulating parameter from left to right, and returns a final -- Text. Performs replacement on invalid scalar values. mapAccumL :: (a -> Char -> (a, Char)) -> a -> Text -> (a, Text) -- | The mapAccumR function behaves like a combination of map -- and a strict foldr; it applies a function to each element of a -- Text, passing an accumulating parameter from right to left, and -- returning a final value of this accumulator together with the new -- Text. Performs replacement on invalid scalar values. mapAccumR :: (a -> Char -> (a, Char)) -> a -> Text -> (a, Text) -- | repeat x is an infinite Text, with x -- the value of every element. repeat :: Char -> Text -- | O(n*m) replicate n t is a Text -- consisting of the input t repeated n times. replicate :: Int64 -> Text -> Text -- | cycle ties a finite, non-empty Text into a circular one, -- or equivalently, the infinite repetition of the original Text. cycle :: HasCallStack => Text -> Text -- | iterate f x returns an infinite Text of -- repeated applications of f to x: -- --
-- iterate f x == [x, f x, f (f x), ...] --iterate :: (Char -> Char) -> Char -> Text -- | O(n), where n is the length of the result. The -- unfoldr function is analogous to the List unfoldr. -- unfoldr builds a Text from a seed value. The function -- takes the element and returns Nothing if it is done producing -- the Text, otherwise Just (a,b). In this case, -- a is the next Char in the string, and b is -- the seed value for further production. Performs replacement on invalid -- scalar values. unfoldr :: (a -> Maybe (Char, a)) -> a -> Text -- | O(n) Like unfoldr, unfoldrN builds a Text -- from a seed value. However, the length of the result should be limited -- by the first argument to unfoldrN. This function is more -- efficient than unfoldr when the maximum length of the result is -- known and correct, otherwise its performance is similar to -- unfoldr. Performs replacement on invalid scalar values. unfoldrN :: Int64 -> (a -> Maybe (Char, a)) -> a -> Text -- | O(n) take n, applied to a Text, returns -- the prefix of the Text of length n, or the Text -- itself if n is greater than the length of the Text. take :: Int64 -> Text -> Text -- | O(n) takeEnd n t returns the suffix -- remaining after taking n characters from the end of -- t. -- -- Examples: -- --
-- takeEnd 3 "foobar" == "bar" --takeEnd :: Int64 -> Text -> Text -- | O(n) drop n, applied to a Text, returns -- the suffix of the Text after the first n characters, -- or the empty Text if n is greater than the length of -- the Text. drop :: Int64 -> Text -> Text -- | O(n) dropEnd n t returns the prefix -- remaining after dropping n characters from the end of -- t. -- -- Examples: -- --
-- dropEnd 3 "foobar" == "foo" --dropEnd :: Int64 -> Text -> Text -- | O(n) takeWhile, applied to a predicate p and a -- Text, returns the longest prefix (possibly empty) of elements -- that satisfy p. takeWhile :: (Char -> Bool) -> Text -> Text -- | O(n) takeWhileEnd, applied to a predicate p and -- a Text, returns the longest suffix (possibly empty) of elements -- that satisfy p. Examples: -- --
-- takeWhileEnd (=='o') "foo" == "oo" --takeWhileEnd :: (Char -> Bool) -> Text -> Text -- | O(n) dropWhile p t returns the suffix -- remaining after takeWhile p t. dropWhile :: (Char -> Bool) -> Text -> Text -- | O(n) dropWhileEnd p t returns the -- prefix remaining after dropping characters that satisfy the predicate -- p from the end of t. -- -- Examples: -- --
-- dropWhileEnd (=='.') "foo..." == "foo" --dropWhileEnd :: (Char -> Bool) -> Text -> Text -- | O(n) dropAround p t returns the -- substring remaining after dropping characters that satisfy the -- predicate p from both the beginning and end of t. dropAround :: (Char -> Bool) -> Text -> Text -- | O(n) Remove leading and trailing white space from a string. -- Equivalent to: -- --
-- dropAround isSpace --strip :: Text -> Text -- | O(n) Remove leading white space from a string. Equivalent to: -- --
-- dropWhile isSpace --stripStart :: Text -> Text -- | O(n) Remove trailing white space from a string. Equivalent to: -- --
-- dropWhileEnd isSpace --stripEnd :: Text -> Text -- | O(n) splitAt n t returns a pair whose first -- element is a prefix of t of length n, and whose -- second is the remainder of the string. It is equivalent to -- (take n t, drop n t). splitAt :: Int64 -> Text -> (Text, Text) -- | O(n) span, applied to a predicate p and text -- t, returns a pair whose first element is the longest prefix -- (possibly empty) of t of elements that satisfy p, -- and whose second is the remainder of the text. -- --
-- >>> T.span (=='0') "000AB"
-- ("000","AB")
--
span :: (Char -> Bool) -> Text -> (Text, Text)
-- | O(length of prefix) spanM, applied to a monadic
-- predicate p, a text t, returns a pair (t1,
-- t2) where t1 is the longest prefix of t whose
-- elements satisfy p, and t2 is the remainder of the
-- text.
--
--
-- >>> T.spanM (\c -> state $ \i -> (fromEnum c == i, i+1)) "abcefg" `runState` 97
-- (("abc","efg"),101)
--
--
-- span is spanM specialized to Identity:
--
-- -- -- for all p :: Char -> Bool -- span p = runIdentity . spanM (pure . p) --spanM :: Monad m => (Char -> m Bool) -> Text -> m (Text, Text) -- | O(length of suffix) spanEndM, applied to a monadic -- predicate p, a text t, returns a pair (t1, -- t2) where t2 is the longest suffix of t whose -- elements satisfy p, and t1 is the remainder of the -- text. -- --
-- >>> T.spanEndM (\c -> state $ \i -> (fromEnum c == i, i-1)) "tuvxyz" `runState` 122
-- (("tuv","xyz"),118)
--
--
-- -- spanEndM p . reverse = fmap (bimap reverse reverse) . spanM p --spanEndM :: Monad m => (Char -> m Bool) -> Text -> m (Text, Text) -- | O(n+m) Find the first instance of needle (which must -- be non-null) in haystack. The first element of the -- returned tuple is the prefix of haystack before -- needle is matched. The second is the remainder of -- haystack, starting with the match. -- -- Examples: -- --
-- breakOn "::" "a::b::c" ==> ("a", "::b::c")
-- breakOn "/" "foobar" ==> ("foobar", "")
--
--
-- Laws:
--
-- -- append prefix match == haystack -- where (prefix, match) = breakOn needle haystack ---- -- If you need to break a string by a substring repeatedly (e.g. you want -- to break on every instance of a substring), use breakOnAll -- instead, as it has lower startup overhead. -- -- This function is strict in its first argument, and lazy in its second. -- -- In (unlikely) bad cases, this function's time complexity degrades -- towards O(n*m). breakOn :: HasCallStack => Text -> Text -> (Text, Text) -- | O(n+m) Similar to breakOn, but searches from the end of -- the string. -- -- The first element of the returned tuple is the prefix of -- haystack up to and including the last match of -- needle. The second is the remainder of haystack, -- following the match. -- --
-- breakOnEnd "::" "a::b::c" ==> ("a::b::", "c")
--
breakOnEnd :: HasCallStack => Text -> Text -> (Text, Text)
-- | O(n) break is like span, but the prefix returned
-- is over elements that fail the predicate p.
--
--
-- >>> T.break (=='c') "180cm"
-- ("180","cm")
--
break :: (Char -> Bool) -> Text -> (Text, Text)
-- | The group function takes a Text and returns a list of
-- Texts such that the concatenation of the result is equal to the
-- argument. Moreover, each sublist in the result contains only equal
-- elements. For example,
--
-- -- group "Mississippi" = ["M","i","ss","i","ss","i","pp","i"] ---- -- It is a special case of groupBy, which allows the programmer to -- supply their own equality test. group :: Text -> [Text] -- | The groupBy function is the non-overloaded version of -- group. groupBy :: (Char -> Char -> Bool) -> Text -> [Text] -- | O(n²) Return all initial segments of the given Text, -- shortest first. inits :: Text -> [Text] -- | O(n²) Return all initial segments of the given Text, -- shortest first. initsNE :: Text -> NonEmpty Text -- | O(n) Return all final segments of the given Text, -- longest first. tails :: Text -> [Text] -- | O(n) Return all final segments of the given Text, -- longest first. tailsNE :: Text -> NonEmpty Text -- | O(m+n) Break a Text into pieces separated by the first -- Text argument (which cannot be an empty string), consuming the -- delimiter. An empty delimiter is invalid, and will cause an error to -- be raised. -- -- Examples: -- --
-- splitOn "\r\n" "a\r\nb\r\nd\r\ne" == ["a","b","d","e"] -- splitOn "aaa" "aaaXaaaXaaaXaaa" == ["","X","X","X",""] -- splitOn "x" "x" == ["",""] ---- -- and -- --
-- intercalate s . splitOn s == id -- splitOn (singleton c) == split (==c) ---- -- (Note: the string s to split on above cannot be empty.) -- -- This function is strict in its first argument, and lazy in its second. -- -- In (unlikely) bad cases, this function's time complexity degrades -- towards O(n*m). splitOn :: HasCallStack => Text -> Text -> [Text] -- | O(n) Splits a Text into components delimited by -- separators, where the predicate returns True for a separator element. -- The resulting components do not contain the separators. Two adjacent -- separators result in an empty component in the output. eg. -- --
-- split (=='a') "aabbaca" == ["","","bb","c",""] -- split (=='a') [] == [""] --split :: (Char -> Bool) -> Text -> [Text] -- | O(n) Splits a Text into components of length k. -- The last element may be shorter than the other chunks, depending on -- the length of the input. Examples: -- --
-- chunksOf 3 "foobarbaz" == ["foo","bar","baz"] -- chunksOf 4 "haskell.org" == ["hask","ell.","org"] --chunksOf :: Int64 -> Text -> [Text] -- | O(n) Breaks a Text up into a list of Texts at -- newline characters '\n' (LF, line feed). The resulting -- strings do not contain newlines. -- -- lines does not treat '\r' (CR, carriage return) -- as a newline character. lines :: Text -> [Text] -- | O(n) Breaks a Text up into a list of words, delimited by -- Chars representing white space. words :: Text -> [Text] -- | O(n) Joins lines, after appending a terminating newline to -- each. unlines :: [Text] -> Text -- | O(n) Joins words using single space characters. unwords :: [Text] -> Text -- | O(n) The isPrefixOf function takes two Texts and -- returns True if and only if the first is a prefix of the -- second. isPrefixOf :: Text -> Text -> Bool -- | O(n) The isSuffixOf function takes two Texts and -- returns True if and only if the first is a suffix of the -- second. isSuffixOf :: Text -> Text -> Bool -- | O(n+m) The isInfixOf function takes two Texts and -- returns True if and only if the first is contained, wholly and -- intact, anywhere within the second. -- -- This function is strict in its first argument, and lazy in its second. -- -- In (unlikely) bad cases, this function's time complexity degrades -- towards O(n*m). isInfixOf :: Text -> Text -> Bool -- | O(n) Return the suffix of the second string if its prefix -- matches the entire first string. -- -- Examples: -- --
-- stripPrefix "foo" "foobar" == Just "bar" -- stripPrefix "" "baz" == Just "baz" -- stripPrefix "foo" "quux" == Nothing ---- -- This is particularly useful with the ViewPatterns extension -- to GHC, as follows: -- --
-- {-# LANGUAGE ViewPatterns #-}
-- import Data.Text.Lazy as T
--
-- fnordLength :: Text -> Int
-- fnordLength (stripPrefix "fnord" -> Just suf) = T.length suf
-- fnordLength _ = -1
--
stripPrefix :: Text -> Text -> Maybe Text
-- | O(n) Return the prefix of the second string if its suffix
-- matches the entire first string.
--
-- Examples:
--
-- -- stripSuffix "bar" "foobar" == Just "foo" -- stripSuffix "" "baz" == Just "baz" -- stripSuffix "foo" "quux" == Nothing ---- -- This is particularly useful with the ViewPatterns extension -- to GHC, as follows: -- --
-- {-# LANGUAGE ViewPatterns #-}
-- import Data.Text.Lazy as T
--
-- quuxLength :: Text -> Int
-- quuxLength (stripSuffix "quux" -> Just pre) = T.length pre
-- quuxLength _ = -1
--
stripSuffix :: Text -> Text -> Maybe Text
-- | O(n) Find the longest non-empty common prefix of two strings
-- and return it, along with the suffixes of each string at which they no
-- longer match.
--
-- If the strings do not have a common prefix or either one is empty,
-- this function returns Nothing.
--
-- Examples:
--
--
-- commonPrefixes "foobar" "fooquux" == Just ("foo","bar","quux")
-- commonPrefixes "veeble" "fetzer" == Nothing
-- commonPrefixes "" "baz" == Nothing
--
commonPrefixes :: Text -> Text -> Maybe (Text, Text, Text)
-- | O(n) filter, applied to a predicate and a Text,
-- returns a Text containing those characters that satisfy the
-- predicate.
filter :: (Char -> Bool) -> Text -> Text
-- | O(n) The find function takes a predicate and a
-- Text, and returns the first element in matching the predicate,
-- or Nothing if there is no such element.
find :: (Char -> Bool) -> Text -> Maybe Char
-- | O(n) The elem function takes a character and a
-- Text, and returns True if the element is found in the
-- given Text, or False otherwise.
elem :: Char -> Text -> Bool
-- | O(n+m) Find all non-overlapping instances of needle in
-- haystack. Each element of the returned list consists of a
-- pair:
--
--
-- breakOnAll "::" ""
-- ==> []
-- breakOnAll "/" "a/b/c/"
-- ==> [("a", "/b/c/"), ("a/b", "/c/"), ("a/b/c", "/")]
--
--
-- This function is strict in its first argument, and lazy in its second.
--
-- In (unlikely) bad cases, this function's time complexity degrades
-- towards O(n*m).
--
-- The needle parameter may not be empty.
breakOnAll :: HasCallStack => Text -> Text -> [(Text, Text)]
-- | O(n) The partition function takes a predicate and a
-- Text, and returns the pair of Texts with elements which
-- do and do not satisfy the predicate, respectively; i.e.
--
-- -- partition p t == (filter p t, filter (not . p) t) --partition :: (Char -> Bool) -> Text -> (Text, Text) -- | O(n) Text index (subscript) operator, starting from 0. index :: HasCallStack => Text -> Int64 -> Char -- | O(n+m) The count function returns the number of times -- the query string appears in the given Text. An empty query -- string is invalid, and will cause an error to be raised. -- -- In (unlikely) bad cases, this function's time complexity degrades -- towards O(n*m). count :: HasCallStack => Text -> Text -> Int64 -- | O(n) zip takes two Texts and returns a list of -- corresponding pairs of bytes. If one input Text is short, -- excess elements of the longer Text are discarded. This is -- equivalent to a pair of unpack operations. zip :: Text -> Text -> [(Char, Char)] -- | O(n) zipWith generalises zip by zipping with the -- function given as the first argument, instead of a tupling function. -- Performs replacement on invalid scalar values. zipWith :: (Char -> Char -> Char) -> Text -> Text -> Text -- | Convert a value to lazy Text. show :: Show a => a -> Text instance Data.Binary.Class.Binary Data.Text.Internal.Lazy.Text instance GHC.Internal.Data.Data.Data Data.Text.Internal.Lazy.Text instance GHC.Classes.Eq Data.Text.Internal.Lazy.Text instance GHC.Internal.IsList.IsList Data.Text.Internal.Lazy.Text instance GHC.Internal.Data.String.IsString Data.Text.Internal.Lazy.Text instance Language.Haskell.TH.Syntax.Lift Data.Text.Internal.Lazy.Text instance GHC.Internal.Base.Monoid Data.Text.Internal.Lazy.Text instance Control.DeepSeq.NFData Data.Text.Internal.Lazy.Text instance GHC.Classes.Ord Data.Text.Internal.Lazy.Text instance Text.Printf.PrintfArg Data.Text.Internal.Lazy.Text instance GHC.Internal.Read.Read Data.Text.Internal.Lazy.Text instance GHC.Internal.Base.Semigroup Data.Text.Internal.Lazy.Text instance GHC.Internal.Show.Show Data.Text.Internal.Lazy.Text -- | Functions used frequently when reading textual data. module Data.Text.Lazy.Read -- | Read some text. If the read succeeds, return its value and the -- remaining text, otherwise an error message. type Reader a = Text -> Either String (a, Text) -- | Read a decimal integer. The input must begin with at least one decimal -- digit, and is consumed until a non-digit or end of string is reached. -- -- This function does not handle leading sign characters. If you need to -- handle signed input, use signed decimal. -- -- Note: For fixed-width integer types, this function does not -- attempt to detect overflow, so a sufficiently long input may give -- incorrect results. If you are worried about overflow, use -- Integer for your result type. decimal :: Integral a => Reader a -- | Read a hexadecimal integer, consisting of an optional leading -- "0x" followed by at least one hexadecimal digit. Input is -- consumed until a non-hex-digit or end of string is reached. This -- function is case insensitive. -- -- This function does not handle leading sign characters. If you need to -- handle signed input, use signed hexadecimal. -- -- Note: For fixed-width integer types, this function does not -- attempt to detect overflow, so a sufficiently long input may give -- incorrect results. If you are worried about overflow, use -- Integer for your result type. hexadecimal :: Integral a => Reader a -- | Read an optional leading sign character ('-' or '+') -- and apply it to the result of applying the given reader. signed :: Num a => Reader a -> Reader a -- | Read a rational number. -- -- This function accepts an optional leading sign character, followed by -- at least one decimal digit. The syntax similar to that accepted by the -- read function, with the exception that a trailing '.' -- or 'e' not followed by a number is not consumed. -- -- Examples: -- --
-- rational "3" == Right (3.0, "") -- rational "3.1" == Right (3.1, "") -- rational "3e4" == Right (30000.0, "") -- rational "3.1e4" == Right (31000.0, "") -- rational ".3" == Left "input does not start with a digit" -- rational "e3" == Left "input does not start with a digit" ---- -- Examples of differences from read: -- --
-- rational "3.foo" == Right (3.0, ".foo") -- rational "3e" == Right (3.0, "e") --rational :: Fractional a => Reader a -- | Read a rational number. -- -- The syntax accepted by this function is the same as for -- rational. -- -- Note: This function is almost ten times faster than -- rational, but is slightly less accurate. -- -- The Double type supports about 16 decimal places of accuracy. -- For 94.2% of numbers, this function and rational give identical -- results, but for the remaining 5.8%, this function loses precision -- around the 15th decimal place. For 0.001% of numbers, this function -- will lose precision at the 13th or 14th decimal place. double :: Reader Double -- | Warning: this is an internal module, and does not have a stable -- API or name. Functions in this module may not check or enforce -- preconditions expected by public modules. Use at your own risk! -- -- Low-level support for text I/O. module Data.Text.Internal.IO -- | Read a single line of input from a handle, constructing a list of -- decoded chunks as we go. When we're done, transform them into the -- destination type. hGetLineWith :: ([Text] -> t) -> Handle -> IO t -- | Read a single chunk of strict text from a buffer. Used by both the -- strict and lazy implementations of hGetContents. readChunk :: Handle__ -> CharBuffer -> IO Text -- | Print a Stream Char. hPutStream :: Handle -> Stream Char -> IO () -- | Write a string to a handle. hPutStr :: Handle -> Text -> IO () -- | Write a string to a handle, followed by a newline. hPutStrLn :: Handle -> Text -> IO () -- | Efficient locale-sensitive support for lazy text I/O. -- -- The functions in this module obey the runtime system's locale, -- character set encoding, and line ending conversion settings. -- -- If you know in advance that you will be working with data that has a -- specific encoding (e.g. UTF-8), and your application is highly -- performance sensitive, you may find that it is faster to perform I/O -- with bytestrings and to encode and decode yourself than to use the -- functions in this module. module Data.Text.Lazy.IO -- | Read a file and return its contents as a string. The file is read -- lazily, as with getContents. -- -- Beware that this function (similarly to readFile) is -- locale-dependent. Unexpected system locale may cause your application -- to read corrupted data or throw runtime exceptions about "invalid -- argument (invalid byte sequence)" or "invalid argument (invalid -- character)". This is also slow, because GHC first converts an entire -- input to UTF-32, which is afterwards converted to UTF-8. -- -- If your data is UTF-8, using decodeUtf8 . -- readFile is a much faster and safer alternative. readFile :: FilePath -> IO Text -- | Write a string to a file. The file is truncated to zero length before -- writing begins. writeFile :: FilePath -> Text -> IO () -- | Write a string to the end of a file. appendFile :: FilePath -> Text -> IO () -- | Lazily read the remaining contents of a Handle. The -- Handle will be closed after the read completes, or on error. hGetContents :: Handle -> IO Text -- | Read a single line from a handle. hGetLine :: Handle -> IO Text -- | Write a string to a handle. hPutStr :: Handle -> Text -> IO () -- | Write a string to a handle, followed by a newline. hPutStrLn :: Handle -> Text -> IO () -- | The interact function takes a function of type Text -> -- Text as its argument. The entire input from the standard input -- device is passed (lazily) to this function as its argument, and the -- resulting string is output on the standard output device. interact :: (Text -> Text) -> IO () -- | Lazily read all user input on stdin as a single string. getContents :: IO Text -- | Read a single line of user input from stdin. getLine :: IO Text -- | Write a string to stdout. putStr :: Text -> IO () -- | Write a string to stdout, followed by a newline. putStrLn :: Text -> IO () -- | Warning: this is an internal module, and does not have a stable -- API or name. Functions in this module may not check or enforce -- preconditions expected by public modules. Use at your own risk! -- -- Efficient construction of lazy Text values. The principal -- operations on a Builder are singleton, -- fromText, and fromLazyText, which construct new -- builders, and mappend, which concatenates two builders. -- -- To get maximum performance when building lazy Text values -- using a builder, associate mappend calls to the right. For -- example, prefer -- --
-- singleton 'a' `mappend` (singleton 'b' `mappend` singleton 'c') ---- -- to -- --
-- singleton 'a' `mappend` singleton 'b' `mappend` singleton 'c' ---- -- as the latter associates mappend to the left. module Data.Text.Internal.Builder -- | A Builder is an efficient way to build lazy Text -- values. There are several functions for constructing builders, but -- only one to inspect them: to extract any data, you have to turn them -- into lazy Text values using toLazyText. -- -- Internally, a builder constructs a lazy Text by filling -- arrays piece by piece. As each buffer is filled, it is 'popped' off, -- to become a new chunk of the resulting lazy Text. All this is -- hidden from the user of the Builder. data Builder type LazyTextBuilder = Builder -- | O(n). Extract a lazy Text from a Builder with -- a default buffer size. The construction work takes place if and when -- the relevant part of the lazy Text is demanded. toLazyText :: Builder -> Text -- | O(n). Extract a lazy Text from a Builder, -- using the given size for the initial buffer. The construction work -- takes place if and when the relevant part of the lazy Text is -- demanded. -- -- If the initial buffer is too small to hold all data, subsequent -- buffers will be the default buffer size. toLazyTextWith :: Int -> Builder -> Text -- | O(1). A Builder taking a single character, satisfying -- --
toLazyText (singleton c) = singleton -- c
toLazyText (fromText t) = fromChunks -- [t]
toLazyText (fromLazyText t) = t
toLazyText (fromString s) = fromChunks -- [S.pack s]
-- >>> fromString "\55555" -- "\65533" --fromString :: String -> Builder -- | O(1). Pop the strict Text we have constructed so far, -- if any, yielding a new chunk in the result lazy Text. flush :: Builder append' :: Builder -> Builder -> Builder -- | Ensure that there are at least n many elements available. ensureFree :: Int -> Builder -- | Ensure that n many elements are available, and then use -- f to write some elements into the memory. writeN :: Int -> (forall s. () => MArray s -> Int -> ST s ()) -> Builder instance GHC.Classes.Eq Data.Text.Internal.Builder.Builder instance GHC.Internal.Data.String.IsString Data.Text.Internal.Builder.Builder instance GHC.Internal.Base.Monoid Data.Text.Internal.Builder.Builder instance GHC.Classes.Ord Data.Text.Internal.Builder.Builder instance GHC.Internal.Base.Semigroup Data.Text.Internal.Builder.Builder instance GHC.Internal.Show.Show Data.Text.Internal.Builder.Builder -- | Efficient construction of lazy Text values. The principal -- operations on a Builder are singleton, -- fromText, and fromLazyText, which construct new -- builders, and mappend, which concatenates two builders. -- -- To get maximum performance when building lazy Text values -- using a builder, associate mappend calls to the right. For -- example, prefer -- --
-- singleton 'a' `mappend` (singleton 'b' `mappend` singleton 'c') ---- -- to -- --
-- singleton 'a' `mappend` singleton 'b' `mappend` singleton 'c' ---- -- as the latter associates mappend to the left. Or, -- equivalently, prefer -- --
-- singleton 'a' <> singleton 'b' <> singleton 'c' ---- -- since the <> from recent versions of Monoid -- associates to the right. module Data.Text.Lazy.Builder -- | A Builder is an efficient way to build lazy Text -- values. There are several functions for constructing builders, but -- only one to inspect them: to extract any data, you have to turn them -- into lazy Text values using toLazyText. -- -- Internally, a builder constructs a lazy Text by filling -- arrays piece by piece. As each buffer is filled, it is 'popped' off, -- to become a new chunk of the resulting lazy Text. All this is -- hidden from the user of the Builder. data Builder type LazyTextBuilder = Builder -- | O(n). Extract a lazy Text from a Builder with -- a default buffer size. The construction work takes place if and when -- the relevant part of the lazy Text is demanded. toLazyText :: Builder -> Text -- | O(n). Extract a lazy Text from a Builder, -- using the given size for the initial buffer. The construction work -- takes place if and when the relevant part of the lazy Text is -- demanded. -- -- If the initial buffer is too small to hold all data, subsequent -- buffers will be the default buffer size. toLazyTextWith :: Int -> Builder -> Text -- | O(1). A Builder taking a single character, satisfying -- --
toLazyText (singleton c) = singleton -- c
toLazyText (fromText t) = fromChunks -- [t]
toLazyText (fromLazyText t) = t
toLazyText (fromString s) = fromChunks -- [S.pack s]
-- >>> fromString "\55555" -- "\65533" --fromString :: String -> Builder -- | O(1). Pop the strict Text we have constructed so far, -- if any, yielding a new chunk in the result lazy Text. flush :: Builder -- | Warning: this is an internal module, and does not have a stable -- API or name. Functions in this module may not check or enforce -- preconditions expected by public modules. Use at your own risk! -- -- Useful functions and combinators. module Data.Text.Internal.Builder.Functions -- | The normal mappend function with right associativity instead of -- left. (<>) :: Builder -> Builder -> Builder infixr 4 <> -- | Unsafe conversion for decimal digits. i2d :: Int -> Char module Data.Text.Lazy.Builder.Int decimal :: Integral a => a -> Builder hexadecimal :: Integral a => a -> Builder -- | Write a floating point value to a Builder. module Data.Text.Lazy.Builder.RealFloat -- | Control the rendering of floating point numbers. data FPFormat -- | Scientific notation (e.g. 2.3e123). Exponent :: FPFormat -- | Standard decimal notation. Fixed :: FPFormat -- | Use decimal notation for values between 0.1 and -- 9,999,999, and scientific notation otherwise. Generic :: FPFormat -- | Show a signed RealFloat value to full precision, using standard -- decimal notation for arguments whose absolute value lies between -- 0.1 and 9,999,999, and scientific notation -- otherwise. realFloat :: RealFloat a => a -> Builder -- | Encode a signed RealFloat according to FPFormat and -- optionally requested precision. -- -- This corresponds to the show{E,F,G}Float operations provided -- by base's Numeric module. -- -- NOTE: The functions in base-4.12 changed the -- serialisation in case of a Just 0 precision; this version of -- text still provides the serialisation as implemented in -- base-4.11. The next major version of text will -- switch to the more correct base-4.12 serialisation. formatRealFloat :: RealFloat a => FPFormat -> Maybe Int -> a -> Builder instance GHC.Internal.Enum.Bounded Data.Text.Lazy.Builder.RealFloat.FPFormat instance GHC.Internal.Enum.Enum Data.Text.Lazy.Builder.RealFloat.FPFormat instance GHC.Internal.Read.Read Data.Text.Lazy.Builder.RealFloat.FPFormat instance GHC.Internal.Show.Show Data.Text.Lazy.Builder.RealFloat.FPFormat -- | Efficient UTF-8 support for text I/O. Unlike Data.Text.IO, -- these functions do not depend on the locale and do not do line ending -- conversion. module Data.Text.IO.Utf8 -- | The readFile function reads a file and returns the contents of -- the file as a string. The entire file is read strictly, as with -- getContents. readFile :: FilePath -> IO Text -- | Write a string to a file. The file is truncated to zero length before -- writing begins. writeFile :: FilePath -> Text -> IO () -- | Write a string to the end of a file. appendFile :: FilePath -> Text -> IO () -- | Read the remaining contents of a Handle as a string. hGetContents :: Handle -> IO Text -- | Read a single line from a handle. hGetLine :: Handle -> IO Text -- | Write a string to a handle. hPutStr :: Handle -> Text -> IO () -- | Write a string to a handle, followed by a newline. hPutStrLn :: Handle -> Text -> IO () -- | The interact function takes a function of type Text -> -- Text as its argument. The entire input from the standard input -- device is passed to this function as its argument, and the resulting -- string is output on the standard output device. interact :: (Text -> Text) -> IO () -- | Read all user input on stdin as a single string. getContents :: IO Text -- | Read a single line of user input from stdin. getLine :: IO Text -- | Write a string to stdout. putStr :: Text -> IO () -- | Write a string to stdout, followed by a newline. putStrLn :: Text -> IO () -- | Efficient locale-sensitive support for text I/O. -- -- The functions in this module obey the runtime system's locale, -- character set encoding, and line ending conversion settings. -- -- If you want to do I/O using the UTF-8 encoding, use -- Data.Text.IO.Utf8, which is faster than this module. -- -- If you know in advance that you will be working with data that has a -- specific encoding, and your application is highly performance -- sensitive, you may find that it is faster to perform I/O with -- bytestrings and to encode and decode yourself than to use the -- functions in this module. module Data.Text.IO -- | The readFile function reads a file and returns the contents of -- the file as a string. The entire file is read strictly, as with -- getContents. -- -- Beware that this function (similarly to readFile) is -- locale-dependent. Unexpected system locale may cause your application -- to read corrupted data or throw runtime exceptions about "invalid -- argument (invalid byte sequence)" or "invalid argument (invalid -- character)". This is also slow, because GHC first converts an entire -- input to UTF-32, which is afterwards converted to UTF-8. -- -- If your data is UTF-8, using decodeUtf8 . -- readFile is a much faster and safer alternative. readFile :: FilePath -> IO Text -- | Write a string to a file. The file is truncated to zero length before -- writing begins. writeFile :: FilePath -> Text -> IO () -- | Write a string to the end of a file. appendFile :: FilePath -> Text -> IO () -- | Read the remaining contents of a Handle as a string. The -- Handle is closed once the contents have been read, or if an -- exception is thrown. -- -- Internally, this function reads a chunk at a time from the lower-level -- buffering abstraction, and concatenates the chunks into a single -- string once the entire file has been read. -- -- As a result, it requires approximately twice as much memory as its -- result to construct its result. For files more than a half of -- available RAM in size, this may result in memory exhaustion. hGetContents :: Handle -> IO Text -- | Experimental. Read a single chunk of strict text from a -- Handle. The size of the chunk depends on the amount of input -- currently buffered. -- -- This function blocks only if there is no data available, and EOF has -- not yet been reached. Once EOF is reached, this function returns an -- empty string instead of throwing an exception. hGetChunk :: Handle -> IO Text -- | Read a single line from a handle. hGetLine :: Handle -> IO Text -- | Write a string to a handle. hPutStr :: Handle -> Text -> IO () -- | Write a string to a handle, followed by a newline. hPutStrLn :: Handle -> Text -> IO () -- | The interact function takes a function of type Text -> -- Text as its argument. The entire input from the standard input -- device is passed to this function as its argument, and the resulting -- string is output on the standard output device. interact :: (Text -> Text) -> IO () -- | Read all user input on stdin as a single string. getContents :: IO Text -- | Read a single line of user input from stdin. getLine :: IO Text -- | Write a string to stdout. putStr :: Text -> IO () -- | Write a string to stdout, followed by a newline. putStrLn :: Text -> IO ()