decoders 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/Decoder.js +41 -148
- package/Decoder.js.flow +1 -1
- package/Decoder.mjs +38 -145
- package/README.md +1 -1
- package/_utils.js +50 -61
- package/_utils.js.flow +18 -4
- package/_utils.mjs +41 -52
- package/annotate.js +79 -72
- package/annotate.mjs +62 -58
- package/format.js +64 -74
- package/format.js.flow +11 -11
- package/format.mjs +58 -68
- package/index.js +66 -66
- package/index.mjs +11 -11
- package/lib/arrays.js +47 -89
- package/lib/arrays.mjs +38 -78
- package/lib/basics.js +59 -109
- package/lib/basics.mjs +49 -94
- package/lib/booleans.js +14 -24
- package/lib/booleans.mjs +9 -19
- package/lib/dates.js +18 -34
- package/lib/dates.mjs +12 -27
- package/lib/json.d.ts +3 -3
- package/lib/json.js +20 -42
- package/lib/json.js.flow +2 -2
- package/lib/json.mjs +13 -35
- package/lib/numbers.js +19 -39
- package/lib/numbers.mjs +11 -31
- package/lib/objects.d.ts +11 -10
- package/lib/objects.js +84 -163
- package/lib/objects.js.flow +4 -12
- package/lib/objects.mjs +74 -150
- package/lib/strings.js +41 -84
- package/lib/strings.mjs +25 -67
- package/lib/unions.d.ts +1 -1
- package/lib/unions.js +52 -116
- package/lib/unions.js.flow +1 -1
- package/lib/unions.mjs +46 -109
- package/lib/utilities.d.ts +7 -1
- package/lib/utilities.js +23 -50
- package/lib/utilities.mjs +15 -38
- package/package.json +1 -1
- package/result.js +9 -22
- package/result.mjs +5 -17
package/index.js
CHANGED
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict'
|
|
2
2
|
|
|
3
|
-
exports.__esModule = true
|
|
4
|
-
exports.uuidv4 = exports.uuidv1 = exports.uuid = exports.url = exports.unknown = exports.undefined_ = exports.tuple = exports.truthy = exports.taggedUnion = exports.string = exports.set = exports.regex = exports.prep = exports.positiveNumber = exports.positiveInteger = exports.pojo = exports.poja = exports.optional = exports.oneOf = exports.object = exports.numericBoolean = exports.number = exports.nullable = exports.null_ = exports.nonEmptyString = exports.nonEmptyArray = exports.never = exports.mixed = exports.maybe = exports.mapping = exports.lazy = exports.jsonObject = exports.jsonArray = exports.json = exports.iso8601 = exports.integer = exports.instanceOf = exports.inexact = exports.httpsUrl = exports.hardcoded = exports.fail = exports.exact = exports.email = exports.either = exports.dict = exports.define = exports.date = exports.constant = exports[
|
|
3
|
+
exports.__esModule = true
|
|
4
|
+
exports.uuidv4 = exports.uuidv1 = exports.uuid = exports.url = exports.unknown = exports.undefined_ = exports.tuple = exports.truthy = exports.taggedUnion = exports.string = exports.set = exports.regex = exports.prep = exports.positiveNumber = exports.positiveInteger = exports.pojo = exports.poja = exports.optional = exports.oneOf = exports.object = exports.numericBoolean = exports.number = exports.nullable = exports.null_ = exports.nonEmptyString = exports.nonEmptyArray = exports.never = exports.mixed = exports.maybe = exports.mapping = exports.lazy = exports.jsonObject = exports.jsonArray = exports.json = exports.iso8601 = exports.integer = exports.instanceOf = exports.inexact = exports.httpsUrl = exports.hardcoded = exports.fail = exports.exact = exports.email = exports.either = exports.dict = exports.define = exports.date = exports.constant = exports['boolean'] = exports.array = exports.anyNumber = exports.always = void 0
|
|
5
5
|
|
|
6
|
-
var _Decoder = require(
|
|
6
|
+
var _Decoder = require('./Decoder')
|
|
7
7
|
|
|
8
|
-
exports.define = _Decoder.define
|
|
8
|
+
exports.define = _Decoder.define
|
|
9
9
|
|
|
10
|
-
var _basics = require(
|
|
10
|
+
var _basics = require('./lib/basics')
|
|
11
11
|
|
|
12
|
-
exports.always = _basics.always
|
|
13
|
-
exports.constant = _basics.constant
|
|
14
|
-
exports.hardcoded = _basics.hardcoded
|
|
15
|
-
exports.maybe = _basics.maybe
|
|
16
|
-
exports.mixed = _basics.mixed
|
|
17
|
-
exports.nullable = _basics.nullable
|
|
18
|
-
exports.null_ = _basics.null_
|
|
19
|
-
exports.optional = _basics.optional
|
|
20
|
-
exports.undefined_ = _basics.undefined_
|
|
21
|
-
exports.unknown = _basics.unknown
|
|
12
|
+
exports.always = _basics.always
|
|
13
|
+
exports.constant = _basics.constant
|
|
14
|
+
exports.hardcoded = _basics.hardcoded
|
|
15
|
+
exports.maybe = _basics.maybe
|
|
16
|
+
exports.mixed = _basics.mixed
|
|
17
|
+
exports.nullable = _basics.nullable
|
|
18
|
+
exports.null_ = _basics.null_
|
|
19
|
+
exports.optional = _basics.optional
|
|
20
|
+
exports.undefined_ = _basics.undefined_
|
|
21
|
+
exports.unknown = _basics.unknown
|
|
22
22
|
|
|
23
|
-
var _arrays = require(
|
|
23
|
+
var _arrays = require('./lib/arrays')
|
|
24
24
|
|
|
25
|
-
exports.array = _arrays.array
|
|
26
|
-
exports.nonEmptyArray = _arrays.nonEmptyArray
|
|
27
|
-
exports.poja = _arrays.poja
|
|
28
|
-
exports.set = _arrays.set
|
|
29
|
-
exports.tuple = _arrays.tuple
|
|
25
|
+
exports.array = _arrays.array
|
|
26
|
+
exports.nonEmptyArray = _arrays.nonEmptyArray
|
|
27
|
+
exports.poja = _arrays.poja
|
|
28
|
+
exports.set = _arrays.set
|
|
29
|
+
exports.tuple = _arrays.tuple
|
|
30
30
|
|
|
31
|
-
var _booleans = require(
|
|
31
|
+
var _booleans = require('./lib/booleans')
|
|
32
32
|
|
|
33
|
-
exports[
|
|
34
|
-
exports.numericBoolean = _booleans.numericBoolean
|
|
35
|
-
exports.truthy = _booleans.truthy
|
|
33
|
+
exports['boolean'] = _booleans['boolean']
|
|
34
|
+
exports.numericBoolean = _booleans.numericBoolean
|
|
35
|
+
exports.truthy = _booleans.truthy
|
|
36
36
|
|
|
37
|
-
var _dates = require(
|
|
37
|
+
var _dates = require('./lib/dates')
|
|
38
38
|
|
|
39
|
-
exports.date = _dates.date
|
|
40
|
-
exports.iso8601 = _dates.iso8601
|
|
39
|
+
exports.date = _dates.date
|
|
40
|
+
exports.iso8601 = _dates.iso8601
|
|
41
41
|
|
|
42
|
-
var _objects = require(
|
|
42
|
+
var _objects = require('./lib/objects')
|
|
43
43
|
|
|
44
|
-
exports.dict = _objects.dict
|
|
45
|
-
exports.exact = _objects.exact
|
|
46
|
-
exports.inexact = _objects.inexact
|
|
47
|
-
exports.mapping = _objects.mapping
|
|
48
|
-
exports.object = _objects.object
|
|
49
|
-
exports.pojo = _objects.pojo
|
|
44
|
+
exports.dict = _objects.dict
|
|
45
|
+
exports.exact = _objects.exact
|
|
46
|
+
exports.inexact = _objects.inexact
|
|
47
|
+
exports.mapping = _objects.mapping
|
|
48
|
+
exports.object = _objects.object
|
|
49
|
+
exports.pojo = _objects.pojo
|
|
50
50
|
|
|
51
|
-
var _unions = require(
|
|
51
|
+
var _unions = require('./lib/unions')
|
|
52
52
|
|
|
53
|
-
exports.either = _unions.either
|
|
54
|
-
exports.oneOf = _unions.oneOf
|
|
55
|
-
exports.taggedUnion = _unions.taggedUnion
|
|
53
|
+
exports.either = _unions.either
|
|
54
|
+
exports.oneOf = _unions.oneOf
|
|
55
|
+
exports.taggedUnion = _unions.taggedUnion
|
|
56
56
|
|
|
57
|
-
var _strings = require(
|
|
57
|
+
var _strings = require('./lib/strings')
|
|
58
58
|
|
|
59
|
-
exports.email = _strings.email
|
|
60
|
-
exports.httpsUrl = _strings.httpsUrl
|
|
61
|
-
exports.nonEmptyString = _strings.nonEmptyString
|
|
62
|
-
exports.regex = _strings.regex
|
|
63
|
-
exports.string = _strings.string
|
|
64
|
-
exports.url = _strings.url
|
|
65
|
-
exports.uuid = _strings.uuid
|
|
66
|
-
exports.uuidv1 = _strings.uuidv1
|
|
67
|
-
exports.uuidv4 = _strings.uuidv4
|
|
59
|
+
exports.email = _strings.email
|
|
60
|
+
exports.httpsUrl = _strings.httpsUrl
|
|
61
|
+
exports.nonEmptyString = _strings.nonEmptyString
|
|
62
|
+
exports.regex = _strings.regex
|
|
63
|
+
exports.string = _strings.string
|
|
64
|
+
exports.url = _strings.url
|
|
65
|
+
exports.uuid = _strings.uuid
|
|
66
|
+
exports.uuidv1 = _strings.uuidv1
|
|
67
|
+
exports.uuidv4 = _strings.uuidv4
|
|
68
68
|
|
|
69
|
-
var _utilities = require(
|
|
69
|
+
var _utilities = require('./lib/utilities')
|
|
70
70
|
|
|
71
|
-
exports.fail = _utilities.fail
|
|
72
|
-
exports.instanceOf = _utilities.instanceOf
|
|
73
|
-
exports.lazy = _utilities.lazy
|
|
74
|
-
exports.never = _utilities.never
|
|
75
|
-
exports.prep = _utilities.prep
|
|
71
|
+
exports.fail = _utilities.fail
|
|
72
|
+
exports.instanceOf = _utilities.instanceOf
|
|
73
|
+
exports.lazy = _utilities.lazy
|
|
74
|
+
exports.never = _utilities.never
|
|
75
|
+
exports.prep = _utilities.prep
|
|
76
76
|
|
|
77
|
-
var _numbers = require(
|
|
77
|
+
var _numbers = require('./lib/numbers')
|
|
78
78
|
|
|
79
|
-
exports.anyNumber = _numbers.anyNumber
|
|
80
|
-
exports.integer = _numbers.integer
|
|
81
|
-
exports.number = _numbers.number
|
|
82
|
-
exports.positiveInteger = _numbers.positiveInteger
|
|
83
|
-
exports.positiveNumber = _numbers.positiveNumber
|
|
79
|
+
exports.anyNumber = _numbers.anyNumber
|
|
80
|
+
exports.integer = _numbers.integer
|
|
81
|
+
exports.number = _numbers.number
|
|
82
|
+
exports.positiveInteger = _numbers.positiveInteger
|
|
83
|
+
exports.positiveNumber = _numbers.positiveNumber
|
|
84
84
|
|
|
85
|
-
var _json = require(
|
|
85
|
+
var _json = require('./lib/json')
|
|
86
86
|
|
|
87
|
-
exports.json = _json.json
|
|
88
|
-
exports.jsonObject = _json.jsonObject
|
|
89
|
-
exports.jsonArray = _json.jsonArray
|
|
87
|
+
exports.json = _json.json
|
|
88
|
+
exports.jsonObject = _json.jsonObject
|
|
89
|
+
exports.jsonArray = _json.jsonArray
|
package/index.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export { define } from './Decoder.mjs'
|
|
2
|
-
export { always, constant, hardcoded, maybe, mixed, nullable, null_, optional, undefined_, unknown } from './lib/basics.mjs'
|
|
3
|
-
export { array, nonEmptyArray, poja, set, tuple } from './lib/arrays.mjs'
|
|
4
|
-
export { boolean, numericBoolean, truthy } from './lib/booleans.mjs'
|
|
5
|
-
export { date, iso8601 } from './lib/dates.mjs'
|
|
6
|
-
export { dict, exact, inexact, mapping, object, pojo } from './lib/objects.mjs'
|
|
7
|
-
export { either, oneOf, taggedUnion } from './lib/unions.mjs'
|
|
8
|
-
export { email, httpsUrl, nonEmptyString, regex, string, url, uuid, uuidv1, uuidv4 } from './lib/strings.mjs'
|
|
9
|
-
export { fail, instanceOf, lazy, never, prep } from './lib/utilities.mjs'
|
|
10
|
-
export { anyNumber, integer, number, positiveInteger, positiveNumber } from './lib/numbers.mjs'
|
|
11
|
-
export { json, jsonObject, jsonArray } from './lib/json.mjs'
|
|
1
|
+
export { define } from './Decoder.mjs'
|
|
2
|
+
export { always, constant, hardcoded, maybe, mixed, nullable, null_, optional, undefined_, unknown } from './lib/basics.mjs'
|
|
3
|
+
export { array, nonEmptyArray, poja, set, tuple } from './lib/arrays.mjs'
|
|
4
|
+
export { boolean, numericBoolean, truthy } from './lib/booleans.mjs'
|
|
5
|
+
export { date, iso8601 } from './lib/dates.mjs'
|
|
6
|
+
export { dict, exact, inexact, mapping, object, pojo } from './lib/objects.mjs'
|
|
7
|
+
export { either, oneOf, taggedUnion } from './lib/unions.mjs'
|
|
8
|
+
export { email, httpsUrl, nonEmptyString, regex, string, url, uuid, uuidv1, uuidv4 } from './lib/strings.mjs'
|
|
9
|
+
export { fail, instanceOf, lazy, never, prep } from './lib/utilities.mjs'
|
|
10
|
+
export { anyNumber, integer, number, positiveInteger, positiveNumber } from './lib/numbers.mjs'
|
|
11
|
+
export { json, jsonObject, jsonArray } from './lib/json.mjs'
|
package/lib/arrays.js
CHANGED
|
@@ -1,139 +1,97 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict'
|
|
2
2
|
|
|
3
|
-
exports.__esModule = true
|
|
4
|
-
exports.array = array
|
|
5
|
-
exports.nonEmptyArray = nonEmptyArray
|
|
6
|
-
exports.poja = void 0
|
|
7
|
-
exports.set = set
|
|
8
|
-
exports.tuple = void 0
|
|
3
|
+
exports.__esModule = true
|
|
4
|
+
exports.array = array
|
|
5
|
+
exports.nonEmptyArray = nonEmptyArray
|
|
6
|
+
exports.poja = void 0
|
|
7
|
+
exports.set = set
|
|
8
|
+
exports.tuple = void 0
|
|
9
9
|
|
|
10
|
-
var _annotate = require(
|
|
10
|
+
var _annotate = require('../annotate')
|
|
11
11
|
|
|
12
|
-
var _Decoder = require(
|
|
12
|
+
var _Decoder = require('../Decoder')
|
|
13
13
|
|
|
14
|
-
/**
|
|
15
|
-
* Accepts any array, but doesn't validate its items further.
|
|
16
|
-
*
|
|
17
|
-
* "poja" means "plain old JavaScript array", a play on `pojo()`.
|
|
18
|
-
*/
|
|
19
14
|
var poja = (0, _Decoder.define)(function (blob, ok, err) {
|
|
20
15
|
if (!Array.isArray(blob)) {
|
|
21
|
-
return err('Must be an array')
|
|
16
|
+
return err('Must be an array')
|
|
22
17
|
}
|
|
23
18
|
|
|
24
|
-
return ok(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
// Javascript is to use .slice() on it, see this benchmark:
|
|
32
|
-
// http://jsben.ch/lO6C5
|
|
33
|
-
blob.slice());
|
|
34
|
-
});
|
|
35
|
-
/**
|
|
36
|
-
* Given an array of Result instances, loop over them all and return:
|
|
37
|
-
* - An [index, err] tuple, indicating the (index of the) first Err instance
|
|
38
|
-
* encountered; or
|
|
39
|
-
* - a new Ok with an array of all unwrapped Ok'ed values
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
exports.poja = poja;
|
|
43
|
-
|
|
44
|
-
function all(items, blobs, // TODO: Make this less ugly
|
|
45
|
-
ok, err) {
|
|
46
|
-
var results = [];
|
|
19
|
+
return ok(blob.slice())
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
exports.poja = poja
|
|
23
|
+
|
|
24
|
+
function all(items, blobs, ok, err) {
|
|
25
|
+
var results = []
|
|
47
26
|
|
|
48
27
|
for (var index = 0; index < items.length; ++index) {
|
|
49
|
-
var result = items[index]
|
|
28
|
+
var result = items[index]
|
|
50
29
|
|
|
51
30
|
if (result.ok) {
|
|
52
|
-
results.push(result.value)
|
|
31
|
+
results.push(result.value)
|
|
53
32
|
} else {
|
|
54
|
-
var ann = result.error
|
|
33
|
+
var ann = result.error
|
|
55
34
|
|
|
56
|
-
var clone = [].concat(blobs)
|
|
57
|
-
clone.splice(index, 1, (0, _annotate.annotate)(ann, ann.text ? ann.text +
|
|
58
|
-
return err((0, _annotate.annotate)(clone))
|
|
35
|
+
var clone = [].concat(blobs)
|
|
36
|
+
clone.splice(index, 1, (0, _annotate.annotate)(ann, ann.text ? ann.text + ' (at index ' + index + ')' : 'index ' + index))
|
|
37
|
+
return err((0, _annotate.annotate)(clone))
|
|
59
38
|
}
|
|
60
39
|
}
|
|
61
40
|
|
|
62
|
-
return ok(results)
|
|
41
|
+
return ok(results)
|
|
63
42
|
}
|
|
64
|
-
/**
|
|
65
|
-
* Accepts arrays of whatever the given decoder accepts.
|
|
66
|
-
*/
|
|
67
|
-
|
|
68
43
|
|
|
69
44
|
function array(decoder) {
|
|
70
45
|
return poja.then(function (blobs, ok, err) {
|
|
71
|
-
var results = blobs.map(decoder.decode)
|
|
72
|
-
return all(results, blobs, ok, err)
|
|
73
|
-
})
|
|
46
|
+
var results = blobs.map(decoder.decode)
|
|
47
|
+
return all(results, blobs, ok, err)
|
|
48
|
+
})
|
|
74
49
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Like `array()`, but will reject arrays with 0 elements.
|
|
77
|
-
*/
|
|
78
|
-
|
|
79
50
|
|
|
80
51
|
function nonEmptyArray(decoder) {
|
|
81
52
|
return array(decoder).refine(function (arr) {
|
|
82
|
-
return arr.length > 0
|
|
83
|
-
}, 'Must be non-empty array')
|
|
53
|
+
return arr.length > 0
|
|
54
|
+
}, 'Must be non-empty array')
|
|
84
55
|
}
|
|
85
|
-
/**
|
|
86
|
-
* Similar to `array()`, but returns the result as an [ES6
|
|
87
|
-
* Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set).
|
|
88
|
-
*/
|
|
89
|
-
|
|
90
56
|
|
|
91
57
|
function set(decoder) {
|
|
92
58
|
return array(decoder).transform(function (items) {
|
|
93
|
-
return new Set(items)
|
|
94
|
-
})
|
|
59
|
+
return new Set(items)
|
|
60
|
+
})
|
|
95
61
|
}
|
|
96
62
|
|
|
97
63
|
var ntuple = function ntuple(n) {
|
|
98
64
|
return poja.refine(function (arr) {
|
|
99
|
-
return arr.length === n
|
|
100
|
-
},
|
|
101
|
-
}
|
|
102
|
-
|
|
65
|
+
return arr.length === n
|
|
66
|
+
}, 'Must be a ' + n + '-tuple')
|
|
67
|
+
}
|
|
103
68
|
|
|
104
69
|
function _tuple() {
|
|
105
70
|
for (var _len = arguments.length, decoders = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
106
|
-
decoders[_key] = arguments[_key]
|
|
71
|
+
decoders[_key] = arguments[_key]
|
|
107
72
|
}
|
|
108
73
|
|
|
109
74
|
return ntuple(decoders.length).then(function (blobs, ok, err) {
|
|
110
|
-
var allOk = true
|
|
75
|
+
var allOk = true
|
|
111
76
|
var rvs = decoders.map(function (decoder, i) {
|
|
112
|
-
var blob = blobs[i]
|
|
113
|
-
var result = decoder.decode(blob)
|
|
77
|
+
var blob = blobs[i]
|
|
78
|
+
var result = decoder.decode(blob)
|
|
114
79
|
|
|
115
80
|
if (result.ok) {
|
|
116
|
-
return result.value
|
|
81
|
+
return result.value
|
|
117
82
|
} else {
|
|
118
|
-
allOk = false
|
|
119
|
-
return result.error
|
|
83
|
+
allOk = false
|
|
84
|
+
return result.error
|
|
120
85
|
}
|
|
121
|
-
})
|
|
86
|
+
})
|
|
122
87
|
|
|
123
88
|
if (allOk) {
|
|
124
|
-
return ok(rvs)
|
|
89
|
+
return ok(rvs)
|
|
125
90
|
} else {
|
|
126
|
-
|
|
127
|
-
// results, try to construct a good error message
|
|
128
|
-
return err((0, _annotate.annotate)(rvs));
|
|
91
|
+
return err((0, _annotate.annotate)(rvs))
|
|
129
92
|
}
|
|
130
|
-
})
|
|
93
|
+
})
|
|
131
94
|
}
|
|
132
|
-
/**
|
|
133
|
-
* Accepts a tuple (an array with exactly _n_ items) of values accepted by the
|
|
134
|
-
* _n_ given decoders.
|
|
135
|
-
*/
|
|
136
|
-
|
|
137
95
|
|
|
138
|
-
var tuple = _tuple
|
|
139
|
-
exports.tuple = tuple
|
|
96
|
+
var tuple = _tuple
|
|
97
|
+
exports.tuple = tuple
|
package/lib/arrays.mjs
CHANGED
|
@@ -1,124 +1,84 @@
|
|
|
1
|
-
import { annotate } from '../annotate.mjs'
|
|
2
|
-
import { define } from '../Decoder.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Accepts any array, but doesn't validate its items further.
|
|
6
|
-
*
|
|
7
|
-
* "poja" means "plain old JavaScript array", a play on `pojo()`.
|
|
8
|
-
*/
|
|
1
|
+
import { annotate } from '../annotate.mjs'
|
|
2
|
+
import { define } from '../Decoder.mjs'
|
|
3
|
+
|
|
9
4
|
export var poja = define(function (blob, ok, err) {
|
|
10
5
|
if (!Array.isArray(blob)) {
|
|
11
|
-
return err('Must be an array')
|
|
6
|
+
return err('Must be an array')
|
|
12
7
|
}
|
|
13
8
|
|
|
14
|
-
return ok(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
// If they want to write items into the array, that's fine!
|
|
20
|
-
// The fastest way to turn a read-only array into a normal array in
|
|
21
|
-
// Javascript is to use .slice() on it, see this benchmark:
|
|
22
|
-
// http://jsben.ch/lO6C5
|
|
23
|
-
blob.slice());
|
|
24
|
-
});
|
|
25
|
-
/**
|
|
26
|
-
* Given an array of Result instances, loop over them all and return:
|
|
27
|
-
* - An [index, err] tuple, indicating the (index of the) first Err instance
|
|
28
|
-
* encountered; or
|
|
29
|
-
* - a new Ok with an array of all unwrapped Ok'ed values
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
function all(items, blobs, // TODO: Make this less ugly
|
|
33
|
-
ok, err) {
|
|
34
|
-
var results = [];
|
|
9
|
+
return ok(blob.slice())
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
function all(items, blobs, ok, err) {
|
|
13
|
+
var results = []
|
|
35
14
|
|
|
36
15
|
for (var index = 0; index < items.length; ++index) {
|
|
37
|
-
var result = items[index]
|
|
16
|
+
var result = items[index]
|
|
38
17
|
|
|
39
18
|
if (result.ok) {
|
|
40
|
-
results.push(result.value)
|
|
19
|
+
results.push(result.value)
|
|
41
20
|
} else {
|
|
42
|
-
var ann = result.error
|
|
21
|
+
var ann = result.error
|
|
43
22
|
|
|
44
|
-
var clone = [].concat(blobs)
|
|
45
|
-
clone.splice(index, 1, annotate(ann, ann.text ? ann.text +
|
|
46
|
-
return err(annotate(clone))
|
|
23
|
+
var clone = [].concat(blobs)
|
|
24
|
+
clone.splice(index, 1, annotate(ann, ann.text ? ann.text + ' (at index ' + index + ')' : 'index ' + index))
|
|
25
|
+
return err(annotate(clone))
|
|
47
26
|
}
|
|
48
27
|
}
|
|
49
28
|
|
|
50
|
-
return ok(results)
|
|
29
|
+
return ok(results)
|
|
51
30
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Accepts arrays of whatever the given decoder accepts.
|
|
54
|
-
*/
|
|
55
|
-
|
|
56
31
|
|
|
57
32
|
export function array(decoder) {
|
|
58
33
|
return poja.then(function (blobs, ok, err) {
|
|
59
|
-
var results = blobs.map(decoder.decode)
|
|
60
|
-
return all(results, blobs, ok, err)
|
|
61
|
-
})
|
|
34
|
+
var results = blobs.map(decoder.decode)
|
|
35
|
+
return all(results, blobs, ok, err)
|
|
36
|
+
})
|
|
62
37
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Like `array()`, but will reject arrays with 0 elements.
|
|
65
|
-
*/
|
|
66
38
|
|
|
67
39
|
export function nonEmptyArray(decoder) {
|
|
68
40
|
return array(decoder).refine(function (arr) {
|
|
69
|
-
return arr.length > 0
|
|
70
|
-
}, 'Must be non-empty array')
|
|
41
|
+
return arr.length > 0
|
|
42
|
+
}, 'Must be non-empty array')
|
|
71
43
|
}
|
|
72
|
-
/**
|
|
73
|
-
* Similar to `array()`, but returns the result as an [ES6
|
|
74
|
-
* Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set).
|
|
75
|
-
*/
|
|
76
44
|
|
|
77
45
|
export function set(decoder) {
|
|
78
46
|
return array(decoder).transform(function (items) {
|
|
79
|
-
return new Set(items)
|
|
80
|
-
})
|
|
47
|
+
return new Set(items)
|
|
48
|
+
})
|
|
81
49
|
}
|
|
82
50
|
|
|
83
51
|
var ntuple = function ntuple(n) {
|
|
84
52
|
return poja.refine(function (arr) {
|
|
85
|
-
return arr.length === n
|
|
86
|
-
},
|
|
87
|
-
}
|
|
88
|
-
|
|
53
|
+
return arr.length === n
|
|
54
|
+
}, 'Must be a ' + n + '-tuple')
|
|
55
|
+
}
|
|
89
56
|
|
|
90
57
|
function _tuple() {
|
|
91
58
|
for (var _len = arguments.length, decoders = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
92
|
-
decoders[_key] = arguments[_key]
|
|
59
|
+
decoders[_key] = arguments[_key]
|
|
93
60
|
}
|
|
94
61
|
|
|
95
62
|
return ntuple(decoders.length).then(function (blobs, ok, err) {
|
|
96
|
-
var allOk = true
|
|
63
|
+
var allOk = true
|
|
97
64
|
var rvs = decoders.map(function (decoder, i) {
|
|
98
|
-
var blob = blobs[i]
|
|
99
|
-
var result = decoder.decode(blob)
|
|
65
|
+
var blob = blobs[i]
|
|
66
|
+
var result = decoder.decode(blob)
|
|
100
67
|
|
|
101
68
|
if (result.ok) {
|
|
102
|
-
return result.value
|
|
69
|
+
return result.value
|
|
103
70
|
} else {
|
|
104
|
-
allOk = false
|
|
105
|
-
return result.error
|
|
71
|
+
allOk = false
|
|
72
|
+
return result.error
|
|
106
73
|
}
|
|
107
|
-
})
|
|
74
|
+
})
|
|
108
75
|
|
|
109
76
|
if (allOk) {
|
|
110
|
-
return ok(rvs)
|
|
77
|
+
return ok(rvs)
|
|
111
78
|
} else {
|
|
112
|
-
|
|
113
|
-
// results, try to construct a good error message
|
|
114
|
-
return err(annotate(rvs));
|
|
79
|
+
return err(annotate(rvs))
|
|
115
80
|
}
|
|
116
|
-
})
|
|
81
|
+
})
|
|
117
82
|
}
|
|
118
|
-
/**
|
|
119
|
-
* Accepts a tuple (an array with exactly _n_ items) of values accepted by the
|
|
120
|
-
* _n_ given decoders.
|
|
121
|
-
*/
|
|
122
|
-
|
|
123
83
|
|
|
124
|
-
export var tuple = _tuple
|
|
84
|
+
export var tuple = _tuple
|