packages feed

postgresql-types-0.1: src/library/PostgresqlTypes/Numeric/Integer.hs

-- | Utilities for Integer.
module PostgresqlTypes.Numeric.Integer where

import PostgresqlTypes.Prelude

-- | Count the number of digits in an integer (more efficiently)
countDigits :: Integer -> Int
countDigits 0 = 1
countDigits n = go (abs n) 0
  where
    go 0 acc = acc
    go x acc = go (x `div` 10) (acc + 1)

{-# INLINE extractComponents #-}
extractComponents :: Integer -> [Word16]
extractComponents =
  (reverse .) . (. abs) . unfoldr $ \case
    0 -> Nothing
    x -> case divMod x 10000 of
      (d, m) -> Just (fromIntegral m, d)