@drunkcod/objectory
v0.0.1
Published
Object creation and management utilities
Readme
@drunkcod/objectory
Object creation and management utilities for high-performance TypeScript applications.
Features
- ObjectPool: A zero-allocation (after initialization) LRU cache for interning objects, robust against in-place mutations.
- ObjectLoader: A microtask-based batch loader for aggregating multiple individual requests into a single batch operation.
- shapeOf: High-performance object transformation (pick, omit, pluck) using dynamic code generation.
Installation
npm install @drunkcod/objectoryUsage
ObjectPool
ObjectPool is useful for interning objects to save memory and allow for reference equality checks. It uses a custom LRU (Least Recently Used) strategy implemented with typed arrays for minimal overhead.
import { ObjectPool } from '@drunkcod/objectory';
const pool = new ObjectPool(
(user: { id: number }) => user.id, // Key function
1000, // Capacity
);
const user1 = pool.intern({ id: 1, name: 'Alice' });
const user2 = pool.intern({ id: 1, name: 'Alice' });
console.log(user1 === user2); // trueObjectLoader
ObjectLoader automatically batches requests that occur within the same microtask.
import { ObjectLoader } from '@drunkcod/objectory';
const loader = new ObjectLoader(async (wanted, context) => {
// wanted = { user: { id: 1 }, profile: undefined }
const results = await myApi.fetchBatch(wanted);
return results;
}, {});
// These two calls will be batched into a single loader execution
const [user, profile] = await Promise.all([loader.load('user', { id: 1 }), loader.load('profile')]);shapeOf
shapeOf provides optimized utilities for projecting object shapes. It uses dynamic code generation (JIT-friendly functions) to ensure transformations are as fast as possible.
import { shapeOf } from '@drunkcod/objectory';
interface User {
id: number;
name: string;
email: string;
}
const user: User = { id: 1, name: 'Alice', email: '[email protected]' };
// Create a projection function
const pickPublic = shapeOf<User>().pick(['id', 'name']);
const publicData = pickPublic(user); // { id: 1, name: 'Alice' }
const pickDefined = shapeOf<User>().pickDefined(['id', 'email']);
// If email was undefined on user, it wouldn't be in the result.
const omitId = shapeOf<User>().omit(['id']);
const anonymous = omitId(user); // { name: 'Alice', email: '[email protected]' }
const pluckEmail = shapeOf<User>().pluck('email');
const email = pluckEmail(user); // '[email protected]'License
MIT
