{-# 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