connections-0.3.0: src/Data/Connection/Fixed.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Data.Connection.Fixed (
Fixed (..),
showFixed,
shiftf,
-- * Uni
Uni,
-- * Deci
Deci,
f01f00,
-- * Centi
Centi,
f02f00,
f02f01,
-- * Milli
Milli,
f03f00,
f03f01,
f03f02,
-- * Micro
Micro,
f06f00,
f06f01,
f06f02,
f06f03,
-- * Nano
Nano,
f09f00,
f09f01,
f09f02,
f09f03,
f09f06,
-- * Pico
Pico,
f12f00,
f12f01,
f12f02,
f12f03,
f12f06,
f12f09,
-- * HasResolution
HasResolution (..),
) where
import safe Data.Connection.Conn
import safe Data.Fixed
import safe Data.Order.Syntax
import safe Prelude hiding (Eq (..), Ord (..))
-- | Shift by n 'units of least precision' where the ULP is determined by the precision.
--
-- This is an analog of 'Data.Connection.Float.shift32' for fixed point numbers.
shiftf :: Integer -> Fixed a -> Fixed a
shiftf j (MkFixed i) = MkFixed (i + j)
-- Deci
f01f00 :: Conn k Deci Uni
f01f00 = triple 10
-- Centi
f02f00 :: Conn k Centi Uni
f02f00 = triple 100
f02f01 :: Conn k Centi Deci
f02f01 = triple 10
-- Milli
f03f00 :: Conn k Milli Uni
f03f00 = triple 1000
f03f01 :: Conn k Milli Deci
f03f01 = triple 100
f03f02 :: Conn k Milli Centi
f03f02 = triple 10
-- Micro
f06f00 :: Conn k Micro Uni
f06f00 = triple $ 10 ^ (6 :: Integer)
f06f01 :: Conn k Micro Deci
f06f01 = triple $ 10 ^ (5 :: Integer)
f06f02 :: Conn k Micro Centi
f06f02 = triple $ 10 ^ (4 :: Integer)
f06f03 :: Conn k Micro Milli
f06f03 = triple $ 10 ^ (3 :: Integer)
-- Nano
f09f00 :: Conn k Nano Uni
f09f00 = triple $ 10 ^ (9 :: Integer)
f09f01 :: Conn k Nano Deci
f09f01 = triple $ 10 ^ (8 :: Integer)
f09f02 :: Conn k Nano Centi
f09f02 = triple $ 10 ^ (7 :: Integer)
f09f03 :: Conn k Nano Milli
f09f03 = triple $ 10 ^ (6 :: Integer)
f09f06 :: Conn k Nano Micro
f09f06 = triple $ 10 ^ (3 :: Integer)
-- Pico
f12f00 :: Conn k Pico Uni
f12f00 = triple $ 10 ^ (12 :: Integer)
f12f01 :: Conn k Pico Deci
f12f01 = triple $ 10 ^ (11 :: Integer)
f12f02 :: Conn k Pico Centi
f12f02 = triple $ 10 ^ (10 :: Integer)
f12f03 :: Conn k Pico Milli
f12f03 = triple $ 10 ^ (9 :: Integer)
f12f06 :: Conn k Pico Micro
f12f06 = triple $ 10 ^ (6 :: Integer)
f12f09 :: Conn k Pico Nano
f12f09 = triple $ 10 ^ (3 :: Integer)
-- Internal
-------------------------
triple :: Integer -> Conn k (Fixed e1) (Fixed e2)
triple prec = Conn f g h
where
f (MkFixed i) = MkFixed $ let j = i `div` prec in if i `mod` prec == 0 then j else j + 1
g (MkFixed i) = MkFixed $ i * prec
h (MkFixed i) = MkFixed $ let j = i `div` prec in if i `mod` prec == 0 then j else j -1