compact-string-0.3.1: Data/CompactString/signatures.include
-- Type signatures & Haddock comment
-- these are used by both the normal Data.CompactString
-- and the versions specialized to a specific encoding
--
-- Requires:
-- #define COMPACTSTRING
-- #define CONTEXT
-- -----------------------------------------------------------------------------
--
-- Construction
--
-- | /O(1)/ The empty 'CompactString'
empty :: COMPACTSTRING
-- | /O(1)/ Convert a 'Char' into a 'CompactString'
singleton :: CONTEXT Char -> COMPACTSTRING
-- | /O(n)/ Convert a 'String' into a 'CompactString'.
pack :: CONTEXT String -> COMPACTSTRING
-- | /O(n)/ Converts a 'CompactString' to a 'String'.
unpack :: CONTEXT COMPACTSTRING -> String
-- -----------------------------------------------------------------------------
--
-- Basic interface
--
-- | /O(n)/ 'cons' is analogous to (:) for lists, but of different
-- complexity, as it requires a memcpy.
cons :: CONTEXT Char -> COMPACTSTRING -> COMPACTSTRING
-- | /O(n)/ Append a byte to the end of a 'CompactString'
snoc :: CONTEXT COMPACTSTRING -> Char -> COMPACTSTRING
-- | /O(1)/ Extract the first element of a CompactString, which must be non-empty.
-- An exception will be thrown in the case of an empty CompactString.
head :: CONTEXT COMPACTSTRING -> Char
-- | /O(1)/ Extract the elements after the head of a CompactString, which must be non-empty.
-- An exception will be thrown in the case of an empty CompactString.
tail :: CONTEXT COMPACTSTRING -> COMPACTSTRING
-- | /O(1)/ Extract the last element of a ByteString, which must be finite and non-empty.
-- An exception will be thrown in the case of an empty ByteString.
last :: CONTEXT COMPACTSTRING -> Char
-- | /O(1)/ Return all the elements of a 'CompactString' except the last one.
-- An exception will be thrown in the case of an empty ByteString.
init :: CONTEXT COMPACTSTRING -> COMPACTSTRING
-- | /O(1)/ A view of the front of a 'CompactString'.
--
-- > headView s = if null s then Nothing else Just (head s, tail s)
headView :: CONTEXT COMPACTSTRING -> Maybe (Char, COMPACTSTRING)
-- | /O(1)/ A view of the back of a 'CompactString'.
--
-- > lastView s = if null s then Nothing else Just (init s, last s)
lastView :: CONTEXT COMPACTSTRING -> Maybe (COMPACTSTRING, Char)
-- | /O(n)/ Append two CompactStrings
append :: CONTEXT COMPACTSTRING -> COMPACTSTRING -> COMPACTSTRING
-- | /O(1)/ Test whether a CompactString is empty.
null :: CONTEXT COMPACTSTRING -> Bool
-- | /O(n)/ 'length' returns the length of a CompactString as an 'Int'.
length :: CONTEXT COMPACTSTRING -> Int
-- -----------------------------------------------------------------------------
--
-- Transforming 'CompactString's
--
-- | /O(n)/ 'map' @f xs@ is the CompactString obtained by applying @f@ to each
-- element of @xs@. This function is subject to array fusion.
map :: CONTEXT (Char -> Char) -> COMPACTSTRING -> COMPACTSTRING
-- | Reverse a 'CompactString'
reverse :: CONTEXT COMPACTSTRING -> COMPACTSTRING
-- | /O(n)/ The 'intersperse' function takes a 'Char' and a
-- 'CompactString' and \`intersperses\' that character between the elements of
-- the 'CompactString'. It is analogous to the intersperse function on
-- Lists.
intersperse :: CONTEXT Char -> COMPACTSTRING -> COMPACTSTRING
-- | /O(n)/ The 'intercalate' function takes a 'CompactString' and a list of
-- 'CompactString's and concatenates the list after interspersing the first
-- argument between each element of the list.
intercalate :: CONTEXT COMPACTSTRING -> [COMPACTSTRING] -> COMPACTSTRING
-- | The 'transpose' function transposes the rows and columns of its
-- 'CompactString' argument.
transpose :: CONTEXT [COMPACTSTRING] -> [COMPACTSTRING]
-- -----------------------------------------------------------------------------
--
-- Reducing 'CompactString's (folds)
--
-- | 'foldl', applied to a binary operator, a starting value (typically
-- the left-identity of the operator), and a CompactString, reduces the
-- CompactString using the binary operator, from left to right.
-- This function is subject to array fusion.
foldl :: CONTEXT (acc -> Char -> acc) -> acc -> COMPACTSTRING -> acc
-- | 'foldl\'' is like 'foldl', but strict in the accumulator.
-- Though actually foldl is also strict in the accumulator.
foldl'
:: CONTEXT (acc -> Char -> acc) -> acc -> COMPACTSTRING -> acc
-- | 'foldr', applied to a binary operator, a starting value
-- (typically the right-identity of the operator), and a CompactString,
-- reduces the CompactString using the binary operator, from right to left.
foldr :: CONTEXT (Char -> acc -> acc) -> acc -> COMPACTSTRING -> acc
-- | 'foldr', applied to a binary operator, a starting value
-- (typically the right-identity of the operator), and a CompactString,
-- reduces the CompactString using the binary operator, from right to left.
foldr'
:: CONTEXT (Char -> acc -> acc) -> acc -> COMPACTSTRING -> acc
-- | 'foldl1' is a variant of 'foldl' that has no starting value
-- argument, and thus must be applied to non-empty 'CompactString'.
-- This function is subject to array fusion.
-- An exception will be thrown in the case of an empty CompactString.
foldl1 :: CONTEXT (Char -> Char -> Char) -> COMPACTSTRING -> Char
-- | 'foldl1\'' is like 'foldl1', but strict in the accumulator.
-- An exception will be thrown in the case of an empty CompactString.
foldl1'
:: CONTEXT (Char -> Char -> Char) -> COMPACTSTRING -> Char
-- | 'foldr1' is a variant of 'foldr' that has no starting value argument,
-- and thus must be applied to non-empty 'CompactString's
-- An exception will be thrown in the case of an empty CompactString.
foldr1 :: CONTEXT (Char -> Char -> Char) -> COMPACTSTRING -> Char
-- | 'foldr1\'' is a variant of 'foldr1', but is strict in the
-- accumulator.
-- An exception will be thrown in the case of an empty CompactString.
foldr1'
:: CONTEXT (Char -> Char -> Char) -> COMPACTSTRING -> Char
-- -----------------------------------------------------------------------------
--
-- Special folds
--
-- | /O(n)/ Concatenate a list of 'CompactString's.
concat :: CONTEXT [COMPACTSTRING] -> COMPACTSTRING
-- | Map a function over a 'CompactString' and concatenate the results
concatMap :: CONTEXT (Char -> COMPACTSTRING) -> COMPACTSTRING -> COMPACTSTRING
-- | /O(n)/ Applied to a predicate and a CompactString, 'any' determines if
-- any element of the 'CompactString' satisfies the predicate.
any :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> Bool
-- | /O(n)/ Applied to a predicate and a CompactString, 'any' determines if
-- all elements of the 'CompactString' satisfy the predicate.
all :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> Bool
-- | /O(n)/ 'maximum' returns the maximum value from a 'CompactString'
-- An exception will be thrown in the case of an empty CompactString.
maximum :: CONTEXT COMPACTSTRING -> Char
-- | /O(n)/ 'minimum' returns the minimum value from a 'CompactString'
-- An exception will be thrown in the case of an empty CompactString.
minimum :: CONTEXT COMPACTSTRING -> Char
-- -----------------------------------------------------------------------------
--
-- Building CompactStrings : Scans
--
-- | 'scanl' is similar to 'foldl', but returns a list of successive
-- reduced values from the left. This function will fuse.
--
-- > 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 :: CONTEXT (Char -> Char -> Char) -> Char -> COMPACTSTRING -> COMPACTSTRING
-- | 'scanl1' is a variant of 'scanl' that has no starting value argument.
-- This function will fuse.
--
-- > scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...]
scanl1 :: CONTEXT (Char -> Char -> Char) -> COMPACTSTRING -> COMPACTSTRING
-- | scanr is the right-to-left dual of scanl.
scanr :: CONTEXT (Char -> Char -> Char) -> Char -> COMPACTSTRING -> COMPACTSTRING
-- | 'scanr1' is a variant of 'scanr' that has no starting value argument.
scanr1 :: CONTEXT (Char -> Char -> Char) -> COMPACTSTRING -> COMPACTSTRING
-- -----------------------------------------------------------------------------
--
-- Building CompactStrings : Accumulating maps
--
-- | The 'mapAccumL' function behaves like a combination of 'map' and
-- 'foldl'; it applies a function to each element of a CompactString,
-- passing an accumulating parameter from left to right, and returning a
-- final value of this accumulator together with the new CompactString.
mapAccumL :: CONTEXT (acc -> Char -> (acc, Char)) -> acc -> COMPACTSTRING -> (acc, COMPACTSTRING)
-- | The 'mapAccumR' function behaves like a combination of 'map' and
-- 'foldr'; it applies a function to each element of a CompactString,
-- passing an accumulating parameter from right to left, and returning a
-- final value of this accumulator together with the new CompactString.
mapAccumR :: CONTEXT (acc -> Char -> (acc, Char)) -> acc -> COMPACTSTRING -> (acc, COMPACTSTRING)
-- | /O(n)/ map Char functions, provided with the index at each position.
mapIndexed :: CONTEXT (Int -> Char -> Char) -> COMPACTSTRING -> COMPACTSTRING
-- -----------------------------------------------------------------------------
--
-- Building CompactStrings : Unfolding CompactStrings
--
-- | /O(n)/ 'replicate' @n x@ is a CompactString of length @n@ with @x@
-- the value of every element. The following holds:
--
-- > replicate w c = unfoldr w (\u -> Just (u,u)) c
replicate :: CONTEXT Int -> Char -> COMPACTSTRING
-- | /O(n)/, where /n/ is the length of the result. The 'unfoldr'
-- function is analogous to the List \'unfoldr\'. 'unfoldr' builds a
-- ByteString from a seed value. The function takes the element and
-- returns 'Nothing' if it is done producing the CompactString or returns
-- 'Just' @(a,b)@, in which case, @a@ is the next byte in the string,
-- and @b@ is the seed value for further production.
--
-- Examples:
--
-- > unfoldr (\x -> if x <= 5 then Just (x, x + 1) else Nothing) 0
-- > == pack [0, 1, 2, 3, 4, 5]
--
unfoldr :: CONTEXT (acc -> Maybe (Char, acc)) -> acc -> COMPACTSTRING
-- | /O(n)/ Like 'unfoldr', 'unfoldrN' builds a ByteString 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 maximum length of the result is known.
--
-- The following equation relates 'unfoldrN' and 'unfoldr':
--
-- > fst (unfoldrN n f s) == take n (unfoldr f s)
--
unfoldrN :: CONTEXT Int -> (acc -> Maybe (Char, acc)) -> acc -> (COMPACTSTRING, Maybe acc)
-- -----------------------------------------------------------------------------
--
-- Substrings : Breaking strings
--
-- | /O(n)/ 'take' @n@, applied to a CompactString @xs@, returns the prefix
-- of @xs@ of length @n@, or @xs@ itself if @n > 'length' xs@.
take :: CONTEXT Int -> COMPACTSTRING -> COMPACTSTRING
-- | /O(n)/ 'drop' @n xs@ returns the suffix of @xs@ after the first @n@
-- elements, or @empty@ if @n > 'length' xs@.
drop :: CONTEXT Int -> COMPACTSTRING -> COMPACTSTRING
-- | /O(n)/ 'splitAt' @n xs@ is equivalent to @('take' n xs, 'drop' n xs)@.
splitAt :: CONTEXT Int -> COMPACTSTRING -> (COMPACTSTRING, COMPACTSTRING)
-- | 'takeWhile', applied to a predicate @p@ and a CompactString @xs@,
-- returns the longest prefix (possibly empty) of @xs@ of elements that
-- satisfy @p@.
takeWhile :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> COMPACTSTRING
-- | 'dropWhile' @p xs@ returns the suffix remaining after 'takeWhile' @p xs@.
dropWhile :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> COMPACTSTRING
-- | 'break' @p@ is equivalent to @'span' ('not' . p)@.
break :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> (COMPACTSTRING, COMPACTSTRING)
-- | 'span' @p xs@ breaks the ByteString into two segments. It is
-- equivalent to @('takeWhile' p xs, 'dropWhile' p xs)@
span :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> (COMPACTSTRING, COMPACTSTRING)
-- | 'breakEnd' behaves like 'break' but from the end of the 'CompactString'
--
-- > breakEnd p == spanEnd (not.p)
breakEnd :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> (COMPACTSTRING, COMPACTSTRING)
-- | 'spanEnd' behaves like 'span' but from the end of the 'CompactString'
--
-- We have
--
-- > spanEnd (not.isSpace) "x y z" == ("x y ","z")
--
-- and
--
-- > spanEnd (not . isSpace) cs
-- > ==
-- > let (x,y) = span (not.isSpace) (reverse cs) in (reverse y, reverse x)
--
spanEnd :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> (COMPACTSTRING, COMPACTSTRING)
-- | The 'group' function takes a 'CompactString' and returns a list of
-- CompactStrings 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 :: CONTEXT COMPACTSTRING -> [COMPACTSTRING]
-- | The 'groupBy' function is the non-overloaded version of 'group'.
groupBy :: CONTEXT (Char -> Char -> Bool) -> COMPACTSTRING -> [COMPACTSTRING]
-- | /O(n)/ Return all initial segments of the given 'CompactString', shortest first.
inits :: CONTEXT COMPACTSTRING -> [COMPACTSTRING]
-- | /O(n)/ Return all final segments of the given 'CompactString', longest first.
tails :: CONTEXT COMPACTSTRING -> [COMPACTSTRING]
-- -----------------------------------------------------------------------------
--
-- Substrings : Breaking into many substrings
--
-- | /O(n)/ Splits a 'CompactString' 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.
--
-- > splitWith (=='a') "aabbaca" == ["","","bb","c",""]
-- > splitWith (=='a') [] == []
--
splitWith :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> [COMPACTSTRING]
-- | /O(n)/ Break a 'ByteString' into pieces separated by the byte
-- argument, consuming the delimiter. I.e.
--
-- > split '\n' "a\nb\nd\ne" == ["a","b","d","e"]
-- > split 'a' "aXaXaXa" == ["","X","X","X",""]
-- > split 'x' "x" == ["",""]
--
-- and
--
-- > intercalate [c] . split c == id
-- > split == splitWith . (==)
--
-- As for all splitting functions in this library, this function does
-- not copy the substrings, it just constructs new 'CompactString' that
-- are slices of the original.
--
split :: CONTEXT Char -> COMPACTSTRING -> [COMPACTSTRING]
-- -----------------------------------------------------------------------------
--
-- Substrings : Breaking into lines and words
--
-- | 'lines' breaks a 'CompactString' up into a list of CompactStrings at
-- newline Chars. The resulting strings do not contain newlines.
lines :: CONTEXT COMPACTSTRING -> [COMPACTSTRING]
-- | 'unlines' is an inverse operation to 'lines'. It joins lines,
-- after appending a terminating newline to each.
unlines :: CONTEXT [COMPACTSTRING] -> COMPACTSTRING
-- | 'words' breaks a ByteString up into a list of words, which
-- were delimited by Chars representing white space. And
--
-- > words = filter (not . null) . splitWith isSpace
--
words :: CONTEXT COMPACTSTRING -> [COMPACTSTRING]
-- | The 'unwords' function is analogous to the 'unlines' function, on words.
unwords :: CONTEXT [COMPACTSTRING] -> COMPACTSTRING
-- -----------------------------------------------------------------------------
--
-- Predicates
--
-- | /O(n)/ The 'isPrefixOf' function takes two CompactString and returns 'True'
-- iff the first is a prefix of the second.
isPrefixOf :: COMPACTSTRING -> COMPACTSTRING -> Bool
-- | /O(n)/ The 'isSuffixOf' function takes two CompactString and returns 'True'
-- iff the first is a suffix of the second.
--
-- The following holds:
--
-- > isSuffixOf x y == reverse x `isPrefixOf` reverse y
--
isSuffixOf :: CONTEXT COMPACTSTRING -> COMPACTSTRING -> Bool
-- -----------------------------------------------------------------------------
--
-- Predicates : Search for arbitrary substrings
--
-- | Check whether one string is a substring of another. @isInfixOf
-- p s@ is equivalent to @not (null (findSubstrings p s))@.
isInfixOf :: CONTEXT COMPACTSTRING -- ^ String to search for.
-> COMPACTSTRING -- ^ String to search in.
-> Bool
-- | Get the first index of a substring in another string,
-- or 'Nothing' if the string is not found.
-- @findSubstring p s@ is equivalent to @listToMaybe (findSubstrings p s)@.
findSubstring :: CONTEXT COMPACTSTRING -- ^ String to search for.
-> COMPACTSTRING -- ^ String to seach in.
-> Maybe Int
-- | Find the indexes of all (possibly overlapping) occurances of a
-- substring in a string. This function uses the Knuth-Morris-Pratt
-- string matching algorithm.
findSubstrings :: CONTEXT COMPACTSTRING -- ^ String to search for.
-> COMPACTSTRING -- ^ String to seach in.
-> [Int]
-- -----------------------------------------------------------------------------
--
-- Searching by equality
--
-- | /O(n)/ 'elem' is the 'CompactString' membership predicate.
elem :: CONTEXT Char -> COMPACTSTRING -> Bool
-- | /O(n)/ 'notElem' is the inverse of 'elem'
notElem :: CONTEXT Char -> COMPACTSTRING -> Bool
-- -----------------------------------------------------------------------------
--
-- Searching with a predicate
--
-- | /O(n)/ The 'find' function takes a predicate and a 'CompactString',
-- and returns the first element in matching the predicate, or 'Nothing'
-- if there is no such element.
--
-- > find f p = case findIndex f p of Just n -> Just (p `index` n) ; _ -> Nothing
--
find :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> Maybe Char
-- | /O(n)/ 'filter', applied to a predicate and a 'CompactString',
-- returns a CompactString containing those characters that satisfy the
-- predicate. This function is subject to array fusion.
filter :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> COMPACTSTRING
-- | /O(n)/ 'partition', applied to a predicate and a 'CompactString',
-- returns a pair of CompactStrings.
-- The first containing those characters that satisfy the predicate,
-- the second containg those that don't.
partition :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> (COMPACTSTRING, COMPACTSTRING)
-- -----------------------------------------------------------------------------
--
-- Indexing CompactStrings
--
-- | /O(IF_FIXED(1,n))/ 'CompactString' index (subscript) operator, starting from 0.
index :: CONTEXT COMPACTSTRING -> Int -> Char
-- | /O(n)/ The 'elemIndex' function returns the index of the first
-- element in the given 'ByteString' which is equal to the query
-- element, or 'Nothing' if there is no such element.
elemIndex :: CONTEXT Char -> COMPACTSTRING -> Maybe Int
-- | /O(n)/ The 'elemIndexEnd' function returns the last index of the
-- element in the given 'CompactString' which is equal to the query
-- element, or 'Nothing' if there is no such element. The following
-- holds:
--
-- > elemIndexEnd c xs ==
-- > (-) (length xs - 1) `fmap` elemIndex c (reverse xs)
--
elemIndexEnd :: CONTEXT Char -> COMPACTSTRING -> Maybe Int
-- | /O(n)/ The 'elemIndices' function extends 'elemIndex', by returning
-- the indices of all elements equal to the query element, in ascending order.
elemIndices :: CONTEXT Char -> COMPACTSTRING -> [Int]
-- | The 'findIndex' function takes a predicate and a 'CompactString' and
-- returns the index of the first element in the CompactString
-- satisfying the predicate.
findIndex :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> Maybe Int
-- | /O(n)/ The 'findIndexEnd' function returns the last index of the
-- element in the given 'CompactString' which satisfies the predicate,
-- or 'Nothing' if there is no such element. The following holds:
--
-- > findIndexEnd c xs ==
-- > (-) (length xs - 1) `fmap` findIndex c (reverse xs)
--
findIndexEnd :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> Maybe Int
-- | The 'findIndices' function extends 'findIndex', by returning the
-- indices of all elements satisfying the predicate, in ascending order.
findIndices :: CONTEXT (Char -> Bool) -> COMPACTSTRING -> [Int]
-- | count returns the number of times its argument appears in the 'CompactString'
--
-- > count c = length . elemIndices c
count :: CONTEXT Char -> COMPACTSTRING -> Int
-- -----------------------------------------------------------------------------
--
-- Zipping and unzipping CompactStrings
--
-- | /O(n)/ 'zip' takes two ByteStrings and returns a list of
-- corresponding pairs of bytes. If one input ByteString is short,
-- excess elements of the longer ByteString are discarded. This is
-- equivalent to a pair of 'unpack' operations.
zip :: CONTEXT COMPACTSTRING -> COMPACTSTRING -> [(Char,Char)]
-- | 'zipWith' generalises 'zip' by zipping with the function given as
-- the first argument, instead of a tupling function. For example,
-- @'zipWith' (+)@ is applied to two ByteStrings to produce the list of
-- corresponding sums.
zipWith :: CONTEXT (Char -> Char -> b) -> COMPACTSTRING -> COMPACTSTRING -> [b]
--
-- | A specialised version of 'zipWith' for the common case of a
-- simultaneous map over two 'CompactString's, to build a 3rd. Rewrite rules
-- are used to automatically covert zipWith into zipWith' when a pack is
-- performed on the result of zipWith, but we also export it for
-- convenience.
--
zipWith'
:: CONTEXT (Char -> Char -> Char) -> COMPACTSTRING -> COMPACTSTRING -> COMPACTSTRING
-- | /O(n)/ 'unzip' transforms a list of pairs of bytes into a pair of
-- CompactStrings. Note that this performs two 'pack' operations.
unzip :: CONTEXT [(Char,Char)] -> (COMPACTSTRING,COMPACTSTRING)
-- -----------------------------------------------------------------------------
--
-- Ordered CompactStrings
--
-- | /O(n log n)/ Sort a CompactString
sort :: CONTEXT COMPACTSTRING -> COMPACTSTRING
-- -----------------------------------------------------------------------------
--
-- Encoding
--
-- | Convert a CompactString to a ByteString
toByteString :: CONTEXT COMPACTSTRING -> ByteString
-- | Convert a ByteString to a CompactString.
-- Fails if the ByteString is not a valid encoded string.
fromByteString :: (CONTEXT_ MonadPlus m) => ByteString -> m (COMPACTSTRING)
-- | Convert a ByteString to a CompactString.
-- Raises an error if the ByteString is not a valid encoded string.
fromByteString_ :: CONTEXT ByteString -> COMPACTSTRING
-- | Validates a CompactString.
-- If the string is invalid, fails, otherwise returns the input.
validate :: (CONTEXT_ MonadPlus m) => COMPACTSTRING -> m (COMPACTSTRING)
-- | Validates a CompactString.
-- If the string is invalid, throws an error, otherwise returns the input.
validate_ :: CONTEXT COMPACTSTRING -> COMPACTSTRING
-- | Encode a CompactString to a ByteString using the given encoding.
--
-- > encode e = liftM toByteString . recode
--
-- But it might be faster for some combinations of encodings.
--
-- Fails if the string is cannot be encoded in the target encoding.
encode :: (CONTEXT_ Encoding e, MonadPlus m) => e -> COMPACTSTRING -> m ByteString
-- | Encode a CompactString to a ByteString using the given encoding.
--
-- > encode_ e = toByteString . recode
--
-- But it might be faster for some combinations of encodings.
--
-- Raises an error if the string is cannot be encoded in the target encoding.
encode_ :: (CONTEXT_ Encoding e) => e -> COMPACTSTRING -> ByteString
-- | Decode a ByteString to a CompactString using the given encoding.
--
-- > decode e = recode =<< fromByteString
--
-- but it might be faster for some combinations of encodings.
--
-- Fails if the ByteString is not a valid encoded string
-- IF_NOT_REPRESENT(or if the string can not be represented in DESCRIPTION.)
decode :: (CONTEXT_ Encoding e, MonadPlus m) => e -> ByteString -> m (COMPACTSTRING)
-- | Decode a ByteString to a CompactString using the given encoding.
--
-- > decode_ e = recode_ . fromByteString_
--
-- but it might be faster for some combinations of encodings.
--
-- Raises an error if the ByteString is not a valid encoded string
-- IF_NOT_REPRESENT(or if the string can not be represented in DESCRIPTION.)
decode_ :: (CONTEXT_ Encoding e) => e -> ByteString -> COMPACTSTRING
-- | Encode a 'CompactString' using the given encoding, and add a Byte Order Mark.
-- Byte Order Marks are common on Windows, but not on other platforms.
--
-- Fails if the string is cannot be encoded in the target encoding.
encodeBOM :: (CONTEXT_ Encoding e, MonadPlus m) => e -> COMPACTSTRING -> m ByteString
-- | Encode a 'CompactString' using the given encoding, and add a Byte Order Mark.
-- Byte Order Marks are common on Windows, but not on other platforms.
--
-- Raises an error if the string is cannot be encoded in the target encoding.
encodeBOM_ :: (CONTEXT_ Encoding e) => e -> COMPACTSTRING -> ByteString
-- | Decode a 'ByteString' into a 'CompactString', by investigating the Byte Order Mark.
-- If there is no BOM assumes UTF-8.
-- Fails if the input is not a valid encoded string
-- IF_NOT_REPRESENT(or if the string can not be represented in DESCRIPTION.)
--
-- For portability, this function should be prefered over @decode UTF8@ when reading files.
decodeBOM :: (CONTEXT_ MonadPlus m) => ByteString -> m (COMPACTSTRING)
-- | Decode a 'ByteString' into a 'CompactString', by investigating the Byte Order Mark.
-- If there is no BOM assumes UTF-8.
-- Raises an error if the input is not a valid encoded string
-- IF_NOT_REPRESENT(or if the string can not be represented in DESCRIPTION.)
--
-- For portability, this function should be prefered over @decode UTF8@ when reading files.
decodeBOM_ :: CONTEXT ByteString -> COMPACTSTRING
-- -----------------------------------------------------------------------------
--
-- Standard input and output
--
-- | Read a line from stdin.
getLine :: CONTEXT IO (COMPACTSTRING)
-- | getContents. Equivalent to @hGetContents stdin@
--
-- Input is assumed to be in DESCRIPTION, this may not be appropriate.
getContents :: CONTEXT IO (COMPACTSTRING)
-- | Write a 'CompactString' to stdout.
--
-- Output is written in DESCRIPTION, this may not be appropriate.
putStr :: CONTEXT COMPACTSTRING -> IO ()
-- | Write a 'CompactString' to stdout, appending a newline character.
--
-- Output is written in DESCRIPTION, this may not be appropriate.
putStrLn :: CONTEXT COMPACTSTRING -> IO ()
-- | The interact function takes a function of type @CompactString -> CompactString@
-- 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. It's great for writing one line programs!
interact :: CONTEXT (COMPACTSTRING -> COMPACTSTRING) -> IO ()
-- -----------------------------------------------------------------------------
--
-- Files
--
-- | Read an entire file strictly into a 'CompactString'. This is far more
-- efficient than reading the characters into a 'String' and then using
-- 'pack'. Files are read using 'text mode' on Windows.
--
-- Files are assumed to be in DESCRIPTION.
readFile :: CONTEXT FilePath -> IO (COMPACTSTRING)
-- | Read an entire file strictly into a 'CompactString'. This is far more
-- efficient than reading the characters into a 'String' and then using
-- 'pack'. Files are read using 'text mode' on Windows.
--
-- The encoding of the file is determined based on a Byte Order Mark, see 'decodeBOM'.
readFile'
:: CONTEXT FilePath -> IO (COMPACTSTRING)
-- | Write a 'CompactString' to a file.
--
-- Files are written using DESCRIPTION.
writeFile :: CONTEXT FilePath -> COMPACTSTRING -> IO ()
-- | Write a 'CompactString' to a file.
--
-- Files are written using DESCRIPTION.
-- A Byte Order Mark is also written.
writeFile'
:: CONTEXT FilePath -> COMPACTSTRING -> IO ()
-- | Append a 'CompactString' to a file.
--
-- Files are written using DESCRIPTION.
appendFile :: CONTEXT FilePath -> COMPACTSTRING -> IO ()
-- | Append a 'CompactString' to a file.
--
-- The encoding of the file is determined based on a Byte Order Mark.
-- If the file is empty, it is written using DESCRIPTION with a Byte Order Mark.
-- If the encoding can not be determined the file is assumed to be UTF-8.
appendFile'
:: CONTEXT FilePath -> COMPACTSTRING -> IO ()
-- -----------------------------------------------------------------------------
--
-- I\/O with Handles
--
-- | Read a line from a handle
hGetLine :: CONTEXT Handle -> IO (COMPACTSTRING)
-- | Read entire handle contents into a 'CompactString'.
--
-- The handle is interpreted as DESCRIPTION.
hGetContents :: CONTEXT Handle -> IO (COMPACTSTRING)
-- | Read entire handle contents into a 'CompactString'.
--
-- The encoding is determined based on a Byte Order Mark, see 'decodeBOM'.
hGetContents'
:: CONTEXT Handle -> IO (COMPACTSTRING)
-- | Read a 'CompactString' directly from the specified 'Handle'.
--
-- The handle is interpreted as DESCRIPTION.
hGet :: CONTEXT Handle -> Int -> IO (COMPACTSTRING)
-- | hGetNonBlocking is identical to 'hGet', except that it will never block
-- waiting for data to become available, instead it returns only whatever data
-- is available.
--
-- The handle is interpreted as DESCRIPTION.
hGetNonBlocking :: CONTEXT Handle -> Int -> IO (COMPACTSTRING)
-- | Outputs a 'CompactString' to the specified 'Handle'.
--
-- Output is written in DESCRIPTION.
hPut :: CONTEXT Handle -> COMPACTSTRING -> IO ()
-- | A synonym for @hPut@, for compatibility
hPutStr :: CONTEXT Handle -> COMPACTSTRING -> IO ()
-- | Write a 'CompactString' to a handle, appending a newline byte
--
-- Output is written in DESCRIPTION.
hPutStrLn :: CONTEXT Handle -> COMPACTSTRING -> IO ()