# uncurry-x

> Standard uncurryThis utility for method-to-function transformation with full legacy environment support.

Latest version **1.0.1** (published 2025-12-23) · MIT license · 0 weekly downloads

## Install

```sh
npm install uncurry-x
pnpm add uncurry-x
yarn add uncurry-x
bun add uncurry-x
```

## Health

**Score 45/100 (D)** — status: stable.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

## Facts

| | |
|---|---|
| Version | 1.0.1 |
| Published | 2025-12-23 |
| First published | 2025-12-23 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 3 |
| Unpacked size | 8.8 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 1 |
| Author | Fox Jones |
| Maintainers | xsfj |
| Keywords | uncurry, uncurry-x, call-bind, methodize, prototype, static, call, bind, apply, function, es-abstract, shim, polyfill, legacy, limitless |

## Links

- npm: https://www.npmjs.com/package/uncurry-x
- Repository: https://github.com/xsfj/uncurry-x
- Homepage: https://github.com/xsfj/uncurry-x#readme
- Issues: https://github.com/xsfj/uncurry-x/issues
- npm.io page: https://npm.io/package/uncurry-x

## Dependencies (3)

- [function.call-x](https://npm.io/package/function.call-x.md) ^1.0.0
- [set-function-length](https://npm.io/package/set-function-length.md) ^1.2.2
- [define-data-property](https://npm.io/package/define-data-property.md) ^1.1.4

## Recent versions

- 1.0.1 (latest) — 2025-12-23
- 1.0.0 — 2025-12-23

## README

# uncurry-x

Creates an uncurried version of a function that takes `this` as the first argument.

## Installation

```bash
npm install uncurry-x
```

## Usage

```javascript
var uncurryThis = require("uncurry-x")

function greet(name) {
  return this.greeting + ", " + name + "!"
}

var greetUnbound = uncurryThis(greet)

var context = { greeting: "Hello" }
greetUnbound(context, "World") // "Hello, World!"

// Works even after Function.prototype methods are deleted
delete Function.prototype.call
delete Function.prototype.bind

greetUnbound(context, "World") // still works!
```

## API

### `uncurryThis(fn)`

Takes a function and returns an uncurried version where `this` becomes the first parameter.

**Parameters:**

- `fn` (Function): The function to uncurry

**Returns:**

- (Function): The uncurried function with `length` set to `originalLength + 1`

### `.apply` helper

The returned function has an `.apply` method that works like `Function.prototype.apply`:

```javascript
var slice = uncurryThis(Array.prototype.slice)

// Using .apply
slice.apply(null, [[10, 20, 30, 40], 1, 3]) // [20, 30]

// Equivalent to:
slice([10, 20, 30, 40], 1, 3) // [20, 30]
```

## Examples

### Array methods

```javascript
var map = uncurryThis(Array.prototype.map)
var join = uncurryThis(Array.prototype.join)

var numbers = [1, 2, 3]
var doubled = map(numbers, function (x) {
  return x * 2
}) // [2, 4, 6]
join(doubled, "-") // "2-4-6"
```

### String methods

```javascript
var split = uncurryThis(String.prototype.split)
var toLowerCase = uncurryThis(String.prototype.toLowerCase)

split("foo-bar-baz", "-") // ["foo", "bar", "baz"]
toLowerCase("HELLO") // "hello"
```

### Custom methods

```javascript
function Counter(start) {
  this.count = start
}

Counter.prototype.increment = function (amount) {
  this.count += amount
  return this.count
}

var increment = uncurryThis(Counter.prototype.increment)
var counter = new Counter(10)

increment(counter, 5) // 15
```

## Features

- ES3 compatible
- Preserves function `length` property correctly
- Works even after `Function.prototype.call` and `Function.prototype.bind` are deleted
- Includes `.apply` helper method
- Uses cached references to native methods for maximum reliability

## License

MIT

---
_Source: https://npm.io/package/uncurry-x · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
