feat: Port Laravel's once() helper with coroutine safety
#348
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR ports Laravel's
once()memoization helper to Hypervel, adapted for coroutine safety.What's included
Onceclass - Stores memoized values usingContextinstead of static properties, ensuring per-coroutine isolationOnceableclass - Generates unique hashes from call traces to identify memoization targetsonce()helper - Same as Laravel's API:once(fn () => expensive())HasOnceHashcontract - Allows objects to provide custom hash values for memoizationCoroutine safety
Laravel's implementation uses a static
WeakMapwhich would leak state between concurrent requests in Swoole. This implementation stores theWeakMapinContext, so each coroutine gets its own isolated memoization cache.Tests
OnceTest- Verifies caching behavior and coroutine isolationOnceableTest- Verifies trace-based hash generation andHasOnceHashsupport