Skip to content

Instantly share code, notes, and snippets.

@mpj
Last active September 24, 2021 19:43
Show Gist options
  • Save mpj/ec3008a6a1e91376b49f5793f863f27f to your computer and use it in GitHub Desktop.
Save mpj/ec3008a6a1e91376b49f5793f863f27f to your computer and use it in GitHub Desktop.
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