curry-rice
v1.0.0
Published
TypeScript-first curry function without upcast
Downloads
500
Maintainers
Readme
A curly function with a strict type definition. There is no upcast to any
types, respecting the typedef of the callback function.
:sparkles: Features
- :zap: Multi runtime support (
Deno
,Node.js
and Browsers) - :books: Pure TypeScript and provides type definition
- :earth_americas: Universal module, providing
ES modules
andCommonjs
- :package: Optimized, super slim size
- :page_facing_up: TSDoc-style comments
Package name
Deno: curry
(deno.land,
nest.land)
Node.js: curry-rice
(npm)
The origin of the word curry-rice
is Rice and curry 🍛.
:zap: Overview
ReturnValue
const replace = (from: string, to: string, val: string) =>
val.replace(from, to);
const curriedReplace = curry(replace);
curriedReplace("hello", "hi", "hello world"); // 'hi world'
curriedReplace("hello")("hi", "hello world"); // 'hi world'
curriedReplace("hello", "hi")("hello world"); // 'hi world'
curriedReplace("hello")("hi")("hello world"); // 'hi world'
curriedReplace("hello", "hi", "hello world"); // 'hi world'
ReturnType
curriedReplace("hello"); // (to: string, val: string): string
curriedReplace("hello")("hi"); // (val: string): string
curriedReplace("hello", "hi"); // (val: string): string
curriedReplace("hello", "hi", "hello world"); // string
curriedReplace("hello")("hi")("hello world"); // string
curriedReplace("hello", "hi")("hello world"); // string
curriedReplace("hello")("hi", "hello world"); // string
:dizzy: Usage
curry
provides multi platform modules.
🦕 Deno
deno.land
import { curry } from "https://deno.land/x/curry/mod.ts";
curry(AnyFn);
nest.land
import { curry } from "https://x.nest.land/curry/mod.ts";
curry(AnyFn);
:package: Node.js
NPM package name is
curry-rice
.
Install
npm i curry-rice
or
yarn add curry-rice
ES modules
import { curry } from "curry-rice";
curry(AnyFn);
Commonjs
const { curry } = require("curry-rice");
curry(AnyFn);
:globe_with_meridians: Browser
The module that bundles the dependencies is obtained from skypack.
<script type="module">
import { curry } from "https://cdn.skypack.dev/curry-rice";
curry(AnyFn)
</script>
API
Type definition
curry
declare const curry: <T extends unknown[], R>(
fn: (...args: T) => R,
) => Curried<T, R>;
| Parameter | Description |
| --------- | ------------ |
| fn
| Any function |
=>
The new curried function
Example
const nullary = () => true;
curry(nullary); // () => boolean
const unary = (val: number) => val++;
curry(unary); // (val: number) => number
const binaryFn = (a: number, b: number) => a + b;
curry(binaryFn); // (a: number, b: number) => number || (a: number) => (b:number) => number
Restriction
This package is focused on getting correct type inference. Hence, there are the following limitations:
- Maximum number of arity is
19
.
Beyond that, the type system will breaks.
Overloads function
cannot be correctly type inferred.
Overloads function is something like this:
function len(s: string): number;
function len(arr: any[]): number;
function len(x: any) {
return x.length;
}
For example, it has the following differences from
lodash.curry
.
lodash.curry
has a placeholder feature, which this package does not have.- The argument of the curried function in
lodash.curry
isany
types, but in this package, the type of the original argument is inferred.
Although placeholders are a useful feature, it is very difficult to implement it while maintaining correct type inference.
If you can solve this issue, please make a pull request.
:green_heart: Supports
ie is no longer supported to reduce bundle size.
The TypeScript version must be 4.1.0
or higher.
This project provides ES modules
and Commonjs
.
If you have an opinion about what to support, you can open an issue to discuss it.
The browserslist
has the following settings.
defaults
last 8 version
not IE <= 11
not ie_mob <= 11
node 6
| Deno | Node.js | Edge | Firefox | Chrome | Safari | iOS Safari | Samsung | Opera |
| --------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| ^1.6.0
| ^6.17.0
| ^83
| ^78
| ^83
| ^11
| ^12.0
| ^7.2
| ^68
|
:handshake: Contributing
Contributions, issues and feature requests are welcome!Feel free to check issues.
:seedling: Show your support
Give a ⭐️ if this project helped you!
:bulb: License
Copyright © 2021-present TomokiMiyauci.
Released under the MIT license