packages feed

MicroHs-0.15.0.0: lib/Data/ByteString/Builder/RealFloat.hs

module Data.ByteString.Builder.RealFloat where

import qualified Prelude ()
import MiniPrelude

import Data.ByteString.Builder.Internal
import Data.Double
import Data.Float
import Numeric.FormatFloat

floatDec :: Float -> Builder
floatDec = formatFloat generic

doubleDec :: Double -> Builder
doubleDec = formatDouble generic

formatFloat :: FloatFormat -> Float -> Builder
formatFloat (MkFloatFormat fmt prec) f =
  stringUtf8 $ case fmt of
    FScientific -> showEFloat prec f ""
    FStandard -> showFFloat prec f ""
    FGeneric -> showGFloat prec f ""

formatDouble :: FloatFormat -> Double -> Builder
formatDouble (MkFloatFormat fmt prec) d =
  stringUtf8 $ case fmt of
    FScientific -> showEFloat prec d ""
    FStandard -> showFFloat prec d ""
    FGeneric -> showGFloat prec d ""

data FloatFormat = MkFloatFormat FormatMode (Maybe Int)

standard :: Int -> FloatFormat
standard n = MkFloatFormat FStandard (Just n)

standardDefaultPrecision :: FloatFormat
standardDefaultPrecision = MkFloatFormat FStandard Nothing

scientific :: FloatFormat
scientific = MkFloatFormat FScientific Nothing

generic :: FloatFormat
generic = MkFloatFormat FGeneric Nothing

data FormatMode
  = FScientific     -- ^ scientific notation
  | FStandard       -- ^ standard notation with `Maybe Int` digits after the decimal
  | FGeneric        -- ^ dispatches to scientific or standard notation based on the exponent
  deriving Show