# wrap (Lodash 互換性)

::: warning 高階関数を使用してください

この `wrap` 関数は、単に関数をラップする機能です。ほとんどの場合、よりシンプルな高階関数やクロージャを使用する方が明確です。

代わりに、より高速で現代的なクロージャや直接的な関数定義を使用してください。

:::

与えられた値または関数をラップする新しい関数を作成します。

```typescript
const wrappedFunc = wrap(value, wrapper);
```

## 使用法

### `wrap(value, wrapper)`

値や関数に追加のロジックを適用したい場合は、`wrap` を使用してください。元の値を最初の引数として受け取るラッパー関数を通じて、新しい動作を定義できます。

```typescript
import { wrap } from 'es-toolkit/compat';

// 関数をラップしてログ機能を追加
const greet = (name: string) => `Hi, ${name}`;
const loggedGreet = wrap(greet, (originalFunc, name) => {
  const result = originalFunc(name);
  console.log(`[LOG] ${result}`);
  return result;
});

loggedGreet('Alice'); // コンソールに "[LOG] Hi, Alice" を出力し、"Hi, Alice" を返します
```

関数でない値もラップできます。値はラッパー関数の最初の引数として渡されます。

```typescript
import { wrap } from 'es-toolkit/compat';

// 文字列を HTML タグでラップする関数を作成
const htmlWrapper = wrap('Hello World', (text, tag) => `<${tag}>${text}</${tag}>`);
console.log(htmlWrapper('h1')); // "<h1>Hello World</h1>"

// 数値を計算に使用する関数を作成
const calculate = wrap(10, (baseValue, multiplier) => baseValue * multiplier);
console.log(calculate(5)); // 50
```

より複雑な関数ラッピングの例です。

```typescript
import { wrap } from 'es-toolkit/compat';

const add = (a: number, b: number) => a + b;

// パフォーマンス測定を追加した関数を作成
const timedAdd = wrap(add, (originalAdd, a, b) => {
  const start = Date.now();
  const result = originalAdd(a, b);
  const end = Date.now();
  console.log(`実行時間: ${end - start}ms`);
  return result;
});

timedAdd(3, 7); // 実行時間をコンソールに出力し、10 を返します
```

#### パラメータ

- `value` (`T`): ラップする値または関数です。
- `wrapper` (`(value: T, ...args: U[]) => V`): 元の値を最初の引数として受け取り、追加のロジックを適用する関数です。

#### 戻り値

(`(...args: U[]) => V`): ラッパー関数が適用された新しい関数を返します。
