export function mixin(child, ...parents) { // child is modified directly, assigning fields from parents that are missing in child. parents fields are // assigned by parents order, highest priority first for( const parent of parents ) { for ( const key in parent) { if (parent.hasOwnProperty(key) && !child.hasOwnProperty(key) && parent[key] !== undefined) { child[key] = parent[key]; } } } return child; } export function prototype(parent, child) { const result = Object.create(parent); Object.assign(result, child) return result } export function invokeCallback(cbs, prop, ...args) { if (prop in cbs) cbs[prop].call(cbs, ...args) } export function invokeCallbacks(callbacks, prop, ...args) { if (!callbacks) return callbacks.forEach((cb)=>invokeCallback(cb, prop, ...args)) } export function encodeIEE754(value) { const buffer = new ArrayBuffer(4); const view = new DataView(buffer); view.setFloat32(0, value, false /* big endian */); return view.getUint32(0, false); } export function decodeIEE754(value) { const buffer = new ArrayBuffer(4); const view = new DataView(buffer); view.setUint32(0, value, false) return view.getFloat32(0, false) }