From 9bbe24e51ba60b8872153ceb9d3eae68b8886296 Mon Sep 17 00:00:00 2001 From: Athan Clark Date: Sat, 1 Sep 2018 09:46:32 -0600 Subject: [PATCH] more complete bindings --- src/Data/BigNumber.js | 34 ++++++++++++-- src/Data/BigNumber.purs | 99 +++++++++++++++++++++++++++++++---------- 2 files changed, 107 insertions(+), 26 deletions(-) diff --git a/src/Data/BigNumber.js b/src/Data/BigNumber.js index 546b5ce..5766e77 100644 --- a/src/Data/BigNumber.js +++ b/src/Data/BigNumber.js @@ -28,7 +28,7 @@ exports.randomBigNumber = function randomBigNumber () { }; -exports.absBigNumber = function absBigNumber (x) { +exports.absImpl = function absImpl (x) { return x.abs(); }; @@ -45,6 +45,10 @@ exports.compareBigNumberImpl = function compareBigNumberImpl (LT,EQ,GT,x,y) { }; +exports.decimalPlacesImpl = function decimalPlacesImpl (x,y) { + return x.decimalPlaces(y); +}; + exports.divBigNumberImpl = function divBigNumberImpl (x,y) { return x.div(y); }; @@ -117,7 +121,7 @@ exports.timesBigNumberImpl = function timesBigNumberImpl (x,y) { return x.times(y); }; -exports.negateBigNumber = function negateBigNumber (x) { +exports.negateImpl = function negateImpl (x) { return x.negated(); }; @@ -125,10 +129,14 @@ exports.plusBigNumberImpl = function plusBigNumberImpl (x,y) { return x.plus(y); }; -exports.precisionBigNumberImpl = function precisionBigNumberImpl (x,y) { +exports.precisionImpl = function precisionImpl (x,y) { return x.precision(y); }; +exports.shiftedByImpl = function shiftedByImpl (x,y) { + return x.shiftedBy(y); +}; + exports.toNumber = function toNumber (x) { return x.toNumber(); }; @@ -137,6 +145,26 @@ exports.toString = function toString (x) { return x.toString(); }; +exports.toExponential = function toExponential (x) { + return x.toExponential(); +}; + +exports.toFixed = function toFixed (x) { + return x.toFixed(); +}; + +exports.toFormat = function toFormat (x) { + return x.toFormat(); +}; + +exports.toFractionImpl = function toFractionImpl (x) { + return x.toFraction(); +}; + +exports.valueOf = function valueOf (x) { + return x.valueOf(); +}; + exports.sqrt = function sqrt (x) { return x.sqrt(); }; diff --git a/src/Data/BigNumber.purs b/src/Data/BigNumber.purs index a956cc9..01d9748 100644 --- a/src/Data/BigNumber.purs +++ b/src/Data/BigNumber.purs @@ -5,15 +5,20 @@ module Data.BigNumber , roundHalfUp, roundHalfDown, roundHalfEven, roundHalfCeil, roundHalfFloor , ModuloMode, modRoundUp, modRoundDown, modRoundFloor, modRoundHalfEven , modEuclid - , isBigNumber, randomBigNumber + , isBigNumber, isInteger, isFinite, isNaN, isNegative, isPositive, isZero + , toNumber, toString, toExponential, toFixed, toFormat, toFraction, valueOf + , abs', negate', idiv, sqrt, pow + , intValue, precision, decimalPlaces, shiftedBy, randomBigNumber ) where import Prelude import Data.Int as Int import Data.Either (Either (..)) +import Data.Tuple (Tuple (..)) import Data.Function.Uncurried (Fn3, runFn3, Fn2, runFn2, Fn5, runFn5) import Data.Record.Class (class Subrow) -import Data.Tuple.Native (T2) +import Data.Tuple.Native (T2, prj) +import Data.Typelevel.Num.Reps (d0, d1) -- import Data.Semiring (class Semiring) import Control.Monad.Eff (Eff, kind Effect) import Control.Monad.Eff.Exception (Error) @@ -69,6 +74,16 @@ modEuclid :: ModuloMode modEuclid = ModuloMode 9 +type FormatParams = + ( decimalSeparator :: String + , groupSeparator :: String + , groupSize :: Int + , secondaryGroupSize :: Int + , fractionGroupSeparator :: String + , fractionGroupSize :: Int + ) + + type ConfigParams format = ( "DECIMAL_PLACES" :: Int , "ROUNDING_MODE" :: RoundingMode @@ -82,39 +97,77 @@ type ConfigParams format = ) config :: forall o format eff - . Subrow o (ConfigParams format) + . Subrow o (ConfigParams { | format }) + => Subrow format FormatParams => { | o } -> Eff (bigNumber :: BIGNUMBER | eff) Unit config = runEffFn1 configImpl foreign import isBigNumber :: forall a. a -> Boolean -foreign import randomBigNumber :: forall eff. Eff (bigNumber :: BIGNUMBER | eff) BigNumber -foreign import compareBigNumberImpl :: Fn5 Ordering Ordering Ordering BigNumber BigNumber Ordering -foreign import absBigNumber :: BigNumber -> BigNumber -foreign import divBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber -foreign import idivBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber -foreign import powBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber -foreign import intValue :: BigNumber -> BigNumber -foreign import eqBigNumberImpl :: Fn2 BigNumber BigNumber Boolean -foreign import isFinite :: BigNumber -> Boolean -foreign import gtBigNumberImpl :: Fn2 BigNumber BigNumber Boolean -foreign import gteBigNumberImpl :: Fn2 BigNumber BigNumber Boolean foreign import isInteger :: BigNumber -> Boolean -foreign import ltBigNumberImpl :: Fn2 BigNumber BigNumber Boolean -foreign import lteBigNumberImpl :: Fn2 BigNumber BigNumber Boolean +foreign import isFinite :: BigNumber -> Boolean foreign import isNaN :: BigNumber -> Boolean foreign import isNegative :: BigNumber -> Boolean foreign import isPositive :: BigNumber -> Boolean foreign import isZero :: BigNumber -> Boolean -foreign import plusBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber -foreign import minusBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber -foreign import moduloBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber -foreign import timesBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber -foreign import negateBigNumber :: BigNumber -> BigNumber -foreign import precisionBigNumberImpl :: Fn2 BigNumber Int BigNumber + foreign import toNumber :: BigNumber -> Number foreign import toString :: BigNumber -> String +foreign import toExponential :: BigNumber -> String +foreign import toFixed :: BigNumber -> String +foreign import toFormat :: BigNumber -> String +foreign import toFractionImpl :: Fn2 BigNumber BigNumber (T2 String String) +foreign import valueOf :: BigNumber -> String + +toFraction :: BigNumber -> BigNumber -> Tuple String String +toFraction a b = + let x = runFn2 toFractionImpl a b + in Tuple (prj d0 x) (prj d1 x) + +foreign import eqBigNumberImpl :: Fn2 BigNumber BigNumber Boolean +foreign import gtBigNumberImpl :: Fn2 BigNumber BigNumber Boolean +foreign import gteBigNumberImpl :: Fn2 BigNumber BigNumber Boolean +foreign import ltBigNumberImpl :: Fn2 BigNumber BigNumber Boolean +foreign import lteBigNumberImpl :: Fn2 BigNumber BigNumber Boolean +foreign import compareBigNumberImpl :: Fn5 Ordering Ordering Ordering BigNumber BigNumber Ordering + +foreign import absImpl :: BigNumber -> BigNumber +foreign import plusBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber +foreign import minusBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber +foreign import negateImpl :: BigNumber -> BigNumber +foreign import timesBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber +foreign import divBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber +foreign import idivBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber +foreign import moduloBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber foreign import sqrt :: BigNumber -> BigNumber +foreign import powBigNumberImpl :: Fn2 BigNumber BigNumber BigNumber + +abs' :: BigNumber -> BigNumber +abs' = absImpl + +negate' :: BigNumber -> BigNumber +negate' = negateImpl + +idiv :: BigNumber -> BigNumber -> BigNumber +idiv = runFn2 idivBigNumberImpl + +pow :: BigNumber -> BigNumber -> BigNumber +pow = runFn2 powBigNumberImpl + +foreign import intValue :: BigNumber -> BigNumber +foreign import precisionImpl :: Fn2 BigNumber Int BigNumber +foreign import decimalPlacesImpl :: Fn2 BigNumber Int BigNumber +foreign import randomBigNumber :: forall eff. Eff (bigNumber :: BIGNUMBER | eff) BigNumber +foreign import shiftedByImpl :: Fn2 BigNumber Int BigNumber + +precision :: BigNumber -> Int -> BigNumber +precision = runFn2 precisionImpl + +decimalPlaces :: BigNumber -> Int -> BigNumber +decimalPlaces = runFn2 decimalPlacesImpl + +shiftedBy :: BigNumber -> Int -> BigNumber +shiftedBy = runFn2 shiftedByImpl instance eqBigNumber :: Eq BigNumber where @@ -143,7 +196,7 @@ instance divisionRingBigNumber :: DivisionRing BigNumber where recip = runFn2 divBigNumberImpl one instance euclideanRingBigNumber :: EuclideanRing BigNumber where - degree = Int.floor <<< toNumber <<< intValue <<< absBigNumber + degree = Int.floor <<< toNumber <<< intValue <<< abs' div = runFn2 divBigNumberImpl mod = runFn2 moduloBigNumberImpl