Open
Description
I wonder if there is a fast ByteString Builder for numbers from Data.Fixed?
I've written one myself, but don't think it's quite as fast as it could be:
-- | Encode a 'Fixed' resolution number using ASCII digits.
fixedDec :: HasResolution a => Fixed a -> BB.Builder
fixedDec fa@(MkFixed a) | a < 0 = P.primFixed P.char8 '-' <> fixedDec (asTypeOf (MkFixed (negate a)) fa)
fixedDec fa@(MkFixed a) = integerDec i <> P.primFixed P.char8 '.' <> stimesMonoid zeros (P.primFixed P.char8 '0') <> integerDec d
where
(i, d) = a `quotRem` resolution fa
zeros :: Integer = if d == 0 then 0 else ceiling (logBase 10 (fromIntegral (resolution fa) / fromIntegral d / 10) :: Double)
Calculating logBase 10
gets expensive, so it doesn't seem to perform well with lots of Fixed numbers.
Ideally if there was an efficient builder of fixed, it could be included in bytestring. Anyone have ideas of how to make it more efficient?
Metadata
Assignees
Labels
No labels