Skip to content

Instantly share code, notes, and snippets.

@michaelwclark
Created March 27, 2019 14:01
Show Gist options
  • Select an option

  • Save michaelwclark/7590c8bc25dba2be9fcf67ea60f566b9 to your computer and use it in GitHub Desktop.

Select an option

Save michaelwclark/7590c8bc25dba2be9fcf67ea60f566b9 to your computer and use it in GitHub Desktop.
Dependancy injection using Functional Composition
const DbProvider = params => {
console.log({params})
return {db :'db', ...params}
}
const LogProvider = params => {
console.log({params})
return {logger: 'logger', ...params}
}
const addUsersFn = params => {
return params
}
const compose = (...fns) => x => fns.reduceRight((y, f) => f(y), x)
const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x)
const addUsers = params => compose(addUsersFn, LogProvider, DbProvider)({params})
const addUsers2 = params => pipe(LogProvider, DbProvider, addUsersFn)({params})
console.log(addUsers('hello'))
console.log(addUsers2('hello'))
const asyncDBProvider = async params => {
console.log(params)
return Promise.resolve({db: 'asyncdb', ...params})
}
const asyncLogProvider = async params =>{
console.log(params)
return Promise.resolve({log: 'asynclog', ...params})
}
const asyncAddUsersFn = params => {
console.log(params)
return params
}
const asyncCompose = (...fns) => x => fns.reduceRight(async (y, f) => await f(await y), x)
const asyncPipe = (...fns) => x => fns.reduce(async (y, f) => await f(await y), x)
const asyncAddUsers = params => asyncCompose(asyncAddUsersFn, asyncLogProvider, asyncDBProvider)({params})
const asyncAddUsers2 = params => asyncPipe(asyncLogProvider, asyncDBProvider, asyncAddUsersFn)({params})
console.log(asyncAddUsers('hello').then(x=>{
console.log(x)
}))
console.log(asyncAddUsers2('hello').then(x=>{
console.log(x)
}))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment