diff --git a/CHANGELOG.md b/CHANGELOG.md index 5df9f6b0..34239b17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Next version +### API changes + +- Add `Nullable.isNull`, `Nullable.isUndefined`, and similar functions to `Nullable` and `Null` modules. https://github.com/rescript-association/rescript-core/pull/125 + ## 0.4.0 ### API changes diff --git a/src/Core__Null.mjs b/src/Core__Null.mjs index d6c6e83b..813069fc 100644 --- a/src/Core__Null.mjs +++ b/src/Core__Null.mjs @@ -63,6 +63,10 @@ function flatMap(value, f) { } } +function isNull(i) { + return i === null; +} + export { equal , compare , @@ -72,5 +76,6 @@ export { map , mapWithDefault , flatMap , + isNull , } /* No side effect */ diff --git a/src/Core__Null.res b/src/Core__Null.res index 023ad78c..74bd38a3 100644 --- a/src/Core__Null.res +++ b/src/Core__Null.res @@ -49,3 +49,5 @@ let flatMap = (value, f) => | Some(x) => f(x) | None => null } + +let isNull = i => i == null diff --git a/src/Core__Null.resi b/src/Core__Null.resi index f2e917fc..aa70ad74 100644 --- a/src/Core__Null.resi +++ b/src/Core__Null.resi @@ -174,3 +174,17 @@ Null.flatMap(null, addIfAboveOne) // null ``` */ let flatMap: (t<'a>, 'a => t<'b>) => t<'b> + +/** +`isNull(value)` checks if `value===null` + +## Examples + +```rescript +"abc"->Null.make->Null.isNull // false +Nullable.undefined->Null.make->Null.isNull // false +Null.null->Null.isNull // true +None->Null.make->Null.isNull // false +``` +*/ +let isNull: t<'a> => bool diff --git a/src/Core__Nullable.mjs b/src/Core__Nullable.mjs index 00606cb3..aee08f94 100644 --- a/src/Core__Nullable.mjs +++ b/src/Core__Nullable.mjs @@ -62,6 +62,22 @@ function flatMap(value, f) { } } +function isNull(i) { + return i === null; +} + +function isUndefined(i) { + return i === undefined; +} + +function isNullOrUndefined(i) { + if (i === undefined) { + return true; + } else { + return i === null; + } +} + export { equal , compare , @@ -71,5 +87,8 @@ export { map , mapWithDefault , flatMap , + isNull , + isUndefined , + isNullOrUndefined , } /* No side effect */ diff --git a/src/Core__Nullable.res b/src/Core__Nullable.res index 51849685..ff047a3f 100644 --- a/src/Core__Nullable.res +++ b/src/Core__Nullable.res @@ -49,3 +49,7 @@ let flatMap = (value, f) => | Some(x) => f(x) | None => Obj.magic(value) } + +let isNull = i => i == null +let isUndefined = i => i == undefined +let isNullOrUndefined = i => i == undefined || i == null diff --git a/src/Core__Nullable.resi b/src/Core__Nullable.resi index 4ca135ac..818fb12d 100644 --- a/src/Core__Nullable.resi +++ b/src/Core__Nullable.resi @@ -184,3 +184,45 @@ Nullable.flatMap(Nullable.null, addIfAboveOne) // undefined ``` */ let flatMap: (t<'a>, 'a => t<'b>) => t<'b> + +/** +`isNull(value)` checks if `value===null` + +## Examples + +```rescript +"abc"->Nullable.make->Nullable.isNull // false +Nullable.undefined->Nullable.isNull // false +Nullable.null->Nullable.isNull // true +None->Nullable.make->Nullable.isNull // false +``` +*/ +let isNull: t<'a> => bool + +/** +`isUndefined(value)` checks if `value===undefined` + +## Examples + +```rescript +"abc"->Nullable.make->Nullable.isUndefined // false +Nullable.null->Nullable.isUndefined // false +Nullable.undefined->Nullable.isUndefined // true +None->Nullable.make->Nullable.isUndefined // true +``` +*/ +let isUndefined: t<'a> => bool + +/** +`isNullOrUndefined(value)` checks if `value===undefined || value===null` + +## Examples + +```rescript +"abc"->Nullable.make->Nullable.isNullOrUndefined // false +Nullable.null->Nullable.isNullOrUndefined // true +Nullable.undefined->Nullable.isUndefined // true +None->Nullable.make->Nullable.isNullOrUndefined // true +``` +*/ +let isNullOrUndefined: t<'a> => bool diff --git a/test/NullableTests.mjs b/test/NullableTests.mjs new file mode 100644 index 00000000..26af6602 --- /dev/null +++ b/test/NullableTests.mjs @@ -0,0 +1,173 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as Test from "./Test.mjs"; +import * as Caml_obj from "rescript/lib/es6/caml_obj.js"; +import * as Core__Null from "../src/Core__Null.mjs"; +import * as Core__Nullable from "../src/Core__Nullable.mjs"; + +var eq = Caml_obj.equal; + +Test.run([ + [ + "NullableTests.res", + 7, + 20, + 38 + ], + "isNull when null" + ], Core__Nullable.isNull(null), eq, true); + +Test.run([ + [ + "NullableTests.res", + 8, + 20, + 39 + ], + "isNull when undef" + ], Core__Nullable.isNull(undefined), eq, false); + +Test.run([ + [ + "NullableTests.res", + 9, + 20, + 37 + ], + "isNull when abc" + ], Core__Nullable.isNull("abc"), eq, false); + +Test.run([ + [ + "NullableTests.res", + 10, + 20, + 38 + ], + "isNull when None" + ], Core__Nullable.isNull(undefined), eq, false); + +Test.run([ + [ + "NullableTests.res", + 12, + 20, + 39 + ], + "isUndef when null" + ], Core__Nullable.isUndefined(null), eq, false); + +Test.run([ + [ + "NullableTests.res", + 13, + 20, + 40 + ], + "isUndef when undef" + ], Core__Nullable.isUndefined(undefined), eq, true); + +Test.run([ + [ + "NullableTests.res", + 14, + 20, + 38 + ], + "isUndef when abc" + ], Core__Nullable.isUndefined("abc"), eq, false); + +Test.run([ + [ + "NullableTests.res", + 15, + 20, + 39 + ], + "isUndef when None" + ], Core__Nullable.isUndefined(undefined), eq, true); + +Test.run([ + [ + "NullableTests.res", + 17, + 20, + 45 + ], + "isNullOrUndef when null" + ], Core__Nullable.isNullOrUndefined(null), eq, true); + +Test.run([ + [ + "NullableTests.res", + 19, + 13, + 39 + ], + "isNullOrUndef when undef" + ], Core__Nullable.isNullOrUndefined(undefined), eq, true); + +Test.run([ + [ + "NullableTests.res", + 25, + 13, + 37 + ], + "isNullOrUndef when abc" + ], Core__Nullable.isNullOrUndefined("abc"), eq, false); + +Test.run([ + [ + "NullableTests.res", + 31, + 13, + 38 + ], + "isNullOrUndef when None" + ], Core__Nullable.isNullOrUndefined(undefined), eq, true); + +Test.run([ + [ + "NullableTests.res", + 37, + 20, + 56 + ], + "isNull when null using Null module" + ], Core__Null.isNull(null), eq, true); + +Test.run([ + [ + "NullableTests.res", + 39, + 13, + 50 + ], + "isNull when undef using Null module" + ], Core__Null.isNull(undefined), eq, false); + +Test.run([ + [ + "NullableTests.res", + 44, + 20, + 55 + ], + "isNull when abc using Null module" + ], Core__Null.isNull("abc"), eq, false); + +Test.run([ + [ + "NullableTests.res", + 45, + 20, + 56 + ], + "isNull when None using Null module" + ], Core__Null.isNull(undefined), eq, false); + +export { + eq , +} +/* Not a pure module */ diff --git a/test/NullableTests.res b/test/NullableTests.res new file mode 100644 index 00000000..4df52769 --- /dev/null +++ b/test/NullableTests.res @@ -0,0 +1,45 @@ +open RescriptCore + +let eq = (a, b) => a == b + +// ===== isNull, isUndefined, isNullOrUndefined ===== + +Test.run(__POS_OF__("isNull when null"), Nullable.null->Nullable.isNull, eq, true) +Test.run(__POS_OF__("isNull when undef"), Nullable.undefined->Nullable.isNull, eq, false) +Test.run(__POS_OF__("isNull when abc"), "abc"->Nullable.make->Nullable.isNull, eq, false) +Test.run(__POS_OF__("isNull when None"), None->Nullable.make->Nullable.isNull, eq, false) + +Test.run(__POS_OF__("isUndef when null"), Nullable.null->Nullable.isUndefined, eq, false) +Test.run(__POS_OF__("isUndef when undef"), Nullable.undefined->Nullable.isUndefined, eq, true) +Test.run(__POS_OF__("isUndef when abc"), "abc"->Nullable.make->Nullable.isUndefined, eq, false) +Test.run(__POS_OF__("isUndef when None"), None->Nullable.make->Nullable.isUndefined, eq, true) + +Test.run(__POS_OF__("isNullOrUndef when null"), Nullable.null->Nullable.isNullOrUndefined, eq, true) +Test.run( + __POS_OF__("isNullOrUndef when undef"), + Nullable.undefined->Nullable.isNullOrUndefined, + eq, + true, +) +Test.run( + __POS_OF__("isNullOrUndef when abc"), + "abc"->Nullable.make->Nullable.isNullOrUndefined, + eq, + false, +) +Test.run( + __POS_OF__("isNullOrUndef when None"), + None->Nullable.make->Nullable.isNullOrUndefined, + eq, + true, +) + +Test.run(__POS_OF__("isNull when null using Null module"), Null.null->Null.isNull, eq, true) +Test.run( + __POS_OF__("isNull when undef using Null module"), + Nullable.undefined->Null.make->Null.isNull, + eq, + false, +) +Test.run(__POS_OF__("isNull when abc using Null module"), "abc"->Null.make->Null.isNull, eq, false) +Test.run(__POS_OF__("isNull when None using Null module"), None->Null.make->Null.isNull, eq, false) diff --git a/test/TestSuite.mjs b/test/TestSuite.mjs index 3d8e7128..42c08b3a 100644 --- a/test/TestSuite.mjs +++ b/test/TestSuite.mjs @@ -6,6 +6,7 @@ import * as ArrayTests from "./ArrayTests.mjs"; import * as ErrorTests from "./ErrorTests.mjs"; import * as PromiseTest from "./PromiseTest.mjs"; import * as ResultTests from "./ResultTests.mjs"; +import * as NullableTests from "./NullableTests.mjs"; import * as TypedArrayTests from "./TypedArrayTests.mjs"; var bign = TestTests.bign; @@ -34,8 +35,6 @@ var forEachIfOkCallFunction = ResultTests.forEachIfOkCallFunction; var forEachIfErrorDoNotCallFunction = ResultTests.forEachIfErrorDoNotCallFunction; -var eq = TypedArrayTests.eq; - var num1 = TypedArrayTests.num1; var num2 = TypedArrayTests.num2; @@ -50,6 +49,8 @@ var areSame = TypedArrayTests.areSame; var o = TypedArrayTests.o; +var eq = NullableTests.eq; + export { bign , TestError , @@ -64,7 +65,6 @@ export { $$catch , forEachIfOkCallFunction , forEachIfErrorDoNotCallFunction , - eq , num1 , num2 , num3 , @@ -72,5 +72,6 @@ export { assertWillThrow , areSame , o , + eq , } /* IntTests Not a pure module */ diff --git a/test/TestSuite.res b/test/TestSuite.res index 18bd6273..07d209ab 100644 --- a/test/TestSuite.res +++ b/test/TestSuite.res @@ -5,3 +5,4 @@ include ArrayTests include IntTests include ResultTests include TypedArrayTests +include NullableTests