Skip to content

Commit

Permalink
move away from ValuEType class and just to an interface.
Browse files Browse the repository at this point in the history
  • Loading branch information
bhouston committed Apr 5, 2023
1 parent a004cab commit 8235440
Show file tree
Hide file tree
Showing 13 changed files with 118 additions and 111 deletions.
16 changes: 9 additions & 7 deletions packages/core/src/Profiles/Core/Values/BooleanValue.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { ValueType } from '../../../Values/ValueType';

export const BooleanValue = new ValueType(
'boolean',
() => false,
(value: string | boolean) =>
export const BooleanValue: ValueType = {
name: 'boolean',
creator: () => false,
deserialize: (value: string | boolean) =>
typeof value === 'string' ? value.toLowerCase() === 'true' : value,
(value: boolean) => value,
(start: boolean, end: boolean, t: number) => (t < 0.5 ? start : end)
);
serialize: (value: boolean) => value,
lerp: (start: boolean, end: boolean, t: number) => (t < 0.5 ? start : end),
equals: (a: boolean, b: boolean) => a === b,
clone: (value: boolean) => value
};
16 changes: 9 additions & 7 deletions packages/core/src/Profiles/Core/Values/FloatValue.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { parseSafeFloat } from '../../../parseFloats';
import { ValueType } from '../../../Values/ValueType';

export const FloatValue = new ValueType(
'float',
() => 0,
(value: string | number) =>
export const FloatValue: ValueType = {
name: 'float',
creator: () => 0,
deserialize: (value: string | number) =>
typeof value === 'string' ? parseSafeFloat(value, 0) : value,
(value: number) => value,
(start: number, end: number, t: number) => start * (1 - t) + end * t
);
serialize: (value: number) => value,
lerp: (start: number, end: number, t: number) => start * (1 - t) + end * t,
equals: (a: number, b: number) => a === b,
clone: (value: number) => value
};
18 changes: 10 additions & 8 deletions packages/core/src/Profiles/Core/Values/IntegerValue.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import { ValueType } from '../../../Values/ValueType';

export const IntegerValue = new ValueType(
'integer',
() => BigInt(0),
(value: string | number): bigint => BigInt(value),
(value: bigint) =>
export const IntegerValue: ValueType = {
name: 'integer',
creator: () => BigInt(0),
deserialize: (value: string | number): bigint => BigInt(value),
serialize: (value: bigint) =>
Number.MIN_SAFE_INTEGER <= value && value <= Number.MAX_SAFE_INTEGER
? Number(value)
: value.toString(), // prefer string to ensure full range is covered

(start: bigint, end: bigint, t: number) =>
BigInt(Number(start) * (1 - t) + Number(end) * t)
);
lerp: (start: bigint, end: bigint, t: number) =>
BigInt(Number(start) * (1 - t) + Number(end) * t),
equals: (a: bigint, b: bigint) => a === b,
clone: (value: bigint) => value
};
18 changes: 9 additions & 9 deletions packages/core/src/Profiles/Core/Values/StringValue.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { ValueType } from '../../../Values/ValueType';

export const StringValue = new ValueType(
'string',
() => '',
(value: string) => value,
(value: string) => value,
(start: string, end: string, t: number) => (t < 0.5 ? start : end),
(a: string, b: string) => a === b,
(value: string) => value
);
export const StringValue: ValueType = {
name: 'string',
creator: () => '',
deserialize: (value: string) => value,
serialize: (value: string) => value,
lerp: (start: string, end: string, t: number) => (t < 0.5 ? start : end),
equals: (a: string, b: string) => a === b,
clone: (value: string) => value
};
18 changes: 9 additions & 9 deletions packages/core/src/Profiles/Scene/Values/ColorValue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ import {
vec3Parse
} from './Internal/Vec3';

export const ColorValue = new ValueType(
'color',
() => new Vec3(),
(value: string | Vec3JSON) =>
export const ColorValue: ValueType = {
name: 'color',
creator: () => new Vec3(),
deserialize: (value: string | Vec3JSON) =>
typeof value === 'string'
? vec3Parse(value)
: new Vec3(value[0], value[1], value[2]),
(value) => [value.x, value.y, value.z] as Vec3JSON,
(start: Vec3, end: Vec3, t: number) => vec3Mix(start, end, t),
(a: Vec3, b: Vec3) => vec3Equals(a, b),
(value: Vec3) => value.clone()
);
serialize: (value) => [value.x, value.y, value.z] as Vec3JSON,
lerp: (start: Vec3, end: Vec3, t: number) => vec3Mix(start, end, t),
equals: (a: Vec3, b: Vec3) => vec3Equals(a, b),
clone: (value: Vec3) => value.clone()
};
18 changes: 9 additions & 9 deletions packages/core/src/Profiles/Scene/Values/EulerValue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ import {
vec3Parse
} from './Internal/Vec3';

