https://github.com/andjsrk/create-curried
An utility to create curried functions that its parameters are reordered by user-defined order
https://github.com/andjsrk/create-curried
builder currying javascript typescript
Last synced: 6 months ago
JSON representation
An utility to create curried functions that its parameters are reordered by user-defined order
- Host: GitHub
- URL: https://github.com/andjsrk/create-curried
- Owner: andjsrk
- License: mit
- Created: 2023-02-12T08:40:31.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-03-08T09:10:30.000Z (over 2 years ago)
- Last Synced: 2024-10-16T08:32:31.642Z (12 months ago)
- Topics: builder, currying, javascript, typescript
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/create-curried
- Size: 6.84 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# create-curried
An utility to create curried functions that its parameters are reordered by user-defined order# Installation
```sh
npm install create-curried
```# Usage
## `curried(fn, maxStaticArgCount?)`
Returns a `Context` for given function. \
`maxStaticArgCount` is maximum number of arguments given function takes, and will be used to determine where non-rest parameters end.
This includes optional parameters as well, but not rest parameters because they have no static argument count.## `Context`
Contains informations about given function such as how parameters should be ordered. \
Generated function's parameters' order depends on order of method calls. \
For example, on below, `reversedF` is `b => a => [a, b]`, and `justF` is `a => b => [a, b]`.
```js
const f = a => b => [a, b]const reversedF = curried(f)
.takes(1)
.takes(0)
.generate()const justF = curried(f)
.takes(0)
.takes(1)
.generate()
```Parameters that are not taken from given function will be filled with `undefined`.
### `Context#takes(position)`
Takes a parameter of the function with given position.### `Context#takesThis()`
Takes thisArg of the function.### `Context#takesRest()`
Takes rest parameter of the function.
because of curried function must take single argument, generated function will take an array instead of taking arguments directly.
> Bound values can be overwritten by generated function's parameters.
### `Context#withStatic(position)`
> :warning: This method is a [HOF(Higher-Order Function)](https://wikipedia.org/wiki/Higher-order_function).Binds argument for given position.
Returns a function that can set argument.#### To TypeScript Users
Returned function takes single generic parameter that can coerce type of `value`.### `Context#withStaticThis(thisArg)`
Binds thisArg.#### To JavaScript Users
The method is a HOF due to support TypeScript well.#### To TypeScript Users
The method takes single generic parameter that can coerce type of `thisArg`.### `Context#generate()`
Generates curried function that its parameters are ordered by order of method calls.#### To TypeScript Users
The method takes single generic parameter `ResultFn` that will be used to do forced type cast for generated function, due to there is no way to handle generic parameters of a function in type level.
`ResultFn` is type of given function by default.## JavaScript
```js
const { curried } = require('create-curried')const map = curried(Array.prototype.map)
.takes(0)
.takesThis()
.generate()const plusOne = x => x + 1
const plusOneEach = map(plusOne)plusOneEach([1, 2, 3]) // => [2, 3, 4]
const toBinaryString = curried(Number.prototype.toString)
.withStatic(0)(2)
.takesThis()
.generate()toBinaryString(10) // => '1010'
```## TypeScript
```ts
import { curried } from 'create-curried'const map = curried(Array.prototype.map)
.takes(0)
.takesThis()
.generate<
(callbackfn: (value: T, index: number, array: Array) => U) =>
(array: Array) =>
Array
>()const plusOne = (x: number) => x + 1
const plusOneEach = map(plusOne)plusOneEach([1, 2, 3]) // => [2, 3, 4]
const toBinaryString = curried(Number.prototype.toString)
.withStatic(0)(2)
.takesThis()
.generate<(number: number) => string>()toBinaryString(10) // => '1010'
```