more refactoring and cleanup...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2023-02-08 01:48:59 +03:00
parent 8c2220d13a
commit ada754b7f2
4 changed files with 135 additions and 30 deletions

View File

@ -117,11 +117,6 @@ module.packed =
&& Symbol.asyncIterator in list)){
return list
.then(this.pack.bind(this)) }
// list: generator...
if(typeof(list) == 'object'
&& !list.map
&& Symbol.iterator in list){
list = [...list] }
/* XXX on one hand this should be here and on the other I'm not
// sure how are we going to thread handler and onerror to
// here...
@ -419,6 +414,17 @@ object.Constructor('IterablePromise', Promise, {
// handle iterable promise...
if(list instanceof IterablePromise){
return this.__handle(list.__packed, handler, onerror) }
// list: generator...
if(typeof(list) == 'object'
// XXX this will cause a break later on...
//&& !list.map
&& Symbol.iterator in list){
try{
list = [...list]
} catch(err){
if(typeof(onerror) == 'function'){
return onerror(err) }
throw err } }
// handle promise / async-iterator...
if(typeof(list) == 'object'
&& Symbol.asyncIterator in list){
@ -429,6 +435,7 @@ object.Constructor('IterablePromise', Promise, {
// do the packing...
var packed = module.packed.pack(list)
// handle if needed...
return handler ?
this.__handle(packed, handler, onerror)
@ -753,16 +760,28 @@ object.Constructor('IterablePromise', Promise, {
: this.constructor(this.__packed, 'raw') },
// XXX EXPEREMENTAL
// XXX handle rejected state...
isSync: function(){
return !(this.__packed instanceof Promise
|| this.__packed
.filter(function(e){
return e instanceof IterablePromise ?
!e.isSync()
: e instanceof Promise
&& !(e instanceof SyncPromise) })
.length > 0) },
return '__value' in this
|| (this.__packed instanceof Array
&& !(this.__packed
.filter(function(e){
return e instanceof IterablePromise ?
!e.isSync()
: e instanceof Promise
&& !(e instanceof SyncPromise) })
.length > 0)) },
// XXX BUG: if sync is called before .__handle(..) is done it will
// do things that we do not want yet like unwinding generators
// etc...
sync: function(error=false){
if('__value' in this){
return this.__value }
if(!this.isSync()){
return error ?
this.catch(error)
: this }
// try and unpack...
try{
var res = this.__unpack()
}catch(err){
@ -834,11 +853,26 @@ object.Constructor('IterablePromise', Promise, {
// populate new instance...
if(promise){
// XXX EXPEREMENTAL...
obj.then(function(value){
Object.defineProperty(obj, '__value', {
value,
enumerable: false,
}) })
// handle onerror(..)
var error = false
var handleError = function(err){
onerror ?
promise.resolve(onerror(err))
: promise.reject(err) }
error = true
if(onerror){
var res = onerror(err)
// XXX do we use .__pack(..) here???
obj.__packed = undefined
// XXX this is wrong -- need to store the value as-is...
//obj.__packed = [res]
promise.resolve(res)
} else {
promise.reject(err) } }
// handle/pack input data...
if(handler != 'raw'){
//list = list instanceof IterablePromise ?
@ -852,6 +886,10 @@ object.Constructor('IterablePromise', Promise, {
writable: true,
})
// list generator broke...
if(error){
return obj }
// handle promise state...
try{
var res = obj.__unpack(list)
@ -939,18 +977,20 @@ object.Constructor('IterableSequentialStartPromise', IterablePromise, {
res.push(e) }
return res }
// NOTE: we are not handling the list here...
list = object.parentCall(IterableSequentialStartPromise.prototype.__pack, this, list)
// NOTE: we are not handling the list here yet...
// NOTE: if packing breaks but the error is handled this will return undefined...
list = object.parentCall(IterableSequentialStartPromise.prototype.__pack, this,
list, undefined, onerror)
list = list instanceof SyncPromise ?
list.sync()
: list
// repack...
list = list instanceof Array ?
repack(list)
: list.then ?
: list && list.then ?
list.then(repack)
: list
return handler ?
return list && handler ?
this.__handle(list, handler, onerror)
: list },
})

View File

@ -236,6 +236,14 @@ object.Mixin('GeneratorMixin', 'soft', {
reduce: makeGenerator('reduce'),
reduceRight: makeGenerator('reduceRight'),
// XXX
smap: makeGenerator('smap'),
sfilter: makeGenerator('sfilter'),
sreduce: makeGenerator('sreduce'),
sreduceRight: makeGenerator('sreduceRight'),
sforEach: makeGenerator('sforEach'),
//*/
between: makeGenerator('between'),
// XXX EXPERIMENTAL
@ -413,6 +421,8 @@ object.Mixin('GeneratorProtoMixin', 'soft', {
for(var e of this){
yield func(e, i++, this) } } },
__onstop),
smap: function*(func){
yield* this.map(...arguments) },
filter: stoppable(
function*(func){
var i = 0
@ -428,6 +438,8 @@ object.Mixin('GeneratorProtoMixin', 'soft', {
err.value = e }
throw err } },
__onstop),
sfilter: function*(func){
yield* this.filter(...arguments) },
reduce: stoppable(
function(func, res){
@ -439,6 +451,8 @@ object.Mixin('GeneratorProtoMixin', 'soft', {
// was passed a function from ever being treated as onstop(..)...
function(res, f, _, onstop){
return __onstop.call(this, res, onstop) }),
sreduce: function*(func, res){
yield* this.reduce(...arguments) },
greduce: function*(func, res){
yield this.reduce(...arguments) },
@ -463,6 +477,8 @@ object.Mixin('GeneratorProtoMixin', 'soft', {
// XXX EXPERIMENTAL
forEach: function(func){
return [...this].map(func) },
sforEach: function(func){
return this.forEach(func) },
pop: function(){
return [...this].pop() },

View File

@ -1,6 +1,6 @@
{
"name": "ig-types",
"version": "6.25.1",
"version": "6.25.3",
"description": "Generic JavaScript types and type extensions...",
"main": "main.js",
"scripts": {

67
test.js
View File

@ -304,7 +304,7 @@ var cases = test.Cases({
'promises as elements')
// XXX split this into separate cases...
for(var meth of ['iter', 'seqiter']){
for(var meth of ['iter', 'seqiter', 'seqstartiter']){
// XXX need a recursive assert...
var should_be = [ [1], [2], [3], [4], [5], [6] ]
var got = await Promise[meth]([
@ -336,6 +336,12 @@ var cases = test.Cases({
await Promise[meth]([1, Promise.resolve(2), Promise.resolve(3)]),
[1,2,3],
'flat unpack', meth)
assert.array(
await Promise[meth](
(function*(){ yield* [1, Promise.resolve(2), Promise.resolve(3)] })()),
[1,2,3],
'generator input', meth)
}
var order = []
@ -457,7 +463,8 @@ var cases = test.Cases({
// error...
for(var iter of ['iter', 'seqiter', 'seqstartiter']){
assert(
await Promise[iter]([1,2,Promise.resolve(3),4,5],
await Promise[iter](
[1,2,Promise.resolve(3),4,5],
function(e){
if(e == 2){
throw 'ERROR' }
@ -467,7 +474,8 @@ var cases = test.Cases({
== 'done',
`.${iter}(..): .catch(..)`)
assert(
await Promise[iter]([1,2,Promise.resolve(3),4,5],
await Promise[iter](
[1,2,Promise.resolve(3),4,5],
function(e){
if(e == 2){
throw 'ERROR' }
@ -477,7 +485,8 @@ var cases = test.Cases({
== 'done',
`.${iter}(..): onerror(..)`)
assert(
await Promise[iter]([1,2,Promise.resolve(3),4,5],
await Promise[iter](
[1,2,Promise.resolve(3),4,5],
function(e){
if(e == 3){
throw 'ERROR' }
@ -487,7 +496,8 @@ var cases = test.Cases({
== 'done',
`.${iter}(..): edge onerror(..)`)
assert(
await Promise[iter]([1,2,Promise.resolve(3),4,5],
await Promise[iter](
[1,2,Promise.resolve(3),4,5],
function(e){
if(e == 4){
throw 'ERROR' }
@ -499,17 +509,56 @@ var cases = test.Cases({
assert(
await Promise[iter](
(function*(){
yield* [1,2,3]
throw 'ERROR' })(),
yield* [1,2,3] })(),
function(e){
if(e == 4){
if(e == 2){
throw 'ERROR' }
return e },
function(err){
return 'done' })
== 'done',
`.${iter}(..): late onerror(..)`)
`.${iter}(..): input generator, onerror(..) in handler`)
assert(
(pr = await Promise[iter](
(function*(){
yield* [1,2,3]
throw 'ERROR' })(),
function(e){
return e },
function(err){
return 'done' }))
== 'done',
`.${iter}(..): onerror(..) in input generator`, pr)
assert(
await (pr = Promise[iter](
(function*(){
yield* [1,2,3]
throw 'ERROR' })(),
function(e){
if(e == 4){
throw 'ERROR' }
return e },
function(err){
return 'done' })
.sync())
=== 'done',
`.${iter}(..): onerror(..) on input generator + .sync()`, pr)
assert(
await Promise.iter(
(function*(){
yield* [1,2,3]
throw 'ERROR' })(),
function(e){
return new Promise(function(ok, err){
if(e == 2){
err('moo!') }
ok(e) })},
function(err){
return 333 })
== 333,
`.${iter}(..): onerror(..) with promise handler`)
}
},
// Date.js