module PostgreSQLBinary.Numeric where
import PostgreSQLBinary.Prelude
posSignCode = 0x0000 :: Int16
negSignCode = 0x4000 :: Int16
nanSignCode = 0xC000 :: Int16
extractComponents :: Integral a => a -> [Int16]
extractComponents =
(reverse .) . (. abs) . unfoldr $ \case
0 -> Nothing
x -> case divMod x 10000 of
(d, m) -> Just (fromIntegral m, d)
mergeComponents :: Integral a => [a] -> a
mergeComponents =
foldl' (\l r -> l * 10000 + r) 0
mergeDigits :: Integral a => [a] -> a
mergeDigits =
foldl' (\l r -> l * 10 + r) 0
componentDigits :: Int16 -> [Int16]
componentDigits =
evalState $ do
a <- state (`divMod` 1000)
b <- state (`divMod` 100)
c <- state (`divMod` 10)
d <- get
return $ [a, b, c, d]