/
only.ts
53 lines (48 loc) · 1.34 KB
/
only.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import type { IterableContainer } from "./_types";
import { purry } from "./purry";
type Only<T extends IterableContainer> = T extends
| readonly [...Array<unknown>, unknown, unknown]
| readonly []
| readonly [unknown, ...Array<unknown>, unknown]
| readonly [unknown, unknown, ...Array<unknown>]
? undefined
: T extends readonly [unknown]
? T[number]
: T[number] | undefined;
/**
* Returns the first and only element of `array`, or undefined otherwise.
*
* @param array - The target array.
* @signature
* R.only(array)
* @example
* R.only([]) // => undefined
* R.only([1]) // => 1
* R.only([1, 2]) // => undefined
* @dataFirst
* @pipeable
* @category Array
*/
export function only<T extends IterableContainer>(array: Readonly<T>): Only<T>;
/**
* Returns the first and only element of `array`, or undefined otherwise.
*
* @signature
* R.only()(array)
* @example
* R.pipe([], R.only()); // => undefined
* R.pipe([1], R.only()); // => 1
* R.pipe([1, 2], R.only()); // => undefined
* @dataLast
* @pipeable
* @category Array
*/
export function only<T extends IterableContainer>(): (
array: Readonly<T>,
) => Only<T>;
export function only(): unknown {
return purry(_only, arguments);
}
function _only<T>(array: ReadonlyArray<T>): T | undefined {
return array.length === 1 ? array[0] : undefined;
}