-
-
Save mutalis/c529f5b3bfd0177235c1a0107a54d54e to your computer and use it in GitHub Desktop.
Transducers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const dragons = [ | |
{ name: 'fluffykins', size: 1 }, | |
{ name: 'wargle', size: 3 } | |
] | |
for(let i=0; i<500; i++) { | |
dragons.push({ name: 'fluffykins', size: Math.random()*10 }) | |
} | |
const getDragonTitle = dragon => { | |
if (dragon.size > 1) { | |
return dragon.name + ' the great' | |
} | |
return dragon.name + ' the tiny' | |
} | |
const arrayReducer = (target, cur) => | |
target.concat(cur) | |
'' | |
const stringReducer = (target, cur) => | |
target + cur | |
// map = (transform) => (reducer) => ... | |
function makeReducerFromTransform(reducer, transform) { | |
return (target, cur) => { | |
const processed = transform(cur) | |
return reducer(target, processed) | |
} | |
} | |
function tMap(transform) { | |
return function transduce (reducer) { | |
return (target, cur) => { | |
const processed = transform(cur) | |
return reducer(target, processed) | |
} | |
} | |
} | |
function tFilter(predicate) { | |
return function transduce (reducer) { | |
return (target, cur) => { | |
if(predicate(cur)) | |
return reducer(target, cur) | |
return target | |
} | |
} | |
} | |
// getDragonTitle = map(dragon => { }) // | |
// const getName = map(item => item.name) | |
const toUpperCase = name => name.toUpperCase() | |
const isGreat = dragon => { | |
console.log('') | |
return dragon => dragon.size > 1 | |
} | |
const dragonTitleTransducer = tMap(getDragonTitle) | |
const upperCaseTransducer = tMap(toUpperCase) | |
const isGreatDragonTransducer = tFilter(isGreat) | |
const dumbCompose = (...fns) => val => { | |
let lastResult = null | |
for (const fn of fns) { | |
lastResult = fn(lastResult || val) | |
} | |
return lastResult | |
} | |
const optimizedCompose = (...fs) => fs.reduceRight((g, f) => x => g(f(x))); | |
dragons.reduce( | |
dumbCompose( | |
upperCaseTransducer, | |
dragonTitleTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
isGreatDragonTransducer, | |
)(arrayReducer), [] | |
) //?. | |
dragons | |
.filter(isGreat) | |
.filter(isGreat) | |
.filter(isGreat) | |
.filter(isGreat) | |
.filter(isGreat) | |
.filter(isGreat) | |
.filter(isGreat) | |
.filter(isGreat) | |
.filter(isGreat) | |
.filter(isGreat) | |
.filter(isGreat) | |
.map(getDragonTitle) | |
.map(toUpperCase) //?. | |
dragons.reduce( | |
isGreatDragonTransducer( | |
dragonTitleTransducer( | |
upperCaseTransducer(arrayReducer))), []) //?. | |
/* | |
dragons.map(dragon => { | |
if (dragon.size > 1) { | |
return dragon.name + ' the great' | |
} | |
return dragon.name + ' the tiny' | |
}) | |
*/ | |
//dragons //? | |
/* | |
function map2(arr, transform) { | |
return arr.reduce(abstractAbstracterson(transform)(arrayReducer), []) | |
} | |
function map1(arr, transform) { | |
return arr.reduce((target, cur) => { | |
const processed = transform(cur) | |
return target.concat(processed) | |
}, []) | |
} | |
map1(dragons, getDragonTitle) //? | |
map2(dragons, getDragonTitle) | |
*/ | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment