Skip to content

Instantly share code, notes, and snippets.

@asleepace
Created February 10, 2025 19:02
Show Gist options
  • Save asleepace/7ba3ac4681504e944ed97c3dbb349911 to your computer and use it in GitHub Desktop.
Save asleepace/7ba3ac4681504e944ed97c3dbb349911 to your computer and use it in GitHub Desktop.
// https://www.typescriptlang.org/play/?#code/MYewdgziA2CmB0w4EMBOAKAlAKG6SALgAQAkyEAnmMAJJgCWxAvEQMoUC2ARjOgOQB9AeSrAB9BgQGUOfHPgjESExgCVYyACYUiLdt16DhlauMkDU2uXnCLSwVBoKwAcrADuutpx7R+QkVMHJ1gBMA9rPGhyCCIAIXJYIgBvbCJ0okVkAnpgTJ8YOjUNbS8sXQA+UhUCdS0KAG40jKycvMDaSX1fMsxK0g6igiaMzIJs3PyDaABhR2zXD17+kmCFt3cm5vTWyY6iAG1V+ecNgF1y1NHRxwIAV1QwInDPAgALeggsI5q67TPtkQAL64UYAB1Q9AAbgtDmQTJ1GGcAFxEcpMKoABVQIA4n1gAB5kGAKFUAD5EbG4-EEqEgeiaCqAiHQ2E-SR-Cgoyk4vEQQnE0mgjIKAioO7AAggDB9K7XdLvT5HQaSM7LDE86n8+COABWsEl-A4dzswGQ0GgREVEHgNQA6ow3qwpahkABzWDlCREUXiyXSgCE1nlCo+EHZxXqapYVL5CEcUGgUM9ADNzfycKMQYD9vbHc7pe7PWaLVxkMAANao9CabLIVEEChg2AgFNWsN9DWxml0hkVWWA0bWiO1EpcrwvTVx9D7dAJmDJgA0RD1BoInaqcpDItsxGbqAgn2cmgAInWvMlnsgOLBUXxQNAJHxgURyK+SYOQ8h3MhGD7zdAZaVug+6HoosCnnWmbbhk85Jp61rQfKQJIcC2DZlEMREAAsiAmiwJasAAB7OGAmixAk-IpICzI4s4koQUQtbjKigrCukvoSi6lyfjsdz7lgvHtp8tqSA67wFq6HozgiaKgUeEFnuMG7UTBO6QDACDQCAbr8PJ4GQeMfDLvpx5KcgqFZqh2ajPyBDmSBaA5Oa5mopiTn0OaRIklULDJChqkhta8DMcgF5EPAkXBaFy6RfAYIeS554gtutwPE80V1oCILZvsKZ3NQOTgEQ2laAAYryklFjxNywPcjzPEs3b8ugc6wImyYqVu1yOAAjnc7UEAAggwHATOAFXXp66KbkJtUdZ6l6haiACMABMADMy6fAAomAyBcHAmgNuKsDLvtN53g+T7ApZGQodlODZqKmpERQuH4ZaLCTlSb3oB9BHLt1+ycYaA6pXV6Wvj+f4A9ARxrKcHgXNZ6F9G+BUVmAIDuE8b7dS8WBubyNJw0yNnYHlBWSvQxVjRINXqXYEhZNQSQsN+v7ED9OJvXDgmAiz4xs-AdkOd1owXbeRB8M4yBvMSfCPexPq2Jp8DabpQvEsAsA4OhuD02AgkKOrmtGr+YB7ZochAA
console.clear()
const $asyncInit = Symbol('__async_init_sym')
const $initReady = Symbol('__async_init_rdy')
const $createNew = Symbol('__async_create_new')
class Base {
static symbolInitReady = () => $initReady;
static asyncInitSymbol = () => $asyncInit;
static symbolCreateNew = () => $createNew;
static async [$createNew]() {
return new this()[$initReady]
}
private [$asyncInit]: () => Promise<any> | Promise<void>
private [$initReady]: Promise<any>
constructor() {
this[$asyncInit] = () => Promise.reject('must call this.initWithStorage() in constructor!')
this[$initReady] = Promise.resolve(false)
}
async initWithStorage(callback: (data: typeof this) => Promise<void>) {
this[$initReady] = new Promise(async (resolve, reject) => {
const persistedData = { name: 'colin' } as any
await callback(persistedData)
resolve(this)
})
}
}
class Model extends Base {
protected data: any
constructor() {
super()
this.initWithStorage(async (persistedData) => {
console.log('persistedData', persistedData)
})
}
setData(partialData: Partial<any> = {}) {
this.data = { ...this.data, ...partialData }
return this.data
}
}
async function loadFromStorage() {
return new Promise((resolve) => {
requestAnimationFrame(() => {
resolve({ data: 123, isEnabled: true, name: 'colin' })
})
})
}
const ProxyModel = new Proxy(Model, {
async construct() {
return await Model[$createNew]()
}
}) as unknown as {
new(): Promise<Model>
}
async function main() {
const instance = await new ProxyModel()
instance.setData({
name: 'teahan'
})
console.log(instance)
}
main()
console.log('mainEnd')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment