Skip to content

Instantly share code, notes, and snippets.

@achinaou
Last active December 13, 2023 10:03
Show Gist options
  • Save achinaou/617145ba2c6a1ac4c959687741d3d7ad to your computer and use it in GitHub Desktop.
Save achinaou/617145ba2c6a1ac4c959687741d3d7ad to your computer and use it in GitHub Desktop.
Just Having Fun...
"use strict"
const identity = x => x
const of = x => [x]
const empty = () => []
const concat = (xs, ys) => [...xs, ...ys]
const foldRight = f => acc => ([x, ...xs]) => x
? f(x, foldRight(f)(acc)(xs))
: acc
const foldLeft = f => acc => ([x, ...xs]) => x
? foldLeft(f)(f(acc, x))(xs)
: acc
const map = f => foldLeft((acc, value) => concat(acc, of(f(value))))(empty())
const flatMap = f => foldLeft((acc, value) => concat(acc, f(value)))(empty())
const filter = f => foldLeft((acc, value) => f(value) ? concat(acc, of(value)) : acc)(empty())
const compose = (...args) => foldLeft((acc, value) => x => acc(value(x)))(identity)(args)
const process = compose(
foldLeft((acc, value) => acc + value)(0),
map(x => x * 5),
filter(x => x % 2 === 0),
flatMap(identity)
)
const input = [[1, 2], [3, 4], [5, 6], [7, 8]]
const output = process(input)
console.log(output)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment