mirror of https://github.com/codefeathers/fuse
Muthu Kumar
7 years ago
3 changed files with 73 additions and 8 deletions
@ -1,21 +1,67 @@ |
|||||
'use strict'; |
'use strict'; |
||||
|
|
||||
const isIterable = val => typeof val === "object" && Symbol.iterator in val; |
class SelectValue { |
||||
|
|
||||
class Select { |
|
||||
constructor(value, resolve) { |
constructor(value, resolve) { |
||||
this.value = value; |
this.value = value; |
||||
this.iterable = isIterable(value); |
|
||||
if (resolve) this.resolve = resolve; |
if (resolve) this.resolve = resolve; |
||||
} |
} |
||||
|
} |
||||
|
|
||||
|
SelectValue.prototype.resolve = () => null; |
||||
|
|
||||
|
class SelectIterable { |
||||
|
constructor(values, tests) { |
||||
|
this.values = values |
||||
|
.map(x => x instanceof SelectValue |
||||
|
? x |
||||
|
: new SelectValue(x) |
||||
|
); |
||||
|
this.tests = tests; |
||||
|
} |
||||
|
|
||||
for(test, consequent) { |
for(test, consequent) { |
||||
|
const self = this; |
||||
|
return new SelectIterable( |
||||
|
self.values, |
||||
|
[ ...self.tests, { test, consequent } ] |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* eslint-disable-next-line func-names */ |
||||
|
SelectIterable.prototype.resolve = function (...args) { |
||||
|
const self = this; |
||||
|
return self.values.map(item => { |
||||
|
const resolve = self |
||||
|
.tests |
||||
|
/* eslint-disable-next-line */ |
||||
|
.find(x => { |
||||
|
return x.test(item.value) |
||||
|
? x.consequent |
||||
|
: null; |
||||
|
}); |
||||
|
return resolve |
||||
|
? resolve.consequent(...args, self.value) |
||||
|
: () => null; |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
class Select extends SelectValue { |
||||
|
constructor(value, resolve) { |
||||
|
super(value, resolve); |
||||
|
this.iterable = typeof value === "object" && Symbol.iterator in value; |
||||
|
} |
||||
|
|
||||
|
for(test, consequent) { |
||||
|
if (this.iterable) { |
||||
|
return new SelectIterable( |
||||
|
Array.from(this.value), |
||||
|
[ { test, consequent } ], |
||||
|
); |
||||
|
} |
||||
if (test(this.value)) return new Select(this.value, consequent); |
if (test(this.value)) return new Select(this.value, consequent); |
||||
if (this.resolve) return this; |
|
||||
return this; |
return this; |
||||
} |
} |
||||
} |
} |
||||
|
|
||||
Select.prototype.resolve = () => null; |
|
||||
|
|
||||
module.exports = Select; |
module.exports = Select; |
||||
|
@ -0,0 +1,20 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
const Select = require('../Select'); |
||||
|
|
||||
|
/* global describe it expect */ |
||||
|
describe("Select", () => { |
||||
|
|
||||
|
it("Should return array [ 'Is 10', 'Greater than 10', 'Lesser than 10' ]", |
||||
|
() => { |
||||
|
const a = [ 10, 20, 0 ]; |
||||
|
|
||||
|
const result = new Select(a) |
||||
|
.for(x => x > 10, () => 'Greater than 10') |
||||
|
.for(x => x < 10, () => 'Lesser than 10') |
||||
|
.for(x => x === 10, () => `Is 10`); |
||||
|
|
||||
|
expect(result.resolve()) |
||||
|
.toEqual([ 'Is 10', 'Greater than 10', 'Lesser than 10' ]); |
||||
|
}); |
||||
|
}); |
Loading…
Reference in new issue