Make your data callable with callable-data
![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)
Why?
Maps (objects) can be viewed as a pure function, in the sense, that specific values produce specific outcomes.
Wouldn't it be nice, if one could use this datastructure to model logical relations in a given domain? And wouldn't it then be nice, if we would not need to distinguish on the caller-side between a 'dynamic' function and a 'function' which is defined through a 'callable' object?
callable-data
provides the function callable
, which turns an object into something that can be called. Under the hood this happens by utilising proxy-magic (check the source-code it's only about 60 LOC)
Usage
import { callable, defaultsTo } from 'callable-data'
const beats = callable({
rock: 'scissors',
scissors: 'paper',
paper: 'rock',
})
const choicesToGameOutcome = ([a, b]) => {
if (a === b) return 'draw'
return beats(a) === b ? 'win' : 'lose'
}
const choices = ['rock', 'rock', 'paper']
const losesToThoseChoices = choices.map(beats)
const mapWithNativeSyntax = choices.map(choice => beats[choice])
const questionToAnswer = callable({ foo: 'bar', [defaultsTo]: 42 })
questionToAnswer('foo')
questionToAnswer('buuz')
questionToAnswer['bibuba']
const user = callable({
address: {
street: 'someStreet',
},
})
user(['address', 'street'])
Prerequisites
Proxies are used for the magic. Be sure that your environment understands them.
Caveats
console.log uses an object representation, which cannot be hooked into.
const questionToAnswer = callable({ foo: 'bar', [defaultsTo]: 42 })
console.log(questionToAnswer)
console.log(questionToAnswer())
typeof
changes from object
to function
typeof {}
typeof callable({})
Install
npm i callable-data
Run tests
npm test
Author
👤 Tim Kutscha
Show your support
Give a ⭐️ if this project helped you!
📝 License
Copyright © 2023 Tim Kutscha.
This project is MIT licensed.