Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit 2c62e38

Browse files
committed
remove duplicate provable implementation
1 parent 87996f7 commit 2c62e38

File tree

3 files changed

+51
-295
lines changed

3 files changed

+51
-295
lines changed

lib/generic.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type GenericProvable<T, Field> = {
2323
};
2424
interface GenericProvablePure<T, Field> extends GenericProvable<T, Field> {
2525
toFields: (x: T) => Field[];
26-
toAuxiliary: (x?: T) => [];
26+
toAuxiliary: (x?: T) => any[];
2727
fromFields: (x: Field[]) => T;
2828
sizeInFields(): number;
2929
check: (x: T) => void;

lib/provable-generic.ts

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,21 @@ import {
55
GenericProvableExtended,
66
} from './generic.js';
77

8-
export { createProvable, createHashInput, ProvableConstructor };
8+
export {
9+
createProvable,
10+
createHashInput,
11+
ProvableConstructor,
12+
NonMethods,
13+
InferProvable,
14+
InferJson,
15+
InferredProvable,
16+
IsPure,
17+
};
918

1019
type ProvableConstructor<Field> = <A>(
1120
typeObj: A,
1221
options?: { isPure?: boolean }
13-
) => GenericProvableExtended<InferProvable<A, Field>, InferJson<A>, Field>;
22+
) => InferredProvable<A, Field>;
1423

1524
function createProvable<Field>(): ProvableConstructor<Field> {
1625
type ProvableExtended<T, TJson = JSONValue> = GenericProvableExtended<
@@ -26,7 +35,7 @@ function createProvable<Field>(): ProvableConstructor<Field> {
2635
function provable<A>(
2736
typeObj: A,
2837
options?: { isPure?: boolean }
29-
): ProvableExtended<InferProvable<A, Field>, InferJson<A>> {
38+
): InferredProvable<A, Field> {
3039
type T = InferProvable<A, Field>;
3140
type J = InferJson<A>;
3241
let objectKeys =
@@ -182,8 +191,8 @@ function createProvable<Field>(): ProvableConstructor<Field> {
182191
if (Array.isArray(typeObj))
183192
return typeObj.forEach((t, i) => check(t, obj[i]));
184193
if ('check' in typeObj) return typeObj.check(obj);
185-
return (isToplevel ? objectKeys : Object.keys(typeObj)).forEach(
186-
(k) => check(typeObj[k], obj[k])
194+
return (isToplevel ? objectKeys : Object.keys(typeObj)).forEach((k) =>
195+
check(typeObj[k], obj[k])
187196
);
188197
}
189198
if (options?.isPure === true) {
@@ -197,7 +206,7 @@ function createProvable<Field>(): ProvableConstructor<Field> {
197206
toJSON: (obj: T) => toJSON(typeObj, obj, true) as J,
198207
fromJSON: (json: J) => fromJSON(typeObj, json, true),
199208
check: (obj: T) => check(typeObj, obj, true),
200-
};
209+
} satisfies ProvableExtended<T, J> as InferredProvable<A, Field>;
201210
}
202211
return {
203212
sizeInFields: () => sizeInFields(typeObj),
@@ -209,7 +218,7 @@ function createProvable<Field>(): ProvableConstructor<Field> {
209218
toJSON: (obj: T) => toJSON(typeObj, obj, true) as J,
210219
fromJSON: (json: J) => fromJSON(typeObj, json, true),
211220
check: (obj: T) => check(typeObj, obj, true),
212-
};
221+
} satisfies ProvableExtended<T, J> as InferredProvable<A, Field>;
213222
}
214223

215224
return provable;
@@ -240,6 +249,14 @@ type JSONValue =
240249
| Array<JSONValue>
241250
| { [key: string]: JSONValue };
242251

252+
type Struct<T, Field> = GenericProvableExtended<NonMethods<T>, any, Field> &
253+
Constructor<T> & { _isStruct: true };
254+
255+
type NonMethodKeys<T> = {
256+
[K in keyof T]: T[K] extends Function ? never : K;
257+
}[keyof T];
258+
type NonMethods<T> = Pick<T, NonMethodKeys<T>>;
259+
243260
type Constructor<T> = new (...args: any) => T;
244261

245262
type Tuple<T> = [T, ...T[]] | [];
@@ -280,6 +297,8 @@ type InferPrimitiveJson<P extends Primitive> = P extends typeof String
280297

281298
type InferProvable<A, Field> = A extends Constructor<infer U>
282299
? A extends GenericProvable<U, Field>
300+
? U
301+
: A extends Struct<U, Field>
283302
? U
284303
: InferProvableBase<A, Field>
285304
: InferProvableBase<A, Field>;
@@ -333,3 +352,13 @@ type IsPureBase<A, Field> = A extends GenericProvablePure<any, Field>
333352
[K in keyof A]: IsPure<A[K], Field>;
334353
}[keyof A]
335354
: false;
355+
356+
type GenericProvableExtendedPure<T, TJson, Field> = GenericProvablePure<
357+
T,
358+
Field
359+
> &
360+
GenericProvableExtended<T, TJson, Field>;
361+
362+
type InferredProvable<A, Field> = IsPure<A, Field> extends true
363+
? GenericProvableExtendedPure<InferProvable<A, Field>, InferJson<A>, Field>
364+
: GenericProvableExtended<InferProvable<A, Field>, InferJson<A>, Field>;

0 commit comments

Comments
 (0)