export const EulerValue = new ValueType(
'euler',
() => new Vec3(),
(value: string | Vec3JSON) =>
export const EulerValue: ValueType = {
name: 'euler',
creator: () => new Vec3(),
deserialize: (value: string | Vec3JSON) =>
typeof value === 'string'
? vec3Parse(value)
: new Vec3(value[0], value[1], value[2]),
(value) => [value.x, value.y, value.z] as Vec3JSON,
(start: Vec3, end: Vec3, t: number) => vec3Mix(start, end, t),
(a: Vec3, b: Vec3) => vec3Equals(a, b),
(value: Vec3) => value.clone()
);
serialize: (value) => [value.x, value.y, value.z] as Vec3JSON,
lerp: (start: Vec3, end: Vec3, t: number) => vec3Mix(start, end, t),
equals: (a: Vec3, b: Vec3) => vec3Equals(a, b),
clone: (value: Vec3) => value.clone()
};
18 changes: 9 additions & 9 deletions packages/core/src/Profiles/Scene/Values/Mat3Value.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ import {
mat3Parse
} from './Internal/Mat3';

export const Mat3Value = new ValueType(
'mat3',
() => new Mat3(),
(value: string | Mat3JSON) =>
export const Mat3Value: ValueType = {
name: 'mat3',
creator: () => new Mat3(),
deserialize: (value: string | Mat3JSON) =>
typeof value === 'string' ? mat3Parse(value) : new Mat3(value),
(value) => value.elements as Mat3JSON,
(start: Mat3, end: Mat3, t: number) => mat3Mix(start, end, t),
(a: Mat3, b: Mat3) => mat3Equals(a, b),
(value: Mat3) => value.clone()
);
serialize: (value) => value.elements as Mat3JSON,
lerp: (start: Mat3, end: Mat3, t: number) => mat3Mix(start, end, t),
equals: (a: Mat3, b: Mat3) => mat3Equals(a, b),
clone: (value: Mat3) => value.clone()
};
18 changes: 9 additions & 9 deletions packages/core/src/Profiles/Scene/Values/Mat4Value.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ import {
mat4Parse
} from './Internal/Mat4';

export const Mat4Value = new ValueType(
'mat4',
() => new Mat4(),
(value: string | Mat4JSON) =>
export const Mat4Value: ValueType = {
name: 'mat4',
creator: () => new Mat4(),
deserialize: (value: string | Mat4JSON) =>
typeof value === 'string' ? mat4Parse(value) : new Mat4(value),
(value) => value.elements as Mat4JSON,
(start: Mat4, end: Mat4, t: number) => mat4Mix(start, end, t),
(a: Mat4, b: Mat4) => mat4Equals(a, b),
(value: Mat4) => value.clone()
);
serialize: (value) => value.elements as Mat4JSON,
lerp: (start: Mat4, end: Mat4, t: number) => mat4Mix(start, end, t),
equals: (a: Mat4, b: Mat4) => mat4Equals(a, b),
clone: (value: Mat4) => value.clone()
};
18 changes: 9 additions & 9 deletions packages/core/src/Profiles/Scene/Values/QuatValue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ import {
vec4Parse
} from './Internal/Vec4';

export const QuatValue = new ValueType(
'quat',
() => new Vec4(),
(value: string | Vec4JSON) =>
export const QuatValue: ValueType = {
name: 'quat',
creator: () => new Vec4(),
deserialize: (value: string | Vec4JSON) =>
typeof value === 'string'
? vec4Parse(value)
: new Vec4(value[0], value[1], value[2], value[3]),
(value) => [value.x, value.y, value.z, value.w] as Vec4JSON,
(start: Vec4, end: Vec4, t: number) => quatSlerp(start, end, t),
(a: Vec4, b: Vec4) => vec4Equals(a, b),
(value: Vec4) => value.clone()
);
serialize: (value) => [value.x, value.y, value.z, value.w] as Vec4JSON,
lerp: (start: Vec4, end: Vec4, t: number) => quatSlerp(start, end, t),
equals: (a: Vec4, b: Vec4) => vec4Equals(a, b),
clone: (value: Vec4) => value.clone()
};
16 changes: 9 additions & 7 deletions packages/core/src/Profiles/Scene/Values/Vec2Value.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { ValueType } from '../../../Values/ValueType';
import { Vec2, Vec2JSON, vec2Mix, vec2Parse } from './Internal/Vec2';

