Description
Produce By Path is a design pattern, which is used to dynamically produce values by using the path to which it is applied.
Installation
npm install produce-by-path
Usage
import ProduceByPath from "produce-by-path"
// CommonJS usage
// const ProduceByPath = require("produce-by-path")
// define producer instance to our liking :)
const instance = new ProduceByPath({
call: (path, args) => {
return ({
path,
args,
})
},
toPrimitive: (path, hint) => {
return path.join("--")
}
})
// Now we can apply the [[instance]] object with any properties
// combination and call as a function and receive the desired
// result as we defined in the [[call]] handler.
console.log( instance.I.love.you("arg1", "arg2") )
// {
// path: ["I", "love", "you"],
// args: ["arg1", "arg2"]
// }
// We can also apply the [[instance]] object with any properties
// combination and convert as a primitive value and receive
// the desired result as we defined in [[toPrimitive]] handler.
console.log( String(instance.I.love.you) )
// I--love--you
console.log( instance.I.love.you + '')
// I--love--you
Why should I use an ProduceByPath pattern?
Using that pattern in some cases we can build a simple and intuitive interface for my software.
For example, the redux-cool library use that pattern for making action objects.
import {actionsCreator} from "redux-cool"
const first_action = actionsCreator.MY.FIRST.ACTION("arg1", "arg2")
console.log(first_action)
// {
// type: "MY/FIRST/ACTION",
// args: ["arg1", "arg2"],
// cb: f() identity,
// _index: 1
// }
const second_action = actionsCreator.This.is.my.second.action(2021)
console.log(second_action)
// {
// type: "This/is/my/second/action",
// args: [2021],
// cb: f() identity,
// _index: 2
// }
// If we just need to generate an action type as a string,
// we can do it easily
const type1 = String(actionsCreator.MY.FIRST.ACTION)
console.log(type1)
// "MY/FIRST/ACTION"
// or any string conversion
const type2 = actionsCreator.MY.FIRST.ACTION + ""
console.log(type2)
// "MY/FIRST/ACTION"
Top comments (0)