-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | Conversion from strings to Integer
--   
--   The naive foldl' (acc d -> acc * 10 + d) 0 is expensive
--   (quadratic!) for large Integers. This package provides
--   sub-quadratic implementation.
@package integer-conversion
@version 0.1.1

-- | The naive left fold to convert digits to integer is quadratic as
--   multiplying (big) Integers is not a constant time operation.
--   
--   This module provides sub-quadratic algorithm for conversion of
--   Text or ByteString into Integer.
--   
--   For example for a text of 262144 9 digits, fold implementation takes
--   1.5 seconds, and textToInteger just 26 milliseconds on my
--   machine. Difference is already noticeable around 100-200 digits.
--   
--   In particular read is correct (i.e. faster) than
--   List.foldl' (better complexity), stringToInteger is a
--   bit faster than read (same complexity, lower coeffcient).
module Data.Integer.Conversion

-- | Convert Text to Integer.
--   
--   Semantically same as T.foldl' (acc c -> acc * 10 + toInteger
--   (ord c - 48)) 0, but this is more efficient.
--   
--   
--   >>> textToInteger "123456789"
--   123456789
--   
--   
--   For non-decimal inputs some nonsense is calculated
--   
--   
--   >>> textToInteger "foobar"
--   6098556
--   
textToInteger :: Text -> Integer

-- | Convert ByteString to Integer.
--   
--   Semantically same as BS.foldl' (acc c -> acc * 10 + toInteger c
--   - 48) 0, but this is more efficient.
--   
--   
--   >>> byteStringToInteger "123456789"
--   123456789
--   
--   
--   For non-decimal inputs some nonsense is calculated
--   
--   
--   >>> byteStringToInteger "foobar"
--   6098556
--   
byteStringToInteger :: ByteString -> Integer

-- | Convert String to Integer.
--   
--   Semantically same as List.foldl' (acc c -> acc * 10 + toInteger
--   c - 48) 0, but this is more efficient.
--   
--   
--   >>> stringToInteger "123456789"
--   123456789
--   
--   
--   For non-decimal inputs some nonsense is calculated
--   
--   
--   >>> stringToInteger "foobar"
--   6098556
--   
stringToInteger :: String -> Integer

-- | Convert String to Integer when you know the length
--   beforehand.
--   
--   
--   >>> stringToIntegerWithLen "123" 3
--   123
--   
--   
--   If the length is wrong, you may get wrong results. (Simple algorithm
--   is used for short strings).
--   
--   
--   >>> stringToIntegerWithLen (replicate 40 '0' ++ "123") 45
--   12300
--   
--   
--   
--   >>> stringToIntegerWithLen (replicate 40 '0' ++ "123") 44
--   1200
--   
--   
--   
--   >>> stringToIntegerWithLen (replicate 40 '0' ++ "123") 42
--   12
--   
stringToIntegerWithLen :: String -> Int -> Integer
