module Data.Thyme.Format.Internal where
import Prelude
import Control.Applicative
import Data.Attoparsec.ByteString.Char8 (Parser)
import qualified Data.Attoparsec.ByteString.Char8 as P
import qualified Data.ByteString.Char8 as S
import Data.Char
import Data.Int
import Data.Micro
shows02 :: Int -> String -> String
shows02 n = if n < 10 then (:) '0' . shows n else shows n
shows_2 :: Int -> String -> String
shows_2 n = if n < 10 then (:) ' ' . shows n else shows n
shows03 :: Int -> ShowS
shows03 n
| n < 10 = (++) "00" . shows n
| n < 100 = (++) "0" . shows n
| otherwise = shows n
shows04 :: Int -> String -> String
shows04 n
| n < 10 = (++) "000" . shows n
| n < 100 = (++) "00" . shows n
| n < 1000 = (++) "0" . shows n
| otherwise = shows n
negative :: Parser Int64 -> Parser Int64
negative p = ($) <$> (negate <$ P.char '-' <|> pure id) <*> p
dec0 :: Int -> Parser Int
dec0 n = either fail return . P.parseOnly P.decimal =<< P.take n
dec_ :: Int -> Parser Int
dec_ n = either fail return . P.parseOnly P.decimal
=<< S.dropWhile isSpace <$> P.take n
micro :: Parser Micro
micro = do
us10 <- either fail return . P.parseOnly P.decimal . S.take 7
. (`S.append` S.pack "000000") =<< P.takeWhile1 isDigit
return $ Micro (div (us10 + 5) 10)