Skip to content

Commit

Permalink
Stop using temporal heap allocated variables
Browse files Browse the repository at this point in the history
  • Loading branch information
gabrielricardourbina committed Aug 27, 2023
1 parent d38687f commit 3de9bfe
Show file tree
Hide file tree
Showing 7 changed files with 93 additions and 26 deletions.
24 changes: 19 additions & 5 deletions src/array-of.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,25 @@ const ArrayOf = <
>(
guards: G | ((self: NonCallable<Guard<T>>) => G)
): Guard<T> => {
const isArrayOf = (value: unknown): value is T => {
return (
isArray(value) &&
value.every((value) => generatedGuards.some((guard) => guard(value)))
);
const isArrayOf = (arr: unknown): arr is T => {
if(!isArray(arr)){
return false;
}
for (let i = 0; i < arr.length; i++) {
const value = arr[i];
let valuePasses = false;
for (let i = 0; i < generatedGuards.length; i++) {
const guard = generatedGuards[i]!;
if (guard(value)) {
valuePasses = true;
break;
}
}
if (!valuePasses) {
return false;
}
}
return true
};

const generatedGuards =
Expand Down
8 changes: 7 additions & 1 deletion src/instance-of.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,13 @@ const InstanceOf = <
constructors: C
): Guard<T> => {
return (value: unknown): value is T => {
return constructors.some((constructor) => value instanceof constructor);
for (let i = 0; i < constructors.length; i++) {
const constructor = constructors[i]!;
if(value instanceof constructor){
return true
}
}
return false
};
};

Expand Down
24 changes: 18 additions & 6 deletions src/object-of.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,25 @@ const ObjectOf = <
>(
guards: G | ((self: NonCallable<Guard<T>>) => G)
): Guard<T> => {
const isObjectOf = (obj: unknown): obj is T =>
isObject(obj) &&
Object.entries(generatedGuards).every(([key, guard]) =>
guard.optional
const isObjectOf = (obj: unknown): obj is T => {
if (!isObject(obj)) {
return false;
}
for (const key in generatedGuards) {
if (!generatedGuards.hasOwnProperty(key)) {
break;
}
const guard = generatedGuards[key]!;
const passes = guard.optional
? obj[key] === undefined || guard(obj[key])
: key in obj && guard(obj[key])
);
: key in obj && guard(obj[key]);

if (!passes) {
return false;
}
}
return true;
};

const generatedGuards =
typeof guards === "function"
Expand Down
8 changes: 7 additions & 1 deletion src/one-of.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,13 @@ const OneOf = <
guards: G | ((self: NonCallable<Guard<T>>) => G)
): Guard<T> => {
const isOneOf = (value: unknown): value is T => {
return generatedGuards.some((guard) => guard(value));
for (let i = 0; i < generatedGuards.length; i++) {
const guard = generatedGuards[i]!;
if (guard(value)) {
return true
}
}
return false;
};

const generatedGuards =
Expand Down
26 changes: 22 additions & 4 deletions src/record-of.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,28 @@ const RecordOf = <
guards: G | ((self: NonCallable<Guard<T>>) => G)
): Guard<T> => {
const isRecordOf = (rec: unknown): rec is T => {
return (
isObject(rec) &&
Object.values(rec).every((v) => generatedGuards.some((guard) => guard(v)))
);
if (!isObject(rec)) {
return false;
}

for (const key in rec) {
if (!rec.hasOwnProperty(key)) {
break;
}
const value = rec[key];
let valuePasses = false;
for (let i = 0; i < generatedGuards.length; i++) {
const guard = generatedGuards[i]!;
if (guard(value)) {
valuePasses = true;
break;
}
}
if (!valuePasses) {
return false;
}
}
return true;
};

const generatedGuards =
Expand Down
21 changes: 13 additions & 8 deletions src/tuple-of.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,19 @@ const TupleOf = <
| ((self: NonCallable<Guard<T>>) => OptionalRequiredGuards<G>)
): Guard<T> => {
const isTupleOf = (tuple: unknown): tuple is T => {
return (
isArray(tuple) &&
tuple.length <= generatedGuards.length &&
generatedGuards.every(
(guard, i) =>
(guard.optional && tuple[i] === undefined) || guard(tuple[i])
)
);
if(!isArray(tuple) || tuple.length > generatedGuards.length){
return false;
}

for (let i = 0; i < generatedGuards.length; i++) {
const guard = generatedGuards[i]!;

const passes = (guard.optional && tuple[i] === undefined) || guard(tuple[i])
if(!passes){
return false
}
}
return true;
};

const generatedGuards =
Expand Down
8 changes: 7 additions & 1 deletion src/value-of.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@ const ValueOf = <const G extends readonly any[] | any[]>(
expectedValues: G
): Guard<G[number]> => {
return (value: unknown): value is G[number] => {
return expectedValues.some((expected) => value === expected);
for (let i = 0; i < expectedValues.length; i++) {
const expected = expectedValues[i];
if(value === expected) {
return true
}
}
return false;
};
};

Expand Down

0 comments on commit 3de9bfe

Please sign in to comment.