-
Notifications
You must be signed in to change notification settings - Fork 10
/
negate.ts
44 lines (42 loc) · 1.05 KB
/
negate.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
import { Number, Type, Kind } from '..'
/**
* `_$negate` is a type-level function that takes a number type `T`, and returns its negated value.
*
* It returns `-T` if T >= 0, and `T` if T < 0.
*
* @template T - A number type.
*
* @example
* ```ts
* import { Number } from "hkt-toolbelt";
*
* type Result1 = Number._$negate<42>; // -42
* type Result2 = Number._$negate<-42>; // 42
* ```
*/
export type _$negate<
T,
RESULT = T extends 0
? 0
: `${T & Number.Number}` extends `-${infer U extends number}`
? U
: Number._$fromString<`-${T & Number.Number}`>
> = RESULT
/**
* `Negate` is a type-level function that takes a number type `T`, and returns its absolute value.
*
* It returns `-T` if T >= 0, and `T` if T < 0.
*
* @template T - A number type.
*
* @example
* ```ts
* import { Number } from "hkt-toolbelt";
*
* type Result1 = $<Number.Negate, 42>; // -42
* type Result2 = $<Number.Negate, -42>; // 42
* ```
*/
export interface Negate extends Kind.Kind {
f(x: Type._$cast<this[Kind._], Number.Number>): _$negate<typeof x>
}