import { MetaContext, MetaObject } from '../../MetaContext'; export const $DUMP = '$dump'; export type Dump = (obj: T) => any; export type $Dump = { [$DUMP]: Dump }; export const withDump = MetaContext>(MetaContextBase: TMetaContextBase) => class extends MetaContextBase { [$DUMP](value: T) { return this.resolveValue(value)[$DUMP](value, this) as any; } }; export type GenericDump = (obj: T, dumpfn: Dump, context: any) => any; export function deepDump(genericDump: GenericDump) { return function $dump(this: MetaObject, obj: T, context: MetaContext & $Dump) { const dumpfn = context[$DUMP]; return (this[$DUMP] = function $dump(obj: T, context: MetaContext) { return genericDump(obj, dumpfn, context); })(obj, context); }; } export function primitiveDump(value: T) { return value as any; } export function primitiveWrapperDump(obj: T) { return obj.valueOf() as any; } export function dummyDump() { return {}; }