Skip to content

Commit

Permalink
Clone Optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
sinclairzx81 committed Apr 25, 2024
1 parent 7da77f0 commit 976ffa5
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 17 deletions.
20 changes: 8 additions & 12 deletions example/index.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
import { Type } from '@sinclair/typebox'
import { Value } from '@sinclair/typebox/value'

const T = Type.Transform(
Type.Object({
x: Type.Number(),
y: Type.Number(),
z: Type.Number(),
}),
)
.Decode((value) => value)
.Encode((value) => value)
const T = Type.Object({
x: Type.Number(),
y: Type.Number(),
z: Type.Number(),
})

const S = Date.now()
for (let i = 0; i < 1_000_000; i++) {
const R = Value.Decode(T, { x: 1, y: 2, z: 3 })
Value.Encode(T, R)
for (let i = 0; i < 1; i++) {
console.log('-----------------------------------')
Type.Composite([T, T, T])
}
console.log(Date.now() - S)
8 changes: 5 additions & 3 deletions src/type/deref/deref.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ export type TFromRest<T extends TSchema[], Acc extends TSchema[] = []> = (
? TFromRest<R, [...Acc, TDeref<L>]>
: Acc
)
function FromRest(schema: TSchema[], references: TSchema[]) {
return schema.map((schema) => Deref(schema, references))
function FromRest<T extends TSchema[]>(schema: [...T], references: TSchema[]): TFromRest<T> {
return schema.map((schema) => Deref(schema, references)) as never
}
// ------------------------------------------------------------------
// FromProperties
Expand All @@ -69,7 +69,9 @@ type FromProperties<T extends TProperties> = Evaluate<{
// prettier-ignore
function FromProperties(properties: TProperties, references: TSchema[]) {
const Acc = {} as TProperties
for(const K of globalThis.Object.getOwnPropertyNames(properties)) Acc[K] = Deref(properties[K], references)
for(const K of globalThis.Object.getOwnPropertyNames(properties)) {
Acc[K] = Deref(properties[K], references)
}
return Acc as never
}
// prettier-ignore
Expand Down
10 changes: 8 additions & 2 deletions src/value/clone/clone.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,14 @@ import { IsArray, IsDate, IsStandardObject, IsTypedArray, IsValueType } from '..
// Clonable
// ------------------------------------------------------------------
function ObjectType(value: ObjectType): any {
const keys = [...Object.getOwnPropertyNames(value), ...Object.getOwnPropertySymbols(value)]
return keys.reduce((acc, key) => ({ ...acc, [key]: Clone(value[key]) }), {})
const Acc = {} as Record<PropertyKey, unknown>
for (const key of Object.getOwnPropertyNames(value)) {
Acc[key] = Clone(value[key])
}
for (const key of Object.getOwnPropertySymbols(value)) {
Acc[key] = Clone(value[key])
}
return Acc
}
function ArrayType(value: ArrayType): any {
return value.map((element: any) => Clone(element))
Expand Down

0 comments on commit 976ffa5

Please sign in to comment.