import _, { collect, first } from 'underScore'
import Utils from '../lib/utils.js'
function LazyChain(obj) {
let calls = []
return {
invoke(methodName, ...args) {
calls.push(target => {
let meth = target[methodName]
return meth.apply(target, args)
})
return this
},
force: () => calls.reduce((ret, thunk) => thunk(ret), obj)
}
}
console.log(LazyChain([2,1,3]).invoke('concat', [7,7,8,9,0]).invoke('sort').force())
function deferredSort(ary) {
return LazyChain(ary).invoke('sort')
}
function force(thunk) {
return thunk.force()
}
const deferredSorts = [[2,1,3], [7,7,1], [0, 9, 5]].map(deferredSort)
console.log('deferredSorts.map(force)', deferredSorts.map(force))
const validateTriples = Utils.validator(
'Each array should have three elements',
arrays => arrays.every(a => a.length === 3)
)
const validateTripleStore = Utils.partial(Utils.condition(validateTriples), _.identity)
console.log('validateTripleStore', validateTripleStore([[2,1,3], [7,7,1], [0, 9, 5]]))
const second = (ary) => ary[1]
const postProcess = (ary) => {
return ary.map(second)
}
function processTriples(data) {
return Utils.pipeline(data
,JSON.parse
,validateTripleStore
,deferredSort
,force
,postProcess
,Utils.invoker('sort', Array.prototype.sort)
)
}
console.log('processTriples', processTriples("[[2,1,3], [7,7,1], [0, 9, 5]]"))
function polyToString(obj) {
if (obj instanceof String) {
return obj
} else if (obj instanceof Array) {
return stringifyArray(obj)
}
return obj.toString()
}
function stringifyArray(ary) {
return ["[", ary.map(polyToString).join(',') ,"]"].join('')
}
console.log(
polyToString([1,2,3]),
polyToString([1,2, {a: 42, b: [4,5,6]}, 77]),
polyToString([1,2,[3,4]])
)
console.log(JSON.stringify([1,2,[3,4]]))
let polyToStringNew = Utils.dispatch(
s => _.isString(s) ? s : undefined,
s => _.isArray(s) ? stringifyArray(s) : undefined,
s => _.isObject(s) ? JSON.stringify(s) : undefined,
s => s.toString(),
)
console.log( polyToStringNew([1,2, {a: 42, b: [4,5,6]}, 77]) )
console.log( polyToStringNew([1,2,[3,4]]) )