module Data.Number.Functions where
import Data.Number.Types
import Data.Number.Instances
import Data.Number.Internal
import Data.Number.Peano
import Data.Ratio
precision :: Number -> Nat
precision E = Z
precision (_:|xs) = S (precision xs)
show' :: Number -> String
show' E = "0"
show' (x:|E) = show (toInteger x)
show' (x:|xs) = show (toInteger x) ++ " + 1/(" ++ show' xs ++ ")"
show' (M (x:|xs)) = '-' : show (toInteger x) ++ " - 1/(" ++ show' xs ++ ")"
fromList :: [Nat] -> Number
fromList [] = E
fromList (x:xs) = x :| fromList xs
toList :: Number -> [Nat]
toList E = []
toList (x:|xs) = x : toList xs
σ :: Number
σ = σ' 0 where
σ' n = n :| σ' (succ n)
φ :: Number
φ = 1 :| φ
π :: Number
π = toNumber (80143857 % 25510582)
e :: Number
e = fmap a σ where
a n | p == 0 = 2*q
| otherwise = 1
where (q, p) = quotRem n 3