export const Vec2Value = new ValueType(
'vec2',
() => new Vec2(),
(value: string | Vec2JSON) =>
export const Vec2Value: ValueType = {
name: 'vec2',
creator: () => new Vec2(),
deserialize: (value: string | Vec2JSON) =>
typeof value === 'string' ? vec2Parse(value) : new Vec2(value[0], value[1]),
(value) => [value.x, value.y] as Vec2JSON,
(start: Vec2, end: Vec2, t: number) => vec2Mix(start, end, t)
);
serialize: (value) => [value.x, value.y] as Vec2JSON,
lerp: (start: Vec2, end: Vec2, t: number) => vec2Mix(start, end, t),
equals: (a: Vec2, b: Vec2) => a.x === b.x && a.y === b.y,
clone: (value: Vec2) => value.clone()
};
18 changes: 9 additions & 9 deletions packages/core/src/Profiles/Scene/Values/Vec3Value.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ import {
vec3Parse
} from './Internal/Vec3';

export const Vec3Value = new ValueType(
'vec3',
() => new Vec3(),
(value: string | Vec3JSON) =>
export const Vec3Value: ValueType = {
name: 'vec3',
creator: () => new Vec3(),
deserialize: (value: string | Vec3JSON) =>
typeof value === 'string'
? vec3Parse(value)
: new Vec3(value[0], value[1], value[2]),
(value) => [value.x, value.y, value.z] as Vec3JSON,
(start: Vec3, end: Vec3, t: number) => vec3Mix(start, end, t),
(a: Vec3, b: Vec3) => vec3Equals(a, b),
(value: Vec3) => value.clone()
);
serialize: (value) => [value.x, value.y, value.z] as Vec3JSON,
lerp: (start: Vec3, end: Vec3, t: number) => vec3Mix(start, end, t),
equals: (a: Vec3, b: Vec3) => vec3Equals(a, b),
clone: (value: Vec3) => value.clone()
};
18 changes: 9 additions & 9 deletions packages/core/src/Profiles/Scene/Values/Vec4Value.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ import {
vec4Parse
} from './Internal/Vec4';

export const Vec4Value = new ValueType(
'vec4',
() => new Vec4(),
(value: string | Vec4JSON) =>
export const Vec4Value: ValueType = {
name: 'vec4',
creator: () => new Vec4(),
deserialize: (value: string | Vec4JSON) =>
typeof value === 'string'
? vec4Parse(value)
: new Vec4(value[0], value[1], value[2], value[3]),
(value) => [value.x, value.y, value.z, value.w] as Vec4JSON,
(start: Vec4, end: Vec4, t: number) => vec4Mix(start, end, t),
(a: Vec4, b: Vec4) => vec4Equals(a, b),
(value: Vec4) => value.clone()
);
serialize: (value) => [value.x, value.y, value.z, value.w] as Vec4JSON,
lerp: (start: Vec4, end: Vec4, t: number) => vec4Mix(start, end, t),
equals: (a: Vec4, b: Vec4) => vec4Equals(a, b),
clone: (value: Vec4) => value.clone()
};
19 changes: 9 additions & 10 deletions packages/core/src/Values/ValueType.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
export class ValueType<TValue = any, TJson = any> {
constructor(
public readonly name: string,
public readonly creator: () => TValue,
public readonly deserialize: (value: TJson) => TValue,
public readonly serialize: (value: TValue) => TJson,
public readonly lerp: (start: TValue, end: TValue, t: number) => TValue,
public readonly equals: (a: TValue, b: TValue) => boolean,
public readonly clone: (value: TValue) => TValue
) {}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export interface ValueType<TValue = any, TJson = any> {
name: string;
creator: () => TValue;
deserialize: (value: TJson) => TValue;
serialize: (value: TValue) => TJson;
lerp: (start: TValue, end: TValue, t: number) => TValue;
equals: (a: TValue, b: TValue) => boolean;
clone: (value: TValue) => TValue;
}

0 comments on commit 8235440

Please sign in to comment.