This commit is contained in:
Rowan 2025-05-15 14:25:30 -05:00
parent 0b3dabddde
commit 7116abb2ee
2 changed files with 4 additions and 433 deletions

View file

@ -1,400 +1,4 @@
//export type Nullable<T> = T | undefined
//
//function staticImplements<T>() {
// return <U extends T>(constructor: U) => { constructor }
//}
//
//@staticImplements<Deserialize<any>>()
//class GenericSeed<T> implements Deserialize<T> {
// static deserialize<T, D extends Deserializer>(deserializer: D): T {
// return deserializer.deserializeAny(new GenericVisitor<T>())
// }
//
// deserialize<D extends Deserializer>(deserializer: D): T {
// return GenericSeed.deserialize(deserializer)
// }
//}
//
//class GenericVisitor<T> implements Visitor<T> {
// visitString(value: string): T {
// return value as T
// }
//
// visitNumber(value: number): T {
// return value as T
// }
//
// visitBigInt(value: bigint): T {
// return value as T
// }
//
// visitBoolean(value: boolean): T {
// return value as T
// }
//
// visitSymbol(value: symbol): T {
// return value as T
// }
//
// visitNull(): T {
// return null as T
// }
//
// visitObject(access: MapAccess): T {
// const result: Record<PropertyKey, any> = {}
// let entry
//
// while ((entry = access.nextEntry<string, any>())) {
// result[entry[0]] = entry[1]
// }
//
// return result
// }
//
// visitFunction?(value: Function): T {
// return value as T
// }
//
// visitMap?(access: MapAccess): T {
// const result = new Map()
// let entry
//
// while ((entry = access.nextEntry<string, any>())) {
// result.set(entry[0], entry[1])
// }
//
// return result as T
// }
//
// visitIterable?(access: IterableAccess): T {
// const result = new Array(access.sizeHint())
// let element
//
// while ((element = access.nextElement())) {
// result.push(element)
// }
//
// return result as T
// }
//
// visitClass?(_name: string, _fields: string[], _value: any): T {
// throw new Error("Method not implemented.")
// }
//}
//
//export abstract class MapAccess {
// abstract nextKeySeed<T, K extends Deserialize<T>>(seed: K): Nullable<T>
// abstract nextValueSeed<T, V extends Deserialize<T>>(seed: V): Nullable<T>
//
// nextEntrySeed<TK, TV, K extends Deserialize<TK>, V extends Deserialize<TV>>(kseed: K, vseed: V): Nullable<[TK, TV]> {
// const key = this.nextKeySeed(kseed) as Nullable<TK>
// if (key) {
// const value = this.nextValueSeed(vseed) as Nullable<TV>
//
// if (value) {
// return [key, value]
// }
// }
// }
//
// nextKey<T>(): Nullable<T> {
// return this.nextValueSeed(GenericSeed<T>)
// }
//
// nextValue<T>(): Nullable<T> {
// return this.nextValueSeed(GenericSeed<T>)
// }
//
// nextEntry<K, V>(): Nullable<[K, V]> {
// return this.nextEntrySeed(GenericSeed<K>, GenericSeed<V>)
// }
//}
//
//export abstract class IterableAccess {
// abstract nextElementSeed<T, I extends Deserialize<T>>(seed: I): Nullable<T>
//
// nextElement<T>(): Nullable<T> {
// return this.nextElementSeed(GenericSeed<T>)
// }
//
// sizeHint(): number { return 0 }
//}
//
//export interface ObjectSerializer<T = void> {
// serializeKey<U extends Serializable>(key: U): T
// serializeValue<U extends Serializable>(value: U): T
// end(): T
//}
//
//export interface IterableSerializer<T = void> {
// serializeElement<U extends Serializable>(element: U): T
// end(): T
//}
//
//export interface ClassSerializer<T = void> {
// serializeField<U extends Serializable>(name: PropertyKey, value: U): T
// end(): T
//}
//
//const TypeSerializerMethods = [
// 'serializeString',
// 'serializeNumber',
// 'serializeBigInt',
// 'serializeBoolean',
// 'serializeSymbol',
// 'serializeMap',
// 'serializeIterable',
// 'serializeNull',
// 'serializeObject',
// 'serializeInstance',
// 'serializeFunction'
//] as const
//
//interface TypeSerializer<T> {
// serializeString(value: string): T
// serializeNumber(value: number): T
// serializeBigInt(value: bigint): T
// serializeBoolean(value: boolean): T
// serializeSymbol(value: Symbol): T
// serializeNull(): T
// serializeObject(): ObjectSerializer<T>
// serializeFunction?(value: Function): T
// serializeMap?(): ObjectSerializer<T>
// serializeIterable?(): IterableSerializer<T>
// serializeClass?(name: PropertyKey): ClassSerializer<T>
//}
//
//const AnySerializerMethods = ['serializeAny']
//
//interface AnySerializer<T> {
// serializeAny?(value?: any): T
//}
//
//function isGenericSerializer(value: any): boolean {
// return AnySerializerMethods.every(k => isFunction(value[k])) &&
// TypeSerializerMethods.every(k => !isFunction(value[k]))
//}
//
//function isPlainObject(value: any): boolean {
// return Object.getPrototypeOf(value) === Object.prototype
//}
//
//function isFunction(value: any): value is Function {
// return value != null && typeof value === 'function'
//}
//
//function isIterable(value: any): value is Iterable<any> {
// return isFunction(value[Symbol.iterator])
//}
//
//export type Serializer<T> = Partial<TypeSerializer<T>> & Partial<AnySerializer<T>>
//
//export interface Visitor<T> {
// visitString(value: string): T
// visitNumber(value: number): T
// visitBigInt(value: bigint): T
// visitBoolean(value: boolean): T
// visitSymbol(value: symbol): T
// visitNull(): T
// visitObject(value: MapAccess): T
// visitFunction?(value: Function): T
// visitMap?(value: MapAccess): T
// visitIterable?(value: IterableAccess): T
// visitClass?(name: string, fields: string[], value: any): T
//}
//
//export interface Deserializer {
// deserializeAny<T, V extends Visitor<T>>(visitor: V): T
// deserializeString<T, V extends Visitor<T>>(visitor: V): T
// deserializeNumber<T, V extends Visitor<T>>(visitor: V): T
// deserializeBigInt<T, V extends Visitor<T>>(visitor: V): T
// deserializeBoolean<T, V extends Visitor<T>>(visitor: V): T
// deserializeSymbol<T, V extends Visitor<T>>(visitor: V): T
// deserializeNull<T, V extends Visitor<T>>(visitor: V): T
// deserializeObject<T, V extends Visitor<T>>(visitor: V): T
// deserializeFunction?<T, V extends Visitor<T>>(visitor: V): T
// deserializeMap?<T, V extends Visitor<T>>(visitor: V): T
// deserializeIterable?<T, V extends Visitor<T>>(visitor: V): T
// deserializeClass?<T, V extends Visitor<T>>(name: string, fields: string[], visitor: V): T
//}
//
//export type Primitive = string | number | boolean | symbol | bigint | null | undefined
//export interface ToString {
// toString(): string
//}
//
//export interface Serialize {
// serialize<T, S extends Serializer<T>>(serializer: S): T
//}
//
//export type Serializable = Primitive | ToString | Serialize
//
//export interface Deserialize<T> {
// deserialize<D extends Deserializer>(deserializer: D): T
//}
//
//type Constructor = new (...args: any[]) => object
//
//export const CaseConvention = Object.freeze({
// Lowercase: 0,
// Uppercase: 1,
// PascalCase: 2,
// CamelCase: 3,
// SnakeCase: 4,
// ScreamingSnakeCase: 5,
// KebabCase: 6,
// ScreamingKebabCase: 7
//} as const)
//
//export type CaseConvention = typeof CaseConvention[keyof typeof CaseConvention]
//
//function orElse(thisArg: any, a: Nullable<Function>, b: Function) {
// return function(...args: any) {
// const fn = a != null ? a : b
// return fn.apply(thisArg, args)
// }
//}
//
//// helper for better ergonomics
//// allows us to capture this, the fallback method, and the args in a closure
//function ifNull(thisArg: any, b: Function, ...args: any) {
// return function(a: Nullable<Function>) {
// return orElse(thisArg, a, b).call(thisArg, args)
// }
//}
//
//const unhandledType = (serializer: any, value: any) => new TypeError(`"${serializer.constructor.name}" has no method for value type "${typeof value}"`)
//
//function serializeEntries<T, K extends Serializable, V extends Serializable, E extends Iterable<[K, V]>>(serializer: ObjectSerializer<T>, value: E) {
// let state
//
// for (const [key, val] of value) {
// state = serializer.serializeKey(key)
// state = serializer.serializeValue(val)
// }
//
// return serializer.end()
//}
//
//function serializeObject<T, K extends PropertyKey, V extends Serializable, R extends Record<K, V>>(serializer: ObjectSerializer<T>, value: R) {
// return serializeEntries(serializer, Object.entries(value) as Iterable<[K, V]>)
//}
//
//function getClassName(value: any): Nullable<string> {
// return value?.constructor.name
//}
//
//function serializeClass<T, K extends PropertyKey, V extends Serializable, R extends Record<K, V>>(serializer: ClassSerializer<T>, value: R) {
// for (const prop in value) {
// serializer.serializeField(prop, value[prop])
// }
//
// return serializer.end()
//}
//
//function serializeIter<T, V extends Iterable<any>>(serializer: IterableSerializer<T>, value: V) {
// let state
//
// for (const val of value) {
// state = serializer.serializeElement(val)
// }
//
// return serializer.end()
//}
//
//// dispatches in the order of serialize<type> -> serializeAny -> throw TypeError
//export function serializeWith<T>(serializer: Serializer<T>, value: Serializable): Nullable<T> {
// // prepare fallback methods
// const serializeAny = orElse(
// serializer,
// serializer.serializeAny,
// (value: Serializable) => unhandledType(serializer, value)
// )
//
// const serialize = ifNull(serializer, serializeAny, value)
//
// switch (typeof value) {
// case 'string': return serialize(serializer.serializeString)
// case 'number': return serialize(serializer.serializeNumber)
// case 'bigint': return serialize(serializer.serializeBigInt)
// case 'boolean': return serialize(serializer.serializeBoolean)
// case 'symbol': return serialize(serializer.serializeSymbol)
// case 'undefined': return serialize(serializer.serializeNull)
// case 'function': return serialize(serializer.serializeFunction)
//
// case 'object':
// if (value instanceof Map && isFunction(serializer.serializeMap)) {
// return serializeEntries(serializer.serializeMap(), value)
// } else if (isIterable(value) && isFunction(serializer.serializeIterable)) {
// return serializeIter(serializer.serializeIterable(), value)
// } else if (isFunction(serializer.serializeClass) && !isPlainObject(value)) {
// const name = getClassName(value)
// return serializeClass(serializer.serializeClass(name!), value as any)
// } else if (isFunction(serializer.serializeObject)) {
// return serializeObject(serializer.serializeObject!(), value as Record<PropertyKey, any>)
// } // deliberate fallthrough when the above fail
//
// default: return serializeAny(value)
// }
//}
//
//export interface SerializationOptions {
// default?: <T>() => T
// rename?: string
// renameAll?: CaseConvention
// tag?: string
// untagged?: boolean
// withInherited?: boolean
//}
//
//const DefaultSerializationOptions: SerializationOptions = {
// withInherited: true
//}
//
//export function serialize(options?: SerializationOptions) {
// options = {
// ...DefaultSerializationOptions,
// ...options
// }
//
// return function <T extends Constructor>(constructor: T) {
// return class Serializable extends constructor implements Serializable {
// static name = constructor.name
// serialize<U>(serializer: Serializer<U>): U {
// // shortcut for serializers with only the serializeAny method
// if (isGenericSerializer(serializer)) {
// return serializer.serializeAny!(this) as U
// } else {
// return serializeWith(serializer, this) as U
// }
// }
// }
// }
//}
//
//export interface DeserializationOptions {
// rename?: string
// renameAll?: CaseConvention
//}
//
//const DefaultDeserializationOptions = {
//}
//
//export function deserialize(options?: DeserializationOptions) {
// options = {
// ...DefaultDeserializationOptions,
// ...options
// }
//
// return function <T, C extends Constructor>(constructor: C) {
// @staticImplements<Deserialize<T>>()
// class Deserializable extends constructor {
// static deserialize<D extends Deserializer>(deserializer: D): T {
// const visitor = new GenericVisitor<T>()
// return deserializer.deserializeAny(visitor)
// }
// }
//
// return Deserializable
// }
//}
export * as ser from './ser'
export * as de from './de'
export * as json from './json'

View file

@ -1,33 +0,0 @@
import { deserialize } from './de'
import { fromString, toString } from './json'
import { serialize } from './ser'
const InnerStruct = deserialize()(
@serialize()
class {
c = 'awawa'
})
const TestStruct = deserialize()(
@serialize()
class {
a = 1
b
inner = new InnerStruct()
d = true
e = Math.pow(2, 53)
f = Symbol('test')
g = [1, 'a', [3]]
constructor() {
this.b = new Map()
this.b.set('test key', 2)
}
})
const test = new TestStruct()
const value = toString(test)
console.log(value)
const test2 = fromString(value, TestStruct)
console.log(test2)