import { Binable } from './binable.js'; export { GenericProvable, GenericProvablePure, GenericProvableExtended, GenericField, GenericBool, GenericHashInput, primitiveTypes, primitiveTypeMap, EmptyNull, EmptyUndefined, EmptyVoid, }; type GenericProvable = { toFields: (x: T) => Field[]; toAuxiliary: (x?: T) => any[]; fromFields: (x: Field[], aux: any[]) => T; sizeInFields(): number; check: (x: T) => void; }; interface GenericProvablePure extends GenericProvable { toFields: (x: T) => Field[]; toAuxiliary: (x?: T) => []; fromFields: (x: Field[]) => T; sizeInFields(): number; check: (x: T) => void; } type GenericProvableExtended = GenericProvable & { toInput: (x: T) => { fields?: Field[]; packed?: [Field, number][] }; toJSON: (x: T) => TJson; fromJSON: (x: TJson) => T; emptyValue?: () => T; }; type GenericField = ((value: number | string | bigint) => Field) & GenericProvableExtended & Binable & { sizeInBytes(): number }; type GenericBool = ((value: boolean) => Bool) & GenericProvableExtended & Binable & { sizeInBytes(): number }; type GenericHashInput = { fields?: Field[]; packed?: [Field, number][] }; const emptyType = { sizeInFields: () => 0, toFields: () => [], toAuxiliary: (): [] => [], fromFields: () => null, check: () => {}, toInput: () => ({}), toJSON: () => null, fromJSON: () => null, }; const undefinedType = { ...emptyType, fromFields: () => undefined, toJSON: () => null, fromJSON: () => undefined, }; let primitiveTypes = new Set(['number', 'string', 'null']); function EmptyNull(): GenericProvableExtended & GenericProvablePure { return emptyType; } function EmptyUndefined(): GenericProvableExtended< undefined, null, Field > & GenericProvablePure { return undefinedType; } function EmptyVoid(): GenericProvableExtended & GenericProvablePure { return undefinedType; } function primitiveTypeMap(): { number: GenericProvableExtended; string: GenericProvableExtended; null: GenericProvableExtended; } { return primitiveTypeMap_; } const primitiveTypeMap_: { number: GenericProvableExtended; string: GenericProvableExtended; null: GenericProvableExtended; } = { number: { ...emptyType, toAuxiliary: (value = 0) => [value], toJSON: (value) => value, fromJSON: (value) => value, fromFields: (_, [value]) => value, }, string: { ...emptyType, toAuxiliary: (value = '') => [value], toJSON: (value) => value, fromJSON: (value) => value, fromFields: (_, [value]) => value, }, null: emptyType, };