{-# LANGUAGE BlockArguments, ScopedTypeVariables, TypeApplications #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE AllowAmbiguousTypes #-} {-# OPTIONS_GHC -Wall -fno-warn-tabs #-} module Data.Fixed.Generic (F(..), showF, changeUnit) where import GHC.Internal.Read import GHC.Internal.Text.ParserCombinators.ReadPrec import GHC.Internal.Text.Read.Lex import Data.Data import Data.Fixed newtype F (a :: k) n = MkF n deriving (F a n -> F a n -> Bool (F a n -> F a n -> Bool) -> (F a n -> F a n -> Bool) -> Eq (F a n) forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a forall k (a :: k) n. Eq n => F a n -> F a n -> Bool $c== :: forall k (a :: k) n. Eq n => F a n -> F a n -> Bool == :: F a n -> F a n -> Bool $c/= :: forall k (a :: k) n. Eq n => F a n -> F a n -> Bool /= :: F a n -> F a n -> Bool Eq, Eq (F a n) Eq (F a n) => (F a n -> F a n -> Ordering) -> (F a n -> F a n -> Bool) -> (F a n -> F a n -> Bool) -> (F a n -> F a n -> Bool) -> (F a n -> F a n -> Bool) -> (F a n -> F a n -> F a n) -> (F a n -> F a n -> F a n) -> Ord (F a n) F a n -> F a n -> Bool F a n -> F a n -> Ordering F a n -> F a n -> F a n forall a. Eq a => (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a forall k (a :: k) n. Ord n => Eq (F a n) forall k (a :: k) n. Ord n => F a n -> F a n -> Bool forall k (a :: k) n. Ord n => F a n -> F a n -> Ordering forall k (a :: k) n. Ord n => F a n -> F a n -> F a n $ccompare :: forall k (a :: k) n. Ord n => F a n -> F a n -> Ordering compare :: F a n -> F a n -> Ordering $c< :: forall k (a :: k) n. Ord n => F a n -> F a n -> Bool < :: F a n -> F a n -> Bool $c<= :: forall k (a :: k) n. Ord n => F a n -> F a n -> Bool <= :: F a n -> F a n -> Bool $c> :: forall k (a :: k) n. Ord n => F a n -> F a n -> Bool > :: F a n -> F a n -> Bool $c>= :: forall k (a :: k) n. Ord n => F a n -> F a n -> Bool >= :: F a n -> F a n -> Bool $cmax :: forall k (a :: k) n. Ord n => F a n -> F a n -> F a n max :: F a n -> F a n -> F a n $cmin :: forall k (a :: k) n. Ord n => F a n -> F a n -> F a n min :: F a n -> F a n -> F a n Ord, F a n F a n -> F a n -> Bounded (F a n) forall a. a -> a -> Bounded a forall k (a :: k) n. Bounded n => F a n $cminBound :: forall k (a :: k) n. Bounded n => F a n minBound :: F a n $cmaxBound :: forall k (a :: k) n. Bounded n => F a n maxBound :: F a n Bounded) tyF :: DataType tyF :: DataType tyF = String -> [Constr] -> DataType mkDataType String "Data.Fixed.Generic.F" [Constr conMkF] conMkF :: Constr conMkF :: Constr conMkF = DataType -> String -> [String] -> Fixity -> Constr mkConstr DataType tyF String "MkF" [] Fixity Prefix instance (Typeable k, Typeable a, Data n) => Data (F (a :: k) n) where gfoldl :: forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> F a n -> c (F a n) gfoldl forall d b. Data d => c (d -> b) -> d -> c b k forall g. g -> c g z (MkF n a) = c (n -> F a n) -> n -> c (F a n) forall d b. Data d => c (d -> b) -> d -> c b k ((n -> F a n) -> c (n -> F a n) forall g. g -> c g z n -> F a n forall k (a :: k) n. n -> F a n MkF) n a gunfold :: forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (F a n) gunfold forall b r. Data b => c (b -> r) -> c r k forall r. r -> c r z Constr _ = c (n -> F a n) -> c (F a n) forall b r. Data b => c (b -> r) -> c r k ((n -> F a n) -> c (n -> F a n) forall r. r -> c r z n -> F a n forall k (a :: k) n. n -> F a n MkF) dataTypeOf :: F a n -> DataType dataTypeOf F a n _ = DataType tyF toConstr :: F a n -> Constr toConstr F a n _ = Constr conMkF withResolution :: forall k (a :: k) f . HasResolution a => (Integer -> f) -> f withResolution :: forall k (a :: k) f. HasResolution a => (Integer -> f) -> f withResolution Integer -> f foo = Integer -> f foo (Integer -> f) -> (Proxy a -> Integer) -> Proxy a -> f forall b c a. (b -> c) -> (a -> b) -> a -> c . Proxy a -> Integer forall k (a :: k) (p :: k -> *). HasResolution a => p a -> Integer forall (p :: k -> *). p a -> Integer resolution (Proxy a -> f) -> Proxy a -> f forall a b. (a -> b) -> a -> b $ forall (t :: k). Proxy t forall {k} (t :: k). Proxy t Proxy @a resl :: forall a n . (HasResolution a, Num n) => n resl :: forall {k} (a :: k) n. (HasResolution a, Num n) => n resl = Integer -> n forall a. Num a => Integer -> a fromInteger (Integer -> n) -> Integer -> n forall a b. (a -> b) -> a -> b $ Proxy a -> Integer forall k (a :: k) (p :: k -> *). HasResolution a => p a -> Integer forall (p :: k -> *). p a -> Integer resolution (forall (t :: k). Proxy t forall {k} (t :: k). Proxy t Proxy @a) withResl :: forall k (a :: k) n f . (Num n, HasResolution a) => (n -> f) -> f withResl :: forall k (a :: k) n f. (Num n, HasResolution a) => (n -> f) -> f withResl n -> f foo = n -> f foo (n -> f) -> n -> f forall a b. (a -> b) -> a -> b $ forall (a :: k) n. (HasResolution a, Num n) => n forall {k} (a :: k) n. (HasResolution a, Num n) => n resl @a instance Enum n => Enum (F a n) where succ :: F a n -> F a n succ (MkF n a) = n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> n forall a. Enum a => a -> a succ n a) pred :: F a n -> F a n pred (MkF n a) = n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> n forall a. Enum a => a -> a succ n a) toEnum :: Int -> F a n toEnum = n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> F a n) -> (Int -> n) -> Int -> F a n forall b c a. (b -> c) -> (a -> b) -> a -> c . Int -> n forall a. Enum a => Int -> a toEnum fromEnum :: F a n -> Int fromEnum (MkF n a) = n -> Int forall a. Enum a => a -> Int fromEnum n a enumFrom :: F a n -> [F a n] enumFrom (MkF n a) = (n -> F a n) -> [n] -> [F a n] forall a b. (a -> b) -> [a] -> [b] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap n -> F a n forall k (a :: k) n. n -> F a n MkF ([n] -> [F a n]) -> [n] -> [F a n] forall a b. (a -> b) -> a -> b $ n -> [n] forall a. Enum a => a -> [a] enumFrom n a enumFromThen :: F a n -> F a n -> [F a n] enumFromThen (MkF n a) (MkF n b) = (n -> F a n) -> [n] -> [F a n] forall a b. (a -> b) -> [a] -> [b] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> n -> [n] forall a. Enum a => a -> a -> [a] enumFromThen n a n b) enumFromTo :: F a n -> F a n -> [F a n] enumFromTo (MkF n a) (MkF n b) = (n -> F a n) -> [n] -> [F a n] forall a b. (a -> b) -> [a] -> [b] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> n -> [n] forall a. Enum a => a -> a -> [a] enumFromTo n a n b) enumFromThenTo :: F a n -> F a n -> F a n -> [F a n] enumFromThenTo (MkF n a) (MkF n b) (MkF n c) = (n -> F a n) -> [n] -> [F a n] forall a b. (a -> b) -> [a] -> [b] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> n -> n -> [n] forall a. Enum a => a -> a -> a -> [a] enumFromThenTo n a n b n c) instance (HasResolution a, Integral n) => Num (F a n) where MkF n a + :: F a n -> F a n -> F a n + MkF n b = n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> F a n) -> n -> F a n forall a b. (a -> b) -> a -> b $ n a n -> n -> n forall a. Num a => a -> a -> a + n b MkF n a - :: F a n -> F a n -> F a n - MkF n b = n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> F a n) -> n -> F a n forall a b. (a -> b) -> a -> b $ n a n -> n -> n forall a. Num a => a -> a -> a - n b MkF n a * :: F a n -> F a n -> F a n * MkF n b = n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> F a n) -> n -> F a n forall a b. (a -> b) -> a -> b $ (n a n -> n -> n forall a. Num a => a -> a -> a * n b) n -> n -> n forall a. Integral a => a -> a -> a `div` forall (a :: k) n. (HasResolution a, Num n) => n forall {k} (a :: k) n. (HasResolution a, Num n) => n resl @a negate :: F a n -> F a n negate (MkF n a) = n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> F a n) -> n -> F a n forall a b. (a -> b) -> a -> b $ n -> n forall a. Num a => a -> a negate n a abs :: F a n -> F a n abs (MkF n a) = n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> F a n) -> n -> F a n forall a b. (a -> b) -> a -> b $ n -> n forall a. Num a => a -> a abs n a signum :: F a n -> F a n signum (MkF n a) = n -> F a n forall a b. (Integral a, Num b) => a -> b fromIntegral (n -> F a n) -> n -> F a n forall a b. (a -> b) -> a -> b $ n -> n forall a. Num a => a -> a signum n a fromInteger :: Integer -> F a n fromInteger Integer i = forall k (a :: k) n f. (Num n, HasResolution a) => (n -> f) -> f withResl @_ @a \n res -> n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> F a n) -> n -> F a n forall a b. (a -> b) -> a -> b $ Integer -> n forall a. Num a => Integer -> a fromInteger Integer i n -> n -> n forall a. Num a => a -> a -> a * n res instance (HasResolution a, Integral n) => Real (F a n) where toRational :: F a n -> Rational toRational (MkF n a) = n -> Rational forall a. Real a => a -> Rational toRational n a Rational -> Rational -> Rational forall a. Fractional a => a -> a -> a / Integer -> Rational forall a. Real a => a -> Rational toRational (Proxy a -> Integer forall k (a :: k) (p :: k -> *). HasResolution a => p a -> Integer forall (p :: k -> *). p a -> Integer resolution (forall (t :: k). Proxy t forall {k} (t :: k). Proxy t Proxy @a)) instance (HasResolution a, Integral n) => Fractional (F a n) where MkF n a / :: F a n -> F a n -> F a n / MkF n b = n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> F a n) -> n -> F a n forall a b. (a -> b) -> a -> b $ (n a n -> n -> n forall a. Num a => a -> a -> a * forall (a :: k) n. (HasResolution a, Num n) => n forall {k} (a :: k) n. (HasResolution a, Num n) => n resl @a) n -> n -> n forall a. Integral a => a -> a -> a `div` n b recip :: F a n -> F a n recip (MkF n a) = n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> F a n) -> n -> F a n forall a b. (a -> b) -> a -> b $ (n res n -> n -> n forall a. Num a => a -> a -> a * n res) n -> n -> n forall a. Integral a => a -> a -> a `div` n a where res :: n res = forall (a :: k) n. (HasResolution a, Num n) => n forall {k} (a :: k) n. (HasResolution a, Num n) => n resl @a fromRational :: Rational -> F a n fromRational Rational r = forall k (a :: k) f. HasResolution a => (Integer -> f) -> f withResolution @_ @a \Integer res -> n -> F a n forall k (a :: k) n. n -> F a n MkF (Rational -> n forall b. Integral b => Rational -> b forall a b. (RealFrac a, Integral b) => a -> b floor (Rational r Rational -> Rational -> Rational forall a. Num a => a -> a -> a * (Integer -> Rational forall a. Real a => a -> Rational toRational Integer res))) instance (HasResolution a, Integral n) => RealFrac (F a n) where properFraction :: forall b. Integral b => F a n -> (b, F a n) properFraction F a n a = (b i, F a n a F a n -> F a n -> F a n forall a. Num a => a -> a -> a - b -> F a n forall a b. (Integral a, Num b) => a -> b fromIntegral b i) where i :: b i = F a n -> b forall b. Integral b => F a n -> b forall a b. (RealFrac a, Integral b) => a -> b truncate F a n a truncate :: forall b. Integral b => F a n -> b truncate F a n f = Rational -> b forall b. Integral b => Rational -> b forall a b. (RealFrac a, Integral b) => a -> b truncate (F a n -> Rational forall a. Real a => a -> Rational toRational F a n f) round :: forall b. Integral b => F a n -> b round F a n f = Rational -> b forall b. Integral b => Rational -> b forall a b. (RealFrac a, Integral b) => a -> b round (F a n -> Rational forall a. Real a => a -> Rational toRational F a n f) ceiling :: forall b. Integral b => F a n -> b ceiling F a n f = Rational -> b forall b. Integral b => Rational -> b forall a b. (RealFrac a, Integral b) => a -> b ceiling (F a n -> Rational forall a. Real a => a -> Rational toRational F a n f) floor :: forall b. Integral b => F a n -> b floor F a n f = Rational -> b forall b. Integral b => Rational -> b forall a b. (RealFrac a, Integral b) => a -> b floor (F a n -> Rational forall a. Real a => a -> Rational toRational F a n f) chopZeros :: (Show n, Integral n) => n -> String chopZeros :: forall n. (Show n, Integral n) => n -> String chopZeros n 0 = String "" chopZeros n a | n a n -> n -> n forall a. Integral a => a -> a -> a `mod` n 10 n -> n -> Bool forall a. Eq a => a -> a -> Bool == n 0 = n -> String forall n. (Show n, Integral n) => n -> String chopZeros (n a n -> n -> n forall a. Integral a => a -> a -> a `div` n 10) chopZeros n a = n -> String forall a. Show a => a -> String show n a showIntegerZeros :: (Show n, Integral n) => Bool -> Int -> n -> String showIntegerZeros :: forall n. (Show n, Integral n) => Bool -> Int -> n -> String showIntegerZeros Bool True Int _ n 0 = String "" showIntegerZeros Bool chopTrailingZeros Int digits n a = Int -> Char -> String forall a. Int -> a -> [a] replicate (Int digits Int -> Int -> Int forall a. Num a => a -> a -> a - String -> Int forall a. [a] -> Int forall (t :: * -> *) a. Foldable t => t a -> Int length String s) Char '0' String -> String -> String forall a. [a] -> [a] -> [a] ++ String s' where s :: String s = n -> String forall a. Show a => a -> String show n a s' :: String s' = if Bool chopTrailingZeros then n -> String forall n. (Show n, Integral n) => n -> String chopZeros n a else String s withDot :: String -> String withDot :: String -> String withDot String "" = String "" withDot String s = Char '.' Char -> String -> String forall a. a -> [a] -> [a] : String s showF :: forall a n . (HasResolution a, Show n, Integral n) => Bool -> F a n -> String showF :: forall {k} (a :: k) n. (HasResolution a, Show n, Integral n) => Bool -> F a n -> String showF Bool chopTrailingZeros (MkF n a) | n a n -> n -> Bool forall a. Ord a => a -> a -> Bool < n 0 = String "-" String -> String -> String forall a. [a] -> [a] -> [a] ++ Bool -> F a n -> String forall {k} (a :: k) n. (HasResolution a, Show n, Integral n) => Bool -> F a n -> String showF Bool chopTrailingZeros (n -> F a n forall k (a :: k) n. n -> F a n MkF (n -> n forall a. Num a => a -> a negate n a) :: F a n) showF Bool chopTrailingZeros (MkF n a) = n -> String forall a. Show a => a -> String show n i String -> String -> String forall a. [a] -> [a] -> [a] ++ String -> String withDot (Bool -> Int -> n -> String forall n. (Show n, Integral n) => Bool -> Int -> n -> String showIntegerZeros Bool chopTrailingZeros Int digits n fracNum) where res :: n res = forall (a :: k) n. (HasResolution a, Num n) => n forall {k} (a :: k) n. (HasResolution a, Num n) => n resl @a (n i, n d) = n a n -> n -> (n, n) forall a. Integral a => a -> a -> (a, a) `divMod` n res digits :: Int digits = Double -> Int forall b. Integral b => Double -> b forall a b. (RealFrac a, Integral b) => a -> b ceiling (Double -> Double -> Double forall a. Floating a => a -> a -> a logBase Double 10 (n -> Double forall a b. (Integral a, Num b) => a -> b fromIntegral n res) :: Double) maxnum :: n maxnum = n 10 n -> Int -> n forall a b. (Num a, Integral b) => a -> b -> a ^ Int digits fracNum :: n fracNum = n -> n -> n forall a. Integral a => a -> a -> a divCeil (n d n -> n -> n forall a. Num a => a -> a -> a * n maxnum) n res divCeil :: a -> a -> a divCeil a x a y = (a x a -> a -> a forall a. Num a => a -> a -> a + a y a -> a -> a forall a. Num a => a -> a -> a - a 1) a -> a -> a forall a. Integral a => a -> a -> a `div` a y instance (HasResolution a, Show n, Integral n) => Show (F a n) where showsPrec :: Int -> F a n -> String -> String showsPrec Int p F a n n = Bool -> (String -> String) -> String -> String showParen (Int p Int -> Int -> Bool forall a. Ord a => a -> a -> Bool > Int 6 Bool -> Bool -> Bool && F a n n F a n -> F a n -> Bool forall a. Ord a => a -> a -> Bool < F a n 0) ((String -> String) -> String -> String) -> (String -> String) -> String -> String forall a b. (a -> b) -> a -> b $ String -> String -> String showString (String -> String -> String) -> String -> String -> String forall a b. (a -> b) -> a -> b $ Bool -> F a n -> String forall {k} (a :: k) n. (HasResolution a, Show n, Integral n) => Bool -> F a n -> String showF Bool False F a n n convertF :: forall a n . (HasResolution a, Integral n) => Lexeme -> ReadPrec (F a n) convertF :: forall {k} (a :: k) n. (HasResolution a, Integral n) => Lexeme -> ReadPrec (F a n) convertF (Number Number n) | Just (Integer i, Integer f) <- Integer -> Number -> Maybe (Integer, Integer) numberToFixed Integer e Number n = F a n -> ReadPrec (F a n) forall a. a -> ReadPrec a forall (f :: * -> *) a. Applicative f => a -> f a pure (Integer -> F a n forall a. Num a => Integer -> a fromInteger Integer i F a n -> F a n -> F a n forall a. Num a => a -> a -> a + (Integer -> F a n forall a. Num a => Integer -> a fromInteger Integer f F a n -> F a n -> F a n forall a. Fractional a => a -> a -> a / (F a n 10 F a n -> Integer -> F a n forall a b. (Num a, Integral b) => a -> b -> a ^ Integer e))) where r :: Integer r = forall (a :: k) n. (HasResolution a, Num n) => n forall {k} (a :: k) n. (HasResolution a, Num n) => n resl @a e :: Integer e = Double -> Integer forall b. Integral b => Double -> b forall a b. (RealFrac a, Integral b) => a -> b ceiling (Double -> Double -> Double forall a. Floating a => a -> a -> a logBase Double 10 (Integer -> Double forall a. Num a => Integer -> a fromInteger Integer r) :: Double) convertF Lexeme _ = ReadPrec (F a n) forall a. ReadPrec a pfail instance (HasResolution a, Integral n) => Read (F a n) where readPrec :: ReadPrec (F a n) readPrec = (Lexeme -> ReadPrec (F a n)) -> ReadPrec (F a n) forall a. Num a => (Lexeme -> ReadPrec a) -> ReadPrec a readNumber Lexeme -> ReadPrec (F a n) forall {k} (a :: k) n. (HasResolution a, Integral n) => Lexeme -> ReadPrec (F a n) convertF readListPrec :: ReadPrec [F a n] readListPrec = ReadPrec [F a n] forall a. Read a => ReadPrec [a] readListPrecDefault readList :: ReadS [F a n] readList = ReadS [F a n] forall a. Read a => ReadS [a] readListDefault changeUnit :: F a n -> F a' n changeUnit :: forall {k} {k} (a :: k) n (a' :: k). F a n -> F a' n changeUnit (MkF n a) = n -> F a' n forall k (a :: k) n. n -> F a n MkF n a