-
Notifications
You must be signed in to change notification settings - Fork 0
/
Float.ts
81 lines (69 loc) · 2.58 KB
/
Float.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { IntervalCreationOptions, ListCreationOptions, ValueObject } from '../ValueObject';
/** A floating point number. */
export class Float extends ValueObject<number> {
constructor(value: number) {
super(value);
}
public equals(obj: Float | number): boolean {
return (obj instanceof Float ? obj.value : obj) === this._value;
}
// VALIDATION #################################################################################
/**
* @param value to be validated as a float with the corresponding constraints (options)
* @param options constraints the value has to fulfill
* @returns the value if the validation was successful
* @throws {@link TypeError} if not a valid number
* @throws {@link RangeError} if the value is not inside the interval
*/
public static validate(value: number, options?: FloatOptions): number {
this.validateNumber(value, options);
if (options) {
this.validateInterval(value, options);
}
return value;
}
/**
* @param value to be validated as a valid number (not NaN)
* @param options constraints the value has to fulfill
*/
protected static validateNumber(value: number, options?: FloatOptions): void {
if (typeof value !== 'number') {
throw new TypeError(
`${this.prefix(options)}the given value (${value}: ${typeof value}) must be a number!`
);
}
if (isNaN(value)) {
throw new TypeError(
`${this.prefix(options)}the given value (${value}: ${typeof value}) is not a number (NaN)!`
);
}
}
// CREATION ###################################################################################
/**
* @param value to create the ValueObject of
* @param options constraints the value has to fulfill
* @returns the created ValueObject
*/
public static create(value: number, options?: FloatOptions): Float {
return new Float(this.validate(value, options));
}
/**
* @param values an array of primitives to map to an array of ValueObjects
* @param options constraints the values / list has to fulfill
* @returns the array of ValueObjects
*/
public static fromList(
values: number[] | undefined,
options?: FloatOptions & ListCreationOptions
): Float[] {
return this.validateList(values, options) ? values.map((val) => this.create(val, options)) : [];
}
/**
* @param values an array of ValueObjects to map to an array of their values
* @returns the array of values
*/
public static toList(values: Float[]): number[] {
return values.map((pi) => pi.value);
}
}
export type FloatOptions = IntervalCreationOptions;