From 97cbc528a45d678458f36993a423774e18ca8837 Mon Sep 17 00:00:00 2001 From: David Chambers Date: Wed, 4 Apr 2018 11:15:27 +0200 Subject: [PATCH] reinstate S.unchecked --- index.js | 26 ++++++++++++++++++++++++++ test/create.js | 5 +++++ test/unchecked.js | 15 +++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 test/unchecked.js diff --git a/index.js b/index.js index 88b1e5e9..18b24966 100644 --- a/index.js +++ b/index.js @@ -184,6 +184,10 @@ //. }); //. ``` //. +//. Occasionally one may wish to perform an operation which is not type safe, +//. such as mapping over an object with heterogeneous values. This is possible +//. via selective use of [`unchecked`](#unchecked) functions. +//. //. ## API (function(f) { @@ -404,6 +408,8 @@ (Object.keys (_)).forEach (function(name) { S[name] = def (name) (_[name].consts) (_[name].types) (_[name].impl); }); + S.unchecked = opts.checkTypes ? create ({checkTypes: false, env: opts.env}) + : S; return S; } _.create = { @@ -450,6 +456,26 @@ //. . $.ValidNumber ] //. ``` + //# unchecked :: Module + //. + //. A complete Sanctuary module which performs no type checking. This is + //. useful as it permits operations which Sanctuary's type checking would + //. disallow, such as mapping over an object with heterogeneous values. + //. + //. See also [`create`](#create). + //. + //. ```javascript + //. > S.unchecked.map (S.toString) ({x: 'foo', y: true, z: 42}) + //. {x: '"foo"', y: 'true', z: '42'} + //. ``` + //. + //. Opting out of type checking may cause type errors to go unnoticed. + //. + //. ```javascript + //. > S.unchecked.add (2) ('2') + //. '22' + //. ``` + //. ### Classify //# type :: Any -> { namespace :: Maybe String, name :: String, version :: NonNegativeInteger } diff --git a/test/create.js b/test/create.js index 89200346..f3e898ec 100644 --- a/test/create.js +++ b/test/create.js @@ -37,6 +37,11 @@ test ('create', function() { eq (uncheckedDefaultEnv.env) (S.env); eq (uncheckedCustomEnv.env) (customEnv); + eq (checkedDefaultEnv.unchecked.env) (S.env); + eq (checkedCustomEnv.unchecked.env) (customEnv); + eq (uncheckedDefaultEnv.unchecked.env) (S.env); + eq (uncheckedCustomEnv.unchecked.env) (customEnv); + eq (uncheckedDefaultEnv.add (1) (42)) (S.add (1) (42)); eq (uncheckedDefaultEnv.add (1) ('XXX')) ('1XXX'); diff --git a/test/unchecked.js b/test/unchecked.js new file mode 100644 index 00000000..2323144e --- /dev/null +++ b/test/unchecked.js @@ -0,0 +1,15 @@ +'use strict'; + +var S = require ('..'); + +var eq = require ('./internal/eq'); + + +test ('unchecked', function() { + + eq (S.unchecked.add (2) (2)) (4); + eq (S.unchecked.add (2) ('2')) ('22'); + eq (S.unchecked.add ('2') (2)) ('22'); + eq (S.unchecked.add ('2') ('2')) ('22'); + +});