Skip to content

Commit 51bbe1e

Browse files
Port Number-related code from deprecated purescript-globals into this repo (#12)
1 parent f144f6e commit 51bbe1e

File tree

4 files changed

+80
-35
lines changed

4 files changed

+80
-35
lines changed

bower.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
"name": "purescript-numbers",
33
"description": "Functions for working with Numbers",
44
"license": "MIT",
5-
"homepage": "https://github.com/sharkdp/purescript-numbers",
5+
"homepage": "https://github.com/purescript/purescript-numbers",
66
"authors": [
77
"David Peter <[email protected]>"
88
],
99
"repository": {
1010
"type": "git",
11-
"url": "git://github.com/sharkdp/purescript-numbers.git"
11+
"url": "git://github.com/purescript/purescript-numbers.git"
1212
},
1313
"ignore": [
1414
"**/.*",
@@ -17,8 +17,8 @@
1717
],
1818
"dependencies": {
1919
"purescript-math": "master",
20-
"purescript-globals": "master",
21-
"purescript-maybe": "master"
20+
"purescript-maybe": "master",
21+
"purescript-functions": "master"
2222
},
2323
"devDependencies": {
2424
"purescript-console": "master",

src/Data/Number.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/* globals exports */
2+
"use strict";
3+
4+
exports.nan = NaN;
5+
6+
exports.isNaN = isNaN;
7+
8+
exports.infinity = Infinity;
9+
10+
exports.isFinite = isFinite;
11+
12+
exports.fromStringImpl = function(str, isFinite, just, nothing) {
13+
var num = parseFloat(str);
14+
if (isFinite(num)) {
15+
return just(num);
16+
} else {
17+
return nothing;
18+
}
19+
};

src/Data/Number.purs

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,20 @@ module Data.Number
77
, isFinite
88
) where
99

10-
import Prelude
11-
10+
import Data.Function.Uncurried (Fn4, runFn4)
1211
import Data.Maybe (Maybe(..))
13-
import Global as G
12+
13+
-- | Not a number (NaN)
14+
foreign import nan :: Number
15+
16+
-- | Test whether a number is NaN
17+
foreign import isNaN :: Number -> Boolean
18+
19+
-- | Positive infinity
20+
foreign import infinity :: Number
21+
22+
-- | Test whether a number is finite
23+
foreign import isFinite :: Number -> Boolean
1424

1525
-- | Attempt to parse a `Number` using JavaScripts `parseFloat`. Returns
1626
-- | `Nothing` if the parse fails or if the result is not a finite number.
@@ -40,23 +50,6 @@ import Global as G
4050
-- | (Just 1.2)
4151
-- | ```
4252
fromString :: String -> Maybe Number
43-
fromString = G.readFloat >>> check
44-
where
45-
check num | isFinite num = Just num
46-
| otherwise = Nothing
47-
48-
-- | Not a number (NaN).
49-
nan :: Number
50-
nan = G.nan
51-
52-
-- | Test whether a `Number` is NaN.
53-
isNaN :: Number -> Boolean
54-
isNaN = G.isNaN
55-
56-
-- | Positive infinity.
57-
infinity :: Number
58-
infinity = G.infinity
53+
fromString str = runFn4 fromStringImpl str isFinite Just Nothing
5954

60-
-- | Test whether a number is finite.
61-
isFinite :: Number -> Boolean
62-
isFinite = G.isFinite
55+
foreign import fromStringImpl :: Fn4 String (Number -> Boolean) (forall a. a -> Maybe a) (forall a. Maybe a) (Maybe Number)

test/Main.purs renamed to test/Test/Main.purs

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,49 @@ module Test.Main where
33
import Prelude
44

55
import Data.Maybe (Maybe(..), fromMaybe)
6-
import Data.Number (nan, isNaN, infinity, isFinite, fromString)
7-
import Data.Number.Format (precision, fixed, exponential, toStringWith,
8-
toString)
9-
import Data.Number.Approximate (Fraction(..), Tolerance(..), eqRelative,
10-
eqAbsolute, (≅), (≇))
11-
126
import Effect (Effect)
137
import Effect.Console (log)
14-
import Test.Assert (assertTrue', assertFalse', assertEqual)
158

9+
import Data.Number (isFinite, infinity,nan, isNaN, fromString)
10+
import Data.Number.Format (precision, fixed, exponential, toStringWith, toString)
11+
import Data.Number.Approximate (Fraction(..), Tolerance(..), eqRelative, eqAbsolute, (≅), (≇))
12+
13+
import Test.Assert (assert, assertTrue', assertFalse', assertEqual)
14+
15+
main :: Effect Unit
16+
main = do
17+
globalsTestCode
18+
numbersTestCode
19+
20+
-- Test code for the `purescript-globals` repo before its' Number-related
21+
-- code was moved into this repo
22+
globalsTestCode :: Effect Unit
23+
globalsTestCode = do
24+
let num = 12345.6789
25+
26+
log "nan /= nan"
27+
assert $ nan /= nan
28+
29+
log "not (isNaN 6.0)"
30+
assert $ not (isNaN 6.0)
31+
32+
log "isNaN nan"
33+
assert $ isNaN nan
34+
35+
log "infinity > 0.0"
36+
assert $ infinity > 0.0
37+
38+
log "-infinity < 0.0"
39+
assert $ -infinity < 0.0
40+
41+
log "not (isFinite infinity)"
42+
assert $ not (isFinite infinity)
43+
44+
log "isFinite 0.0"
45+
assert $ isFinite 0.0
46+
47+
-- Test code originally in this repo before parts of deprecated
48+
-- `purescript-globals` repo was moved to this repo.
1649

1750
-- | Comparison up to 10% relative error.
1851
eqRelative' :: Number -> Number -> Boolean
@@ -26,8 +59,8 @@ eqAbsolute' = eqAbsolute (Tolerance 0.1)
2659

2760
infix 1 eqAbsolute' as =~=
2861

29-
main :: Effect Unit
30-
main = do
62+
numbersTestCode :: Effect Unit
63+
numbersTestCode = do
3164

3265

3366
log "Data.Number.fromString"

0 commit comments

Comments
 (0)