From 4296e19eb0de39739895a8472542284ffe31476e Mon Sep 17 00:00:00 2001 From: Riddick Date: Mon, 23 Mar 2026 12:57:32 +0100 Subject: [PATCH 01/79] Update `README.md` to align with new "High-level API for Low-level Proxy" focus **Details:** - Rebranded the repository with a fresh header emphasizing the development of a high-level API for low-level proxy functionality. - Updated badge visuals: - Changed release badge to reflect "DEV" status with a green color scheme (`#66BB6A`) for clarity. - Updated version badge to indicate v0.3.0 progression. - Adjusted license badge to enhance styling and match the new design aesthetic. - Revised purpose section: - Dropped "Unstable Develop Branch" warnings in favor of a milestone-focused approach. - Clearly outlined the branch's goal to introduce reusable support classes (`Str`, `Collection`) to enhance productivity for string and collection manipulation. - Updated linked references: - Pointed commit activity, differences, and milestones to `feature/support-high-level-api` instead of the previous `develop`. - Added related milestone and pull request details for better contextual navigation. - Introduced dedicated "Purpose" and "Scope" sections to clearly delineate objectives. - Refined wording and structure for improved readability, focusing on community clarity and simplicity. This update reflects the repository's pivot to prioritizing internal utility abstraction while aligning visual components and descriptions with --- README.md | 156 +++++++++++++++++++++++++----------------------------- 1 file changed, 73 insertions(+), 83 deletions(-) diff --git a/README.md b/README.md index c372e95a..09feb2a1 100644 --- a/README.md +++ b/README.md @@ -3,137 +3,127 @@

release version GitHub license

-## FireHub Core Foundation — Develop Branch +## High-level API for Low-level proxy – Development Branch

- + GitHub last commit (branch) - + GitHub activity (branch) - + GitHub commit difference between two branches

-⚠️ **This is the `develop` branch** +### Pull request -- Unstable -- APIs may change without notice -- Not intended for production use - -## Branch Purpose - -The `develop` branch is the **primary integration branch** for all ongoing development. - -It serves as the staging area where: -- Feature branches are merged -- Bug fixes are integrated -- Experimental work is stabilized -- Code is prepared for upcoming releases - -All **release branches** are created **from `develop`**. - -## Stability Guarantee +

+ + GitHub pull request title + + GitHub pull request author + + GitHub pull request created + + GitHub pull request comments +

-❌ No backward compatibility guarantee -❌ APIs may change without notice -❌ Behavior may be incomplete or inconsistent -❌ Breaking changes are expected +### Milestone -This branch is intended **only for contributors and advanced testers**. +

+ + GitHub milestone details +

-## Versioning Strategy +This branch contains the initial development of foundational internal utilities for **FireHub Core Foundation**. -FireHub follows **Semantic Versioning (SemVer)**: +The purpose of this branch is to establish a stable, consistent, and reusable internal layer that standardizes access to core PHP functionality and provides safe, predictable building blocks for higher-level components across the FireHub ecosystem. -MAJOR.MINOR.PATCH +## Purpose -### Pre-release versions +Introduce high-level support classes like `Str` and `Collection` in Core-Foundation. +These classes will provide a clean, object-oriented API on top of the existing low-level PHP proxy functions, enabling developers to work with strings and collections more intuitively and safely. -Pre-release versions are tagged **only on release branches**, never directly on `develop`. +- `Str` will wrap common string operations (manipulation, formatting, encoding) in a fluent, high-level interface. +- `Collection` will provide an object-oriented wrapper for arrays and iterable structures, with functional utilities like map, filter, reduce, and chaining. -Examples: -- `v0.1.0-alpha.1` -- `v0.1.0-beta.1` -- `v0.1.0-rc.1` +This layer sits above the low-level proxies, ensuring consistency, testability, and reusability across FireHub modules. -The `develop` branch itself is considered **pre-release by definition**. +## Scope -## Branch Workflow +This branch includes: -### Main branches +- Internal utility and support classes +- Low-level abstractions intended for framework-internal use +- Namespaced, final, static-style helpers designed for performance and predictability -| Branch | Purpose | -|-----------------|-----------------------------------------| -| `master` | Production-ready, stable releases only | -| `develop` | Active development & integration | -| `release/x.y.z` | Release preparation & stabilization | -| `vX.y.z` | Maintenance branches for older versions | +Out of scope for this branch: -### Supporting branches +- Public-facing APIs +- High-level domain abstractions +- Framework features or adapters +- Tooling (tests, PHAR, CI pipelines) -| Branch | Purpose | -|-----------------|-----------------------------------| -| `feature/*` | New features | -| `bugfix/*` | Bug fixes | -| `patch/*` | Patch | -| `hotfix/*` | Critical fixes for production | -| `experiment/*` | Prototypes and experiments | -| `feature/*` | Feature branch | -| `integration/*` | Temp branch for multiple features | -| `wip/*` | Temporary work-in-progress | +## Stability & Compatibility -## Merging rules +- Changes are internal and backward compatible +- No public contracts are introduced or modified +- Safe for reuse across all Core distributions -- bugfix/* → develop -- patch/* → develop -- hotfix/* → master → develop -> vX.y.z -- experiment/* → develop (only if promoted) -- feature/* → develop -- integration/* → develop -- release/* → master (stable only) +## Workflow -❌ Direct commits to develop are discouraged -✅ Pull requests with review are required +- Development happens exclusively on this feature branch +- All work is tracked via a single feature issue +- The branch will be merged into `develop` once the scope is complete +- The merge marks the completion of the `v0.3.0` milestone -## Composer Usage (Not Recommended) -For internal testing only: +## Related -```json -{ - "require": { - "firehub/core-foundation": "dev-develop" - } -} -``` -⚠️ Never use dev-develop in production. +- Milestone: **Development v1** +- Target Release: **v0.3.0** +- Repository: FireHub Core Foundation ## FireHub Icon License This software is licensed under the Apache-2.0 License. -For more details, read the full license [here](./LICENSE). +For more details, read the full license [here](./LICENSE). \ No newline at end of file From 8e4f6e2f590501519adeab826cbab38c7708f633 Mon Sep 17 00:00:00 2001 From: Riddick Date: Mon, 23 Mar 2026 13:05:21 +0100 Subject: [PATCH 02/79] Update `README.md` to align with new "High-level API for Low-level Proxy" focus **Details:** - Rebranded the repository with a fresh header emphasizing the development of a high-level API for low-level proxy functionality. - Updated badge visuals: - Changed release badge to reflect "DEV" status with a green color scheme (`#66BB6A`) for clarity. - Updated version badge to indicate v0.3.0 progression. - Adjusted license badge to enhance styling and match the new design aesthetic. - Revised purpose section: - Dropped "Unstable Develop Branch" warnings in favor of a milestone-focused approach. - Clearly outlined the branch's goal to introduce reusable support classes (`Str`, `Collection`) to enhance productivity for string and collection manipulation. - Updated linked references: - Pointed commit activity, differences, and milestones to `feature/support-high-level-api` instead of the previous `develop`. - Added related milestone and pull request details for better contextual navigation. - Introduced dedicated "Purpose" and "Scope" sections to clearly delineate objectives. - Refined wording and structure for improved readability, focusing on community clarity and simplicity. This update reflects the repository's pivot to prioritizing internal utility abstraction while aligning --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 09feb2a1..3e038112 100644 --- a/README.md +++ b/README.md @@ -23,17 +23,17 @@

GitHub last commit (branch) GitHub activity (branch) GitHub commit difference between two branches

@@ -41,24 +41,24 @@ ### Pull request

- + GitHub pull request title - + GitHub pull request author - + GitHub pull request created - + GitHub pull request comments

From 16d87740948bae6c44cdf4ac180dac39dc3b441f Mon Sep 17 00:00:00 2001 From: Riddick Date: Mon, 23 Mar 2026 13:11:05 +0100 Subject: [PATCH 03/79] Update `README.md` to align with new "High-level API for Low-level Proxy" focus **Details:** - Rebranded the repository with a fresh header emphasizing the development of a high-level API for low-level proxy functionality. - Updated badge visuals: - Changed release badge to reflect "DEV" status with a green color scheme (`#66BB6A`) for clarity. - Updated version badge to indicate v0.3.0 progression. - Adjusted license badge to enhance styling and match the new design aesthetic. - Revised purpose section: - Dropped "Unstable Develop Branch" warnings in favor of a milestone-focused approach. - Clearly outlined the branch's goal to introduce reusable support classes (`Str`, `Collection`) to enhance productivity for string and collection manipulation. - Updated linked references: - Pointed commit activity, differences, and milestones to `feature/support-high-level-api` instead of the previous `develop`. - Added related milestone and pull request details for better contextual navigation. - Introduced dedicated "Purpose" and "Scope" sections to clearly delineate objectives. - Refined wording and structure for improved readability, focusing on community clarity and simplicity. This update reflects the repository's pivot to prioritizing internal utility abstraction while aligning --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3e038112..8d55a64e 100644 --- a/README.md +++ b/README.md @@ -41,24 +41,24 @@ ### Pull request

- + GitHub pull request title - + GitHub pull request author - + GitHub pull request created - + GitHub pull request comments

From e50117ba34317b3372b04f6f48391d06ff1305ab Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 24 Mar 2026 10:44:44 +0100 Subject: [PATCH 04/79] Update `composer.json`: Replace `autoload-dev` with `autoload` **Details:** - Moved PSR-4 autoloading configuration from the `autoload-dev` section to the `autoload` section. - Ensures consistent loading behavior for the `FireHub\PHPStan` namespace in both development and production environments. This change improves autoloading setup, supporting better project organization and deployment alignment. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a2b2cf15..5dd05fab 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^13.0" }, - "autoload-dev": { + "autoload": { "psr-4": { "FireHub\\PHPStan\\": "phpstan/" } From 4f809d5f2822cf61c437f3b9ce8a1f4b496b23df Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 24 Mar 2026 13:27:10 +0100 Subject: [PATCH 05/79] Introduce foundational contracts, shared traits, and high-level abstractions for data structures **Details:** - **New Contracts Added:** - Implemented foundational interfaces under `Core\Shared\Contracts`: - `Countable`: Extends PHP's native `Countable` interface, standardizing object element counting. - `Traversable`, `Iterator`, and `IteratorAggregate`: Provide base contracts for iterable and iterator behavior. - Introduced `DataStructure` contract in `Core\Support\Contracts`: - Serves as a unified, consistent abstraction for high-level data structures supporting type safety, iteration, and utility operations. - **Shared Trait Introduced:** - Added `Enumerable` trait for reusable iteration and transformation logic in data structures: - Simplifies integration by reducing duplication in common operations like counting and sequential access. - **Updates to Project Structure:** - New files organized under `src/shared/contracts`, `src/support/contracts`, and `src/support/datastructure/traits`. - Updated `CHANGELOG.md` to document these changes under the `Unreleased` section. These additions establish the core framework for designing extensible and type-safe data structures, supporting cross-library consistency and improving developer productivity in the FireHub ecosystem. --- CHANGELOG.md | 2 + src/shared/contracts/firehub.Countable.php | 36 +++++++++ src/shared/contracts/firehub.Iterator.php | 81 +++++++++++++++++++ .../contracts/firehub.IteratorAggregate.php | 42 ++++++++++ src/shared/contracts/firehub.Traversable.php | 31 +++++++ .../contracts/firehub.DataStructure.php | 37 +++++++++ .../traits/firehub.Enumerable.php | 58 +++++++++++++ 7 files changed, 287 insertions(+) create mode 100644 src/shared/contracts/firehub.Countable.php create mode 100644 src/shared/contracts/firehub.Iterator.php create mode 100644 src/shared/contracts/firehub.IteratorAggregate.php create mode 100644 src/shared/contracts/firehub.Traversable.php create mode 100644 src/support/contracts/firehub.DataStructure.php create mode 100644 src/support/datastructure/traits/firehub.Enumerable.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fa61a53..62b2acbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.2.0...feature/support-high-level-api) + ## [v0.2.0](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.1.1...v0.2.0) – 2026-03-23 ### Added diff --git a/src/shared/contracts/firehub.Countable.php b/src/shared/contracts/firehub.Countable.php new file mode 100644 index 00000000..1cd92118 --- /dev/null +++ b/src/shared/contracts/firehub.Countable.php @@ -0,0 +1,36 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Contracts; + +use Countable as InternalCountable; + +/** + * ### Countable contract + * + * Classes implementing Countable can be used with the count() function. + * @since 1.0.0 + */ +interface Countable extends InternalCountable { + + /** + * ### Count elements of an object + * @since 1.0.0 + * + * @return non-negative-int Number of elements of an object. + */ + public function count ():int; + +} \ No newline at end of file diff --git a/src/shared/contracts/firehub.Iterator.php b/src/shared/contracts/firehub.Iterator.php new file mode 100644 index 00000000..a2bc7dbf --- /dev/null +++ b/src/shared/contracts/firehub.Iterator.php @@ -0,0 +1,81 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Contracts; + +use Iterator as InternalIterator; + +/** + * ### Base iterator contract + * + * Interface for external iterators or objects that can be iterated themselves internally. + * @since 1.0.0 + * + * @template-covariant TKey + * @template-covariant TValue + * + * @extends Traversable + * @extends InternalIterator + */ +interface Iterator extends Traversable, InternalIterator { + + /** + * ### Checks if the current position is valid + * @since 1.0.0 + * + * @return bool True on success or false on failure. + * + * @note This method is called after rewind() and next() to check if the current position is valid. + */ + public function valid ():bool; + + /** + * ### Return the current element + * @since 1.0.0 + * + * @return TValue Current element. + */ + public function current ():mixed; + + /** + * ### Return the key of the current element + * @since 1.0.0 + * + * @return null|TKey Key of the current element. + */ + public function key ():mixed; + + /** + * ### Move forward to the next element + * @since 1.0.0 + * + * @return void + * + * @note This method is called after each foreach loop. + */ + public function next ():void; + + /** + * ### Rewind the iterator to the first element + * @since 1.0.0 + * + * @return void + * + * @note This is the first method called when starting a foreach loop. + * It will not be executed after foreach loops. + */ + public function rewind ():void; + +} \ No newline at end of file diff --git a/src/shared/contracts/firehub.IteratorAggregate.php b/src/shared/contracts/firehub.IteratorAggregate.php new file mode 100644 index 00000000..14493ae3 --- /dev/null +++ b/src/shared/contracts/firehub.IteratorAggregate.php @@ -0,0 +1,42 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Contracts; + +use IteratorAggregate as InternalIteratorAggregate, Traversable as InternalTraversable; + +/** + * ### Base iterator aggregate contract + * + * Interface for external iterators or objects that can be iterated themselves internally. + * @since 1.0.0 + * + * @template-covariant TKey + * @template-covariant TValue + * + * @extends Traversable + * @extends InternalIteratorAggregate + */ +interface IteratorAggregate extends Traversable, InternalIteratorAggregate { + + /** + * ### Retrieve an external iterator + * @since 1.0.0 + * + * @return InternalTraversable An instance of an object implementing Iterator or Traversable. + */ + public function getIterator ():InternalTraversable; + +} \ No newline at end of file diff --git a/src/shared/contracts/firehub.Traversable.php b/src/shared/contracts/firehub.Traversable.php new file mode 100644 index 00000000..1e8b3eb0 --- /dev/null +++ b/src/shared/contracts/firehub.Traversable.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Contracts; + +use Traversable as InternalTraversable; + +/** + * ### Base traversable contract + * + * Interface to detect if a class is traversable using foreach. + * @since 1.0.0 + * + * @template-covariant TKey + * @template-covariant TValue + * + * @extends InternalTraversable + */ +interface Traversable extends InternalTraversable {} \ No newline at end of file diff --git a/src/support/contracts/firehub.DataStructure.php b/src/support/contracts/firehub.DataStructure.php new file mode 100644 index 00000000..73eddde7 --- /dev/null +++ b/src/support/contracts/firehub.DataStructure.php @@ -0,0 +1,37 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Support\Contracts; + +use FireHub\Core\Shared\Contracts\ { + Countable, IteratorAggregate +}; + +/** + * ### Data structures Contract + * + * Defines a generic, type-safe contract for all high-level data structures in FireHub.
+ * Supports iteration, array conversion, serialization, and common utility operations, ensuring consistency across + * collections, lazy collections, and other linear or dynamic data containers. + * @since 1.0.0 + * + * @template-covariant TKey + * @template-covariant TValue + * + * @extends \FireHub\Core\Shared\Contracts\IteratorAggregate + */ +interface DataStructure extends Countable, IteratorAggregate { + +} \ No newline at end of file diff --git a/src/support/datastructure/traits/firehub.Enumerable.php b/src/support/datastructure/traits/firehub.Enumerable.php new file mode 100644 index 00000000..68f2f199 --- /dev/null +++ b/src/support/datastructure/traits/firehub.Enumerable.php @@ -0,0 +1,58 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Support\DataStructure\Traits; + +use FireHub\Core\Support\LowLevel\Iterator; + +/** + * ### Enumerable – Shared Iteration and Transformation Behavior + * + * Provides a reusable implementation of common iteration and transformation methods for data structures. + * This trait includes high-level operations, allowing consistent element-wise processing across different + * implementations.
+ * It is designed to be used by data structures that expose sequential access to their elements (e.g., Collection, + * LazyCollection), reducing duplication and ensuring a uniform API without enforcing a strict contract. + * @since 1.0.0 + * + * @template-covariant TKey + * @template-covariant TValue + */ +trait Enumerable { + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $collection->count(); + * + * // 6 + * + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Iterator::count() To count storage items. + */ + public function count ():int { + + return Iterator::count($this); + + } + +} \ No newline at end of file From ee02c6067b63b431c75337cccb6f60d64ee68f22 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 25 Mar 2026 10:11:36 +0100 Subject: [PATCH 06/79] Introduce foundational contracts, traits, and high-level data structure implementations **Details:** - **New Contracts Added:** - Introduced key interfaces under `Core\Shared\Contracts` and `Core\Support\Contracts`, including: - `Arrayable`, `ArrayConvertable`, `DataStructure`, and `Collection`. - Streamlined type-safe iteration and array conversion behaviors for core data structures. - Standardized traversable interfaces (`Iterator`, `IteratorAggregate`, `Traversable`). - Updated type variance annotations (`template-covariant TKey` to `template TKey`) across existing contracts for consistency. - **Shared Traits Added:** - Developed `Shared` and `Enumerable` traits for reusable functionality: - `Shared` offers common data structure utilities (counting, conversion, iteration). - `Enumerable` handles iteration and transformation logic, supporting extensibility in data structures. - **Concrete Implementation Introduced:** - Added `Collection`: - Eager, array-based implementation of `DataStructure` designed for high-level manipulation of key-value data. - Implements type-safe `fromArray` and `toArray` methods alongside iterator functionality. - **Project Structure Updates:** - Organized additions into `src/shared/contracts`, `src/support/contracts`, `src/support/datastructure`, and `src/support/datastructure/traits`. - Simplified redundant code across multiple classes by centralizing shared logic into traits. - **Changelog Update:** - Documented the introduction of foundational contracts, shared traits, and high-level abstractions under the `Unreleased` section. These updates establish the foundational framework for extensible, type-safe abstractions, paving the way for cohesive data structure utilities in the FireHub ecosystem. --- CHANGELOG.md | 3 + .../contracts/firehub.ArrayConvertable.php | 46 ++++++ src/shared/contracts/firehub.Arrayable.php | 35 +++++ src/shared/contracts/firehub.Iterator.php | 4 +- .../contracts/firehub.IteratorAggregate.php | 4 +- src/shared/contracts/firehub.Traversable.php | 4 +- .../contracts/firehub.DataStructure.php | 4 +- .../contracts/firehub.Collection.php | 35 +++++ .../datastructure/firehub.Collection.php | 133 ++++++++++++++++++ .../traits/firehub.Enumerable.php | 29 +--- .../datastructure/traits/firehub.Shared.php | 56 ++++++++ 11 files changed, 318 insertions(+), 35 deletions(-) create mode 100644 src/shared/contracts/firehub.ArrayConvertable.php create mode 100644 src/shared/contracts/firehub.Arrayable.php create mode 100644 src/support/datastructure/contracts/firehub.Collection.php create mode 100644 src/support/datastructure/firehub.Collection.php create mode 100644 src/support/datastructure/traits/firehub.Shared.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 62b2acbd..186950fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.2.0...feature/support-high-level-api) +### Added +- Introduce foundational contracts, shared traits, and high-level abstractions for data structures (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`4f809d5`](https://github.com/The-FireHub-Project/Core-Foundation/commit/4f809d5)) + ## [v0.2.0](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.1.1...v0.2.0) – 2026-03-23 ### Added diff --git a/src/shared/contracts/firehub.ArrayConvertable.php b/src/shared/contracts/firehub.ArrayConvertable.php new file mode 100644 index 00000000..0d45580e --- /dev/null +++ b/src/shared/contracts/firehub.ArrayConvertable.php @@ -0,0 +1,46 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Contracts; + +/** + * ### ArrayConstructable interface + * + * Objects that can be created from arrays and can convert themselves to arrays. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @extends \FireHub\Core\Shared\Contracts\Arrayable + */ +interface ArrayConvertable extends Arrayable { + + /** + * ### Create a new object from an array + * + * This static method constructs a new instance of the implementing class using the provided array as its initial + * data storage. + * @since 1.0.0 + * + * @param array $array

+ * Input data for creating the object. + *

+ * + * @return static A new instance of the implementing class. + */ + public static function fromArray (array $array):static; + +} \ No newline at end of file diff --git a/src/shared/contracts/firehub.Arrayable.php b/src/shared/contracts/firehub.Arrayable.php new file mode 100644 index 00000000..b23e647f --- /dev/null +++ b/src/shared/contracts/firehub.Arrayable.php @@ -0,0 +1,35 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Contracts; + +/** + * ### Represents an object that can be converted into an array representation + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + */ +interface Arrayable { + + /** + * ### Convert object to array + * @since 1.0.0 + * + * @return array Object as an array. + */ + public function toArray ():array; + +} \ No newline at end of file diff --git a/src/shared/contracts/firehub.Iterator.php b/src/shared/contracts/firehub.Iterator.php index a2bc7dbf..60c94a9e 100644 --- a/src/shared/contracts/firehub.Iterator.php +++ b/src/shared/contracts/firehub.Iterator.php @@ -23,8 +23,8 @@ * Interface for external iterators or objects that can be iterated themselves internally. * @since 1.0.0 * - * @template-covariant TKey - * @template-covariant TValue + * @template TKey + * @template TValue * * @extends Traversable * @extends InternalIterator diff --git a/src/shared/contracts/firehub.IteratorAggregate.php b/src/shared/contracts/firehub.IteratorAggregate.php index 14493ae3..36dbbe73 100644 --- a/src/shared/contracts/firehub.IteratorAggregate.php +++ b/src/shared/contracts/firehub.IteratorAggregate.php @@ -23,8 +23,8 @@ * Interface for external iterators or objects that can be iterated themselves internally. * @since 1.0.0 * - * @template-covariant TKey - * @template-covariant TValue + * @template TKey + * @template TValue * * @extends Traversable * @extends InternalIteratorAggregate diff --git a/src/shared/contracts/firehub.Traversable.php b/src/shared/contracts/firehub.Traversable.php index 1e8b3eb0..45d17202 100644 --- a/src/shared/contracts/firehub.Traversable.php +++ b/src/shared/contracts/firehub.Traversable.php @@ -23,8 +23,8 @@ * Interface to detect if a class is traversable using foreach. * @since 1.0.0 * - * @template-covariant TKey - * @template-covariant TValue + * @template TKey + * @template TValue * * @extends InternalTraversable */ diff --git a/src/support/contracts/firehub.DataStructure.php b/src/support/contracts/firehub.DataStructure.php index 73eddde7..e60e2905 100644 --- a/src/support/contracts/firehub.DataStructure.php +++ b/src/support/contracts/firehub.DataStructure.php @@ -27,8 +27,8 @@ * collections, lazy collections, and other linear or dynamic data containers. * @since 1.0.0 * - * @template-covariant TKey - * @template-covariant TValue + * @template TKey + * @template TValue * * @extends \FireHub\Core\Shared\Contracts\IteratorAggregate */ diff --git a/src/support/datastructure/contracts/firehub.Collection.php b/src/support/datastructure/contracts/firehub.Collection.php new file mode 100644 index 00000000..673b68bf --- /dev/null +++ b/src/support/datastructure/contracts/firehub.Collection.php @@ -0,0 +1,35 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Support\DataStructure\Contracts; + +use FireHub\Core\Support\Contracts\DataStructure; + +/** + * ### Collection Contract + * + * Represents the core contract for all linear, iterable data structures in FireHub.
+ * This interface defines the minimal operations that all Collections should implement, serving as the foundation for + * feature-rich Professional and Enterprise collections. + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @extends \FireHub\Core\Support\Contracts\DataStructure + */ +interface Collection extends DataStructure { + +} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Collection.php b/src/support/datastructure/firehub.Collection.php new file mode 100644 index 00000000..45fd0a7c --- /dev/null +++ b/src/support/datastructure/firehub.Collection.php @@ -0,0 +1,133 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Support\DataStructure; + +use FireHub\Core\Support\DataStructure\Contracts\Collection as CollectionContract; +use FireHub\Core\Shared\Contracts\ArrayConvertable; +use FireHub\Core\Support\DataStructure\Traits\ { + Enumerable, Shared +}; +use Traversable; + +/** + * ### Collection – High-level, Eager Array-based Data Structure + * + * Provides a concrete, high-level implementation of the DataStructure contract based on native PHP arrays. + * The Collection operates using an eager evaluation model and offers a consistent, type-safe API for working with + * in-memory array data, including iteration, transformation, and utility operations. + * This implementation is intentionally designed as a general-purpose wrapper around arrays and does not aim to + * represent or replace specialized data structures such as lazy collections, fixed-size arrays, or other advanced + * structures. It serves as the foundational data container within FireHub Core Foundation. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Contracts\Collection + * @implements \FireHub\Core\Shared\Contracts\ArrayConvertable + */ +class Collection implements CollectionContract, ArrayConvertable { + + /** + * ### Shared Operations for All Data Structures + * @since 1.0.0 + * + * @use \FireHub\Core\Support\DataStructure\Traits\Shared + */ + use Shared; + + /** + * ### Enumerable – Shared Iteration and Transformation Behavior + * @since 1.0.0 + * + * @use \FireHub\Core\Support\DataStructure\Traits\Enumerable + */ + use Enumerable; + + /** + * ### Constructor + * @since 1.0.0 + * + * @param array $storage

+ * Underlying storage data. + *

+ * + * @retrun void + */ + public function __construct ( + private array $storage = [] + ) {} + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * $collection = Collection::fromArray(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] + * + * + * @since 1.0.0 + * + * @template TArray of array + * + * @param TArray $array

+ * Input data for creating the object. + *

+ * + * @return static, value-of> A new instance of the implementing class. + */ + public static function fromArray (array $array):static { + + return new static($array); + + } + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $collection->toArray(); + * + * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] + * + * + * @since 1.0.0 + */ + public function toArray ():array { + + return $this->storage; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function getIterator ():Traversable { + + yield from $this->storage; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/traits/firehub.Enumerable.php b/src/support/datastructure/traits/firehub.Enumerable.php index 68f2f199..94bd4a5a 100644 --- a/src/support/datastructure/traits/firehub.Enumerable.php +++ b/src/support/datastructure/traits/firehub.Enumerable.php @@ -15,8 +15,6 @@ namespace FireHub\Core\Support\DataStructure\Traits; -use FireHub\Core\Support\LowLevel\Iterator; - /** * ### Enumerable – Shared Iteration and Transformation Behavior * @@ -27,32 +25,9 @@ * LazyCollection), reducing duplication and ensuring a uniform API without enforcing a strict contract. * @since 1.0.0 * - * @template-covariant TKey - * @template-covariant TValue + * @template TKey + * @template TValue */ trait Enumerable { - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructures\Collection; - * - * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $collection->count(); - * - * // 6 - * - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Iterator::count() To count storage items. - */ - public function count ():int { - - return Iterator::count($this); - - } - } \ No newline at end of file diff --git a/src/support/datastructure/traits/firehub.Shared.php b/src/support/datastructure/traits/firehub.Shared.php new file mode 100644 index 00000000..7d8818e9 --- /dev/null +++ b/src/support/datastructure/traits/firehub.Shared.php @@ -0,0 +1,56 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Support\DataStructure\Traits; + +use FireHub\Core\Support\LowLevel\Iterator; + +/** + * ### Shared Operations for All Data Structures + * + * A reusable trait providing common methods for all data structures, including element counting, emptiness checks, + * key/value access, iteration, and conversion from other data structures. Designed to standardize shared behavior + * across both linear and non-linear collections while minimizing code duplication. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +trait Shared { + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $collection->count(); + * + * // 6 + * + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Iterator::count() To count storage items. + */ + public function count ():int { + + return Iterator::count($this); + + } + +} \ No newline at end of file From 4071f34c49d5f5951ad6f4b22312816441f343cf Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 25 Mar 2026 13:21:31 +0100 Subject: [PATCH 07/79] Enhance core abstractions with new contracts, exception handling improvements, and serialization capabilities **Details:** - **Core Updates:** - Simplified `$Id` version annotations in `FireHub.php` and `Builder.php` for cleaner metadata tracking. - Enhanced exception handling by updating the `match` expression in the `boot` method: - Replaced explicit exception `throw()` calls with direct `throw` expressions for improved readability and performance. - Added context information (`key` and `value`) for `NotBootloaderException` to enrich debugging information. - **Exception Builder Refactor:** - Renamed `throw` method to `build` in `firehub.Builder`: - Better aligns with its purpose of constructing exception objects without directly throwing them. - Removed redundant `throw new` in favor of returning instances for flexibility in exception handling logic. - **New Serializable Contracts:** - Introduced high-level serialization abstractions under `Core\Shared\Contracts\Magic`: - `Serializable`: Defines methods for generating and restoring object serialized data (`serialize`, `__serialize`). - `SerializableConvertable`: Extends `Serializable` with methods for unserialization and data conversion (`unserialize`, `__unserialize`). - **JSON Serialization Capability:** - Added `JsonSerializable` and `JsonSerializableConvertable` interfaces for customizable JSON representations: - `JsonSerializable` defines methods for JSON encoding (`toJson`, `jsonSerialize`) with flag support. - `JsonSerializableConvertable` builds on JSON encoding with methods for object construction from JSON (`fromJson`). This commit enhances FireHub's core abstractions with expanded exception handling, robust serialization contracts, and JSON-specific encoding, paving the way for richer extensibility and better runtime diagnostics. --- src/firehub.FireHub.php | 18 +++--- .../contracts/firehub.JsonSerializable.php | 63 +++++++++++++++++++ .../firehub.JsonSerializableConvertable.php | 54 ++++++++++++++++ .../contracts/magic/firehub.Serializable.php | 46 ++++++++++++++ .../magic/firehub.SerializableConvertable.php | 56 +++++++++++++++++ src/throwable/firehub.Builder.php | 6 +- 6 files changed, 233 insertions(+), 10 deletions(-) create mode 100644 src/shared/contracts/firehub.JsonSerializable.php create mode 100644 src/shared/contracts/firehub.JsonSerializableConvertable.php create mode 100644 src/shared/contracts/magic/firehub.Serializable.php create mode 100644 src/shared/contracts/magic/firehub.SerializableConvertable.php diff --git a/src/firehub.FireHub.php b/src/firehub.FireHub.php index c4c5a68e..da5638da 100644 --- a/src/firehub.FireHub.php +++ b/src/firehub.FireHub.php @@ -96,6 +96,7 @@ public function boot ():string { * @uses \FireHub\Core\Support\LowLevel\ClsObj::ofClass() To check if the $value is a bootloader. * @uses \FireHub\Core\Support\Bootstrap\Bootloader::boot() To boot a bootloader. * + * @throws \FireHub\Core\Shared\Contracts\Throwable * @throws \FireHub\Core\Throwable\Exception\Bootstrap\FailedToLoadBootloaderException If a bootloader fails to * load. * @throws \FireHub\Core\Throwable\Exception\Bootstrap\NotBootloaderException If a bootloader is not a bootloader. @@ -108,17 +109,20 @@ private function loadBootloaders ():void { match (true) { DataIs::string($key) && DataIs::array($value) && ClsObj::ofClass($key, Bootloader::class) => new $key(...$value)->boot() - ?: FailedToLoadBootloaderException::builder() + ?: throw FailedToLoadBootloaderException::builder() ->withContext(['class' => $key]) - ->throw(), + ->build(), DataIs::string($value) && ClsObj::ofClass($value, Bootloader::class) => new $value()->boot() - ?: FailedToLoadBootloaderException::builder() + ?: throw FailedToLoadBootloaderException::builder() ->withContext(['class' => $value]) - ->throw(), - default => NotBootloaderException::builder() - ->withContext(['bootloader' => '']) - ->throw() + ->build(), + default => throw NotBootloaderException::builder() + ->withContext([ + 'key' => $key, + 'value' => $value + ]) + ->build() }; } diff --git a/src/shared/contracts/firehub.JsonSerializable.php b/src/shared/contracts/firehub.JsonSerializable.php new file mode 100644 index 00000000..f33032ac --- /dev/null +++ b/src/shared/contracts/firehub.JsonSerializable.php @@ -0,0 +1,63 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Contracts; + +use FireHub\Core\Shared\Enums\Json\ { + Flag, Flag\Encode +}; +use JsonSerializable as InternalJsonSerializable; + +/** + * ### JsonSerializable contract + * + * Objects implementing JsonSerializable can customize their JSON representation when encoded with json_encode() + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + */ +interface JsonSerializable extends InternalJsonSerializable { + + /** + * ### JSON representation of an object + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\Json\Flag As parameter. + * @uses \FireHub\Core\Shared\Enums\Json\Flag\Encode As parameter. + * + * @param positive-int $depth

+ * Set the maximum depth. + *

+ * @param \FireHub\Core\Shared\Enums\Json\Flag|\FireHub\Core\Shared\Enums\Json\Flag\Encode ...$flags

+ * JSON flags. + *

+ * + * @return non-empty-string JSON encoded string. + */ + public function toJson (int $depth = 512, Flag|Encode ...$flags):string; + + /** + * ### Specify data which should be serialized to JSON + * + * Serializes the object to a value that can be serialized natively by json_encode(). + * @since 1.0.0 + * + * @return array Data which can be serialized by json_encode(), which is a value of any type + * other than a resource. + */ + public function jsonSerialize ():array; + +} \ No newline at end of file diff --git a/src/shared/contracts/firehub.JsonSerializableConvertable.php b/src/shared/contracts/firehub.JsonSerializableConvertable.php new file mode 100644 index 00000000..e25d945d --- /dev/null +++ b/src/shared/contracts/firehub.JsonSerializableConvertable.php @@ -0,0 +1,54 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Contracts; + +use FireHub\Core\Shared\Enums\Json\ { + Flag, Flag\Decode +}; + +/** + * ### JsonSerializable-convertable object that can be created from and converted to JSON + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @extends \FireHub\Core\Shared\Contracts\JsonSerializable + */ +interface JsonSerializableConvertable extends JsonSerializable { + + /** + * ### Get object from JSON + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\Json\Flag As parameter. + * @uses \FireHub\Core\Shared\Enums\Json\Flag\Decode As parameter. + * + * @param string $json

+ * The JSON string being decoded. + *

+ * @param positive-int $depth [optional]

+ * Set the maximum depth. + *

+ * @param \FireHub\Core\Shared\Enums\Json\Flag|\FireHub\Core\Shared\Enums\Json\Flag\Decode ...$flags

+ * JSON flags. + *

+ * + * @return static This object from JSON encoded parameter. + */ + public static function fromJson (string $json, int $depth = 512, Flag|Decode ...$flags):static; + +} \ No newline at end of file diff --git a/src/shared/contracts/magic/firehub.Serializable.php b/src/shared/contracts/magic/firehub.Serializable.php new file mode 100644 index 00000000..191c59b9 --- /dev/null +++ b/src/shared/contracts/magic/firehub.Serializable.php @@ -0,0 +1,46 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.0 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Contracts\Magic; + +/** + * ### Serializable contract + * + * Contract allows serialization for objects. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + */ +interface Serializable { + + /** + * ### Generates storable representation of an object + * @since 1.0.0 + * + * @return string String containing a byte-stream representation of an object that can be stored anywhere. + */ + public function serialize ():string; + + /** + * ### Construct and return an associative array of key/value pairs that represent the serialized form of the object + * @since 1.0.0 + * + * @return array An associative array of key/value pairs that represent the serialized form + * of the object. + */ + public function __serialize ():array; + +} \ No newline at end of file diff --git a/src/shared/contracts/magic/firehub.SerializableConvertable.php b/src/shared/contracts/magic/firehub.SerializableConvertable.php new file mode 100644 index 00000000..c0107ce4 --- /dev/null +++ b/src/shared/contracts/magic/firehub.SerializableConvertable.php @@ -0,0 +1,56 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.0 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Contracts\Magic; + +/** + * ### Serializable-convertable object that can be serialized and unserialized + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @extends \FireHub\Core\Shared\Contracts\Magic\Serializable + */ +interface SerializableConvertable extends Serializable { + + /** + * ### Creates an object from a stored representation + * @since 1.0.0 + * + * @param non-empty-string $data

+ * The serialized string. + *

+ * @param positive-int $max_depth [optional]

+ * The maximum depth of structures is permitted during unserialization and is intended to prevent stack overflows. + *

+ * + * @return static Object from a serialized parameter. + */ + public static function unserialize (string $data, int $max_depth = 4096):static; + + /** + * ### Converts from serialized data back to the object + * @since 1.0.0 + * + * @param array $data

+ * Serialized data. + *

+ * + * @return void + */ + public function __unserialize (array $data):void; + +} \ No newline at end of file diff --git a/src/throwable/firehub.Builder.php b/src/throwable/firehub.Builder.php index d74d1dfa..476a43fb 100644 --- a/src/throwable/firehub.Builder.php +++ b/src/throwable/firehub.Builder.php @@ -150,16 +150,16 @@ final public function withPrevious (InternalThrowable $previous):self { } /** - * ### Build and throw the object + * ### Build the Throwable object * @since 1.0.0 * * @uses \FireHub\Core\Shared\Contracts\Throwable To build the object. * * @return TThrowable The built object. */ - public function throw ():Throwable { + public function build ():Throwable { - return throw new $this->exception( + return new $this->exception( $this->message, $this->code, $this->context, From 734f0883c8514bb6623832f43df0c1dc29b6da0d Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 25 Mar 2026 13:30:12 +0100 Subject: [PATCH 08/79] Add Convertable Trait, Enhance Collection Class, and Update Classmaps **Details:** - **Convertable Trait:** - Introduced the `Convertable` trait, enabling reusable bidirectional data structure conversions to/from array, JSON, and serialized formats. - Implemented methods for data serialization (`toJson`, `serialize`) and creation from serialized or JSON data (`fromJson`, `unserialize`). - Includes exception handling for serialization errors, ensuring robustness in encoding/decoding logic. - **Collection Class Enhancements:** - Updated `Collection` to utilize the new `Convertable` trait, adding support for JSON and serialization: - Implemented methods like `jsonSerialize` and `__serialize` for seamless integration with high-level functionality. - Enhanced constructor to allow writable `protected(set)` storage property for improved encapsulation. - Updated PHP version requirement to 8.4, leveraging modern language features. - **Classmap and Changelog Updates:** - Expanded the autoload classmap to include new contracts and traits (`Convertable`, `JsonSerializable`, `Magic\Serializable`, etc.). - Documented the new trait and updated `Collection` functionality in the `CHANGELOG.md` under the "Added" section. These changes enhance FireHub's core abstractions with versatile serialization capabilities, improving extensibility and compliance with modern PHP standards. --- CHANGELOG.md | 3 + phar/core.min.phar | Bin 197179 -> 207944 bytes phar/core.phar | Bin 650427 -> 685830 bytes src/support/autoload/classmap.php | 16 ++ .../loader/firehub.CompiledClassmap.php | 64 +++++++ .../datastructure/firehub.Collection.php | 66 ++++++- .../traits/firehub.Convertable.php | 171 ++++++++++++++++++ 7 files changed, 314 insertions(+), 6 deletions(-) create mode 100644 src/support/datastructure/traits/firehub.Convertable.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 186950fb..0a49afbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Introduce foundational contracts, shared traits, and high-level abstractions for data structures (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`4f809d5`](https://github.com/The-FireHub-Project/Core-Foundation/commit/4f809d5)) +- Introduce foundational contracts, traits, and high-level data structure implementations (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`ee02c60`](https://github.com/The-FireHub-Project/Core-Foundation/commit/ee02c60)) +- Enhance core abstractions with new contracts, exception handling improvements, and serialization capabilities + (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`4071f34`](https://github.com/The-FireHub-Project/Core-Foundation/commit/4071f34)) ## [v0.2.0](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.1.1...v0.2.0) – 2026-03-23 diff --git a/phar/core.min.phar b/phar/core.min.phar index 4b6b72fa6474d33cc5fba056d077d3f65673e90f..c794d3802cb280edbf1257414df6cf2104fc12b4 100644 GIT binary patch delta 8446 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 delta 2546 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 JX#Vo~{{z>dSy=!8 delta 2801 zcmZ8j2~<;88qRx<6f;5NS~=iD=~ztwB+AL=?U1 ztzs*<3l;inv#;=*Ya>OJ~kZ&bj&W|M&m@?_ch_FO|Os9HEjIhOmf-8PD)yk<8&^y97SAtKnn+pZK@}v1uZ* zD=@`=Croi>&rDTF?_}mDe4K&1X~alQ&;ZCc^GBO|%w{4SGK&>fRA3_`UcFhF4?@gw zt!3tOkkNJXRD^C5QV_11fHUct5Ql0%$z!pCzrVW++!cBv1A!<2VYDb1VTC9Z8QvE$ zhK<3?!4{E+d1|C_hy&($h=c{^47b4DSZjfY*gdZQmj&jGu*Cc8EOA%9x5Rd&I1EvU znS+w>+1hq+%~BzVTdpZKl5DlZB;{gk+$F|jAH{g+Ay&AhIx9T~hc(^~8^_hw z_^h0__C;mAwa!4CA4nF9K0O=_UP=|apOR*v+D48H+HDFD+DUNZG?IBpzAVW?=q}Ag zSS8Is_(+jsGZkY99vv z;vhzwbq<*bKaFFSBhK}#BhK|PL;IcEy$`@ws(^I_CEL|UO`s{9E6~YsrMF}_X|)q> z-E+pPd-Ja?AjMVzwWXvK3_6Jr&od{?7wag7>ev z;2wJ^uw1Q}i;BC?Fm_F@-vZiH3ZQkhf#w2ANIzq=#ycd^6?@gYV)ijt%#z`jgRu?*`eu(bxI+F_rmF3^uiPUg9)_n zTE#u!;GzJ@-tLHXl{Y>x!_1~>gGn`-T&|K5zz+(_kv1D2U62n>a=#BgJ@0&GBlma} z=4w#kQ$+dV!(KFwKl*Br-AunCgzbJy(EuEnxHs7S6`;m{3em}v;gJ)xU`M_ zxWiBUarmgo3z2*CV;plc->?C@j&Gg1bpppeu1Jquu-;jSMc^LrQ={vf9GU z_&WPSleeg##7#CeOy=eW)+Rb*%l41SPuvatuQ*-=>|IBs!2S-B*WOrH$o)U1prZDa zq4pG^+W;1{({N`bc?-&F369~(baJT>YBNZ#K{uZ)Np9B`mJzV6fa!W}Co^gJ8=e@- z4v`WzpYNko!rmq_fa1%PaI}dmhKrj?72MlQYN2ThBkEd69emS5mO;%?G6x<|vE_sh z{PwRT^AH^)@P$Jl?;hBQosZxU^l9oHP;+xERl(ShoDhkoHi>uBvZo4 z>FJ2i+DSCLt9r3D)R84wCtTlJ^vBA>8@9A$pGfk!v;5K~RYU2z43EsUHKlvCx_Wub zlShvwqn3$xW>RZbB$!N;66&T`KjrIP9$u~1s%Lxc@Vk(?ayU4f-c$X4QD46 ztR^KP(CNLfl)WkL+iq3B3(IPU8&MTS z3hH^*y4xjl9d~jJx!cHo(3wZ4l5M*7Ps>*x;pEOeH2-Am z>qP63+?;#eCgs*Pg8eSjr9WJ$Fnt*}PnzwLbK!^So-fB-BYG6a!{sqN?n5)*w0&Mp YhmW=jT}JI|Sj;VD!Te>7j!cOBH@&D>LI3~& diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index 2c74d308..6f7e974d 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -31,8 +31,18 @@ return [ \FireHub\Core\Domain\Autoload\Handle::class => __DIR__.'/../../domain/autoload/firehub.Handle.php', \FireHub\Core\FireHub::class => __DIR__.'/../../firehub.FireHub.php', + \FireHub\Core\Shared\Contracts\ArrayConvertable::class => __DIR__.'/../../shared/contracts/firehub.ArrayConvertable.php', + \FireHub\Core\Shared\Contracts\Arrayable::class => __DIR__.'/../../shared/contracts/firehub.Arrayable.php', + \FireHub\Core\Shared\Contracts\Countable::class => __DIR__.'/../../shared/contracts/firehub.Countable.php', + \FireHub\Core\Shared\Contracts\Iterator::class => __DIR__.'/../../shared/contracts/firehub.Iterator.php', + \FireHub\Core\Shared\Contracts\IteratorAggregate::class => __DIR__.'/../../shared/contracts/firehub.IteratorAggregate.php', + \FireHub\Core\Shared\Contracts\JsonSerializable::class => __DIR__.'/../../shared/contracts/firehub.JsonSerializable.php', + \FireHub\Core\Shared\Contracts\JsonSerializableConvertable::class => __DIR__.'/../../shared/contracts/firehub.JsonSerializableConvertable.php', + \FireHub\Core\Shared\Contracts\Magic\Serializable::class => __DIR__.'/../../shared/contracts/magic/firehub.Serializable.php', + \FireHub\Core\Shared\Contracts\Magic\SerializableConvertable::class => __DIR__.'/../../shared/contracts/magic/firehub.SerializableConvertable.php', \FireHub\Core\Shared\Contracts\Magic\Stringable::class => __DIR__.'/../../shared/contracts/magic/firehub.Stringable.php', \FireHub\Core\Shared\Contracts\Throwable::class => __DIR__.'/../../shared/contracts/firehub.Throwable.php', + \FireHub\Core\Shared\Contracts\Traversable::class => __DIR__.'/../../shared/contracts/firehub.Traversable.php', \FireHub\Core\Shared\Enums\Comparison::class => __DIR__.'/../../shared/enums/firehub.Comparison.php', \FireHub\Core\Shared\Enums\Data\Category::class => __DIR__.'/../../shared/enums/data/firehub.Category.php', \FireHub\Core\Shared\Enums\Data\ResourceType::class => __DIR__.'/../../shared/enums/data/firehub.ResourceType.php', @@ -68,6 +78,12 @@ \FireHub\Core\Support\Bootstrap\Bootloader\RegisterConstants::class => __DIR__.'/../../support/bootstrap/bootloader/firehub.RegisterConstants.php', \FireHub\Core\Support\Bootstrap\Bootloader\RegisterHelpers::class => __DIR__.'/../../support/bootstrap/bootloader/firehub.RegisterHelpers.php', \FireHub\Core\Support\Bootstrap\FireHubConfigurator::class => __DIR__.'/../../support/bootstrap/firehub.FireHubConfigurator.php', + \FireHub\Core\Support\Contracts\DataStructure::class => __DIR__.'/../../support/contracts/firehub.DataStructure.php', + \FireHub\Core\Support\DataStructure\Collection::class => __DIR__.'/../../support/datastructure/firehub.Collection.php', + \FireHub\Core\Support\DataStructure\Contracts\Collection::class => __DIR__.'/../../support/datastructure/contracts/firehub.Collection.php', + \FireHub\Core\Support\DataStructure\Traits\Convertable::class => __DIR__.'/../../support/datastructure/traits/firehub.Convertable.php', + \FireHub\Core\Support\DataStructure\Traits\Enumerable::class => __DIR__.'/../../support/datastructure/traits/firehub.Enumerable.php', + \FireHub\Core\Support\DataStructure\Traits\Shared::class => __DIR__.'/../../support/datastructure/traits/firehub.Shared.php', \FireHub\Core\Support\LowLevel::class => __DIR__.'/../../support/firehub.LowLevel.php', \FireHub\Core\Support\LowLevel\Arr::class => __DIR__.'/../../support/lowlevel/firehub.Arr.php', \FireHub\Core\Support\LowLevel\CharMB::class => __DIR__.'/../../support/lowlevel/firehub.CharMB.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 3dd11127..b13c5329 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -50,6 +50,42 @@ public function __invoke (string $class):void { require __DIR__.'/../../../firehub.FireHub.php'; return; + case \FireHub\Core\Shared\Contracts\ArrayConvertable::class: + require __DIR__.'/../../../shared/contracts/firehub.ArrayConvertable.php'; + return; + + case \FireHub\Core\Shared\Contracts\Arrayable::class: + require __DIR__.'/../../../shared/contracts/firehub.Arrayable.php'; + return; + + case \FireHub\Core\Shared\Contracts\Countable::class: + require __DIR__.'/../../../shared/contracts/firehub.Countable.php'; + return; + + case \FireHub\Core\Shared\Contracts\Iterator::class: + require __DIR__.'/../../../shared/contracts/firehub.Iterator.php'; + return; + + case \FireHub\Core\Shared\Contracts\IteratorAggregate::class: + require __DIR__.'/../../../shared/contracts/firehub.IteratorAggregate.php'; + return; + + case \FireHub\Core\Shared\Contracts\JsonSerializable::class: + require __DIR__.'/../../../shared/contracts/firehub.JsonSerializable.php'; + return; + + case \FireHub\Core\Shared\Contracts\JsonSerializableConvertable::class: + require __DIR__.'/../../../shared/contracts/firehub.JsonSerializableConvertable.php'; + return; + + case \FireHub\Core\Shared\Contracts\Magic\Serializable::class: + require __DIR__.'/../../../shared/contracts/magic/firehub.Serializable.php'; + return; + + case \FireHub\Core\Shared\Contracts\Magic\SerializableConvertable::class: + require __DIR__.'/../../../shared/contracts/magic/firehub.SerializableConvertable.php'; + return; + case \FireHub\Core\Shared\Contracts\Magic\Stringable::class: require __DIR__.'/../../../shared/contracts/magic/firehub.Stringable.php'; return; @@ -58,6 +94,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../shared/contracts/firehub.Throwable.php'; return; + case \FireHub\Core\Shared\Contracts\Traversable::class: + require __DIR__.'/../../../shared/contracts/firehub.Traversable.php'; + return; + case \FireHub\Core\Shared\Enums\Comparison::class: require __DIR__.'/../../../shared/enums/firehub.Comparison.php'; return; @@ -198,6 +238,30 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/bootstrap/firehub.FireHubConfigurator.php'; return; + case \FireHub\Core\Support\Contracts\DataStructure::class: + require __DIR__.'/../../../support/contracts/firehub.DataStructure.php'; + return; + + case \FireHub\Core\Support\DataStructure\Collection::class: + require __DIR__.'/../../../support/datastructure/firehub.Collection.php'; + return; + + case \FireHub\Core\Support\DataStructure\Contracts\Collection::class: + require __DIR__.'/../../../support/datastructure/contracts/firehub.Collection.php'; + return; + + case \FireHub\Core\Support\DataStructure\Traits\Convertable::class: + require __DIR__.'/../../../support/datastructure/traits/firehub.Convertable.php'; + return; + + case \FireHub\Core\Support\DataStructure\Traits\Enumerable::class: + require __DIR__.'/../../../support/datastructure/traits/firehub.Enumerable.php'; + return; + + case \FireHub\Core\Support\DataStructure\Traits\Shared::class: + require __DIR__.'/../../../support/datastructure/traits/firehub.Shared.php'; + return; + case \FireHub\Core\Support\LowLevel::class: require __DIR__.'/../../../support/firehub.LowLevel.php'; return; diff --git a/src/support/datastructure/firehub.Collection.php b/src/support/datastructure/firehub.Collection.php index 45fd0a7c..c892bf3d 100644 --- a/src/support/datastructure/firehub.Collection.php +++ b/src/support/datastructure/firehub.Collection.php @@ -7,7 +7,7 @@ * @copyright 2026 The FireHub Project - All rights reserved * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * - * @php-version 7.0 + * @php-version 8.4 * @package Core\Support * * @version GIT: $Id$ Blob checksum. @@ -16,9 +16,11 @@ namespace FireHub\Core\Support\DataStructure; use FireHub\Core\Support\DataStructure\Contracts\Collection as CollectionContract; -use FireHub\Core\Shared\Contracts\ArrayConvertable; +use FireHub\Core\Shared\Contracts\ { + Magic\SerializableConvertable, ArrayConvertable, JsonSerializableConvertable +}; use FireHub\Core\Support\DataStructure\Traits\ { - Enumerable, Shared + Convertable, Enumerable, Shared }; use Traversable; @@ -38,8 +40,12 @@ * * @implements \FireHub\Core\Support\DataStructure\Contracts\Collection * @implements \FireHub\Core\Shared\Contracts\ArrayConvertable + * @implements \FireHub\Core\Shared\Contracts\JsonSerializableConvertable + * @implements \FireHub\Core\Shared\Contracts\Magic\SerializableConvertable + * + * @phpstan-consistent-constructor */ -class Collection implements CollectionContract, ArrayConvertable { +class Collection implements CollectionContract, ArrayConvertable, JsonSerializableConvertable, SerializableConvertable { /** * ### Shared Operations for All Data Structures @@ -57,18 +63,26 @@ class Collection implements CollectionContract, ArrayConvertable { */ use Enumerable; + /** + * ### Convertable Trait + * @since 1.0.0 + * + * @use \FireHub\Core\Support\DataStructure\Traits\Convertable + */ + use Convertable; + /** * ### Constructor * @since 1.0.0 * - * @param array $storage

+ * @param array $storage [optional]

* Underlying storage data. *

* * @retrun void */ public function __construct ( - private array $storage = [] + protected(set) array $storage = [] ) {} /** @@ -119,6 +133,17 @@ public function toArray ():array { } + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function jsonSerialize ():array { + + return $this->storage; + + } + /** * @inheritDoc * @@ -130,4 +155,33 @@ public function getIterator ():Traversable { } + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @return array An associative array of key/value pairs that represent the serialized form + * of the object. + */ + public function __serialize ():array { + + return $this->storage; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @param array $data

+ * Serialized data. + *

+ */ + public function __unserialize (array $data):void { + + $this->storage = $data; + + } + } \ No newline at end of file diff --git a/src/support/datastructure/traits/firehub.Convertable.php b/src/support/datastructure/traits/firehub.Convertable.php new file mode 100644 index 00000000..2fb1f4af --- /dev/null +++ b/src/support/datastructure/traits/firehub.Convertable.php @@ -0,0 +1,171 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Support\DataStructure\Traits; + +use FireHub\Core\Shared\Enums\Json\ { + Flag, Flag\Encode, Flag\Decode +}; +use FireHub\Core\Throwable\Error\LowLevel\Data\UnserializeFailedError; +use FireHub\Core\Support\LowLevel\ { + Data, DataIs, Json +}; + +/** + * ### Convertable Trait + * + * A reusable trait that enables bidirectional conversion of data structures to and from array, JSON, and serialized + * formats.
+ * It acts as a bridge between high-level data structures and low-level serialization mechanisms, ensuring consistent + * encoding/decoding behavior across the system. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +trait Convertable { + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + abstract public static function fromArray (array $array):static; + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * $collection = Collection::fromJson('["John","Jane","Jane","Jane","Richard","Richard"]'); + * + * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] + * + * + * @since 1.0.0 + * + * @uses static::fromArray To create a data structure from an array. + * @uses \FireHub\Core\Support\LowLevel\DataIs::array To check if decoded JSON data is an array. + * @uses \FireHub\Core\Support\LowLevel\JSON::decode() To decode $json data. + * + * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\DecodeError If JSON decoding throws an error. + * + * @return static + * + * @note Method already includes Flag::JSON_THROW_ON_ERROR. + */ + public static function fromJson (string $json, int $depth = 512, Flag|Decode ...$flags):static { + + /** @var static */ + return static::fromArray( + DataIs::array($data = JSON::decode($json, true, $depth, ...$flags)) + ? $data : [] + ); + + } + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $collection->toJson(); + * + * // '["John","Jane","Jane","Jane","Richard","Richard"]' + * + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Json::encode() As JSON representation of an object. + * + * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\EncodeError If JSON encoding throws an error. + * + * @note Method already includes Flag::JSON_THROW_ON_ERROR. + */ + public function toJson (int $depth = 512, Flag|Encode ...$flags):string { + + return Json::encode($this, $depth, ...$flags); + + } + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $collection->serialize(); + * + * // serialized collection class + * + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Data::serialize() To generate a storable representation of an object. + * + * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\CannotSerializeError If try to serialize an anonymous class, + * function, or resource. + * + * @note This is a binary string that may include null bytes and needs to be stored and handled as such. + * For example, Data::serialize() output should generally be stored in a BLOB field in a database, rather than + * a CHAR or TEXT field. + */ + public function serialize ():string { + + return Data::serialize($this); + + } + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * Collection::unserialize( //serialized collection class); + * + * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] + * + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Data::unserialize() To create an object from a stored representation. + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\UnserializeFailedError If couldn't unserialize data, $data is + * already false, $data is NULL, or $data is not from this class. + * + * @return static + */ + public static function unserialize (string $data, int $max_depth = 4096):static { + + /** @var static */ + return ($data = Data::unserialize($data, true, $max_depth)) instanceof static + ? $data : throw UnserializeFailedError::builder() + ->withContext([ + 'excepted_class' => static::class, + 'data' => $data + ]) + ->build(); + + } + +} \ No newline at end of file From f7196da0b4f32d8f0d7b326975cd82da445ae887 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 1 Apr 2026 10:23:06 +0200 Subject: [PATCH 09/79] Refactor and Extend Core Data Structure Framework **Details:** - **Abstract Collection Base:** - Introduced `Abstract\Collection` as the foundational class for high-level data structures, centralizing iteration, transformation, and conversion logic. - Updated `Collection` to inherit from `Abstract\Collection` to streamline implementation and reduce redundancy. - **Iteration Enhancements:** - Added `each` method to data structures, enabling user-defined callback execution with control flow signals (`BREAK`, `CONTINUE`). - Introduced examples demonstrating `each` usage for custom iteration and early termination. - **Exception Refinements:** - Added `WrongReturnTypeException` to validate callback signal results and enforce stricter type safety. - **Namespace and Dependency Updates:** - Moved `FailedToLoadBootloaderException` and `NotBootloaderException` under `Support\Bootstrap` for consistent exception categorization. - Introduced enum `ControlFlow\Signal` to standardize control flow signals across the framework. - **Autoloading and Classmap Updates:** - Expanded classmap to include new abstractions, exceptions, and enums (`Abstract\Collection`, `ControlFlow\Signal`, etc.). - Updated compiled autoload definitions to reflect the extended file structure. With these changes, FireHub's data structure framework offers improved extensibility, type-safe iteration utilities, and a more modular organization. --- CHANGELOG.md | 4 +- src/firehub.FireHub.php | 16 +- src/public/boot.php | 7 +- .../enums/controlflow/firehub.Signal.php | 53 ++++++ src/support/autoload/classmap.php | 9 +- .../loader/firehub.CompiledClassmap.php | 32 +++- .../bootstrap/firehub.FireHubConfigurator.php | 7 +- .../contracts/firehub.DataStructure.php | 22 +++ .../abstract/firehub.Collection.php | 173 ++++++++++++++++++ .../datastructure/firehub.Collection.php | 124 +------------ .../datastructure/traits/firehub.Shared.php | 83 +++++++++ .../firehub.WrongReturnTypeException.php | 33 ++++ ...irehub.FailedToLoadBootloaderException.php | 2 +- .../firehub.NotBootloaderException.php | 2 +- tests/unit/FireHubTest.php | 4 +- .../bootstrap/FireHubConfiguratorTest.php | 4 +- 16 files changed, 432 insertions(+), 143 deletions(-) create mode 100644 src/shared/enums/controlflow/firehub.Signal.php create mode 100644 src/support/datastructure/abstract/firehub.Collection.php create mode 100644 src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php rename src/throwable/exception/{ => support}/bootstrap/firehub.FailedToLoadBootloaderException.php (91%) rename src/throwable/exception/{ => support}/bootstrap/firehub.NotBootloaderException.php (91%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a49afbf..bb9ec43f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Introduce foundational contracts, shared traits, and high-level abstractions for data structures (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`4f809d5`](https://github.com/The-FireHub-Project/Core-Foundation/commit/4f809d5)) - Introduce foundational contracts, traits, and high-level data structure implementations (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`ee02c60`](https://github.com/The-FireHub-Project/Core-Foundation/commit/ee02c60)) -- Enhance core abstractions with new contracts, exception handling improvements, and serialization capabilities - (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`4071f34`](https://github.com/The-FireHub-Project/Core-Foundation/commit/4071f34)) +- Enhance core abstractions with new contracts, exception handling improvements, and serialization capabilities (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`4071f34`](https://github.com/The-FireHub-Project/Core-Foundation/commit/4071f34)) +- Add Convertable Trait, Enhance Collection Class, and Update Classmap (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`734f088`](https://github.com/The-FireHub-Project/Core-Foundation/commit/734f088)) ## [v0.2.0](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.1.1...v0.2.0) – 2026-03-23 diff --git a/src/firehub.FireHub.php b/src/firehub.FireHub.php index da5638da..473d49e2 100644 --- a/src/firehub.FireHub.php +++ b/src/firehub.FireHub.php @@ -17,7 +17,7 @@ use FireHub\Core\Support\Bootstrap\FireHubConfigurator; use FireHub\Core\Support\Bootstrap\Bootloader; -use FireHub\Core\Throwable\Exception\Bootstrap\ { +use FireHub\Core\Throwable\Exception\Support\Bootstrap\ { FailedToLoadBootloaderException, NotBootloaderException }; use FireHub\Core\Support\LowLevel\ { @@ -59,9 +59,10 @@ final class FireHub { * FireHub configurator. *

* - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\FailedToLoadBootloaderException If a bootloader fails to - * load. - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\NotBootloaderException If a bootloader is not a bootloader. + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException If a bootloader + * fails to load. + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\NotBootloaderException If a bootloader is not + * a bootloader. * * @return void */ @@ -97,9 +98,10 @@ public function boot ():string { * @uses \FireHub\Core\Support\Bootstrap\Bootloader::boot() To boot a bootloader. * * @throws \FireHub\Core\Shared\Contracts\Throwable - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\FailedToLoadBootloaderException If a bootloader fails to - * load. - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\NotBootloaderException If a bootloader is not a bootloader. + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException If a bootloader + * fails to load. + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\NotBootloaderException If a bootloader is not + * a bootloader. * * @return void */ diff --git a/src/public/boot.php b/src/public/boot.php index 57d187c8..0d6499f4 100644 --- a/src/public/boot.php +++ b/src/public/boot.php @@ -26,9 +26,10 @@ * ### Let there be light * @since 1.0.0 * - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\FailedToLoadBootloaderException If a bootloader fails to - * load. - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\NotBootloaderException If a bootloader is not a bootloader. + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException If a bootloader + * fails to load. + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\NotBootloaderException If a bootloader is not + * a bootloader. * * @return \FireHub\Core\FireHub */ diff --git a/src/shared/enums/controlflow/firehub.Signal.php b/src/shared/enums/controlflow/firehub.Signal.php new file mode 100644 index 00000000..38abceae --- /dev/null +++ b/src/shared/enums/controlflow/firehub.Signal.php @@ -0,0 +1,53 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.1 + * @package Core\Shared + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Shared\Enums\ControlFlow; + +/** + * ### Control flow signals + * + * Generic control signals that can be used to influence the flow of iteration, pipelines, or other executable + * sequences across the FireHub framework. + * @since 1.0.0 + */ +enum Signal { + + /** + * ### Terminate Execution Flow + * + * Immediately stops the iteration or execution sequence and prevents any further processing of remaining items. + * @since 1.0.0 + */ + case BREAK; + + /** + * ### Continue Execution Flow + * + * Proceeds to the next iteration, marking the current item as processed and allowing normal execution flow to + * continue without interruption. + * @since 1.0.0 + */ + case CONTINUE; + + /** + * ### Skip Current Processing Step + * + * Skips processing of the current iteration while keeping the iteration flow active, allowing the next item to + * be evaluated without executing the current processing logic. + * @since 1.0.0 + */ + case SKIP; + +} \ No newline at end of file diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index 6f7e974d..e2eb432e 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -29,6 +29,8 @@ * @return array */ return [ + \Collection2::class => __DIR__.'/../../index.php', + \Collection3::class => __DIR__.'/../../index.php', \FireHub\Core\Domain\Autoload\Handle::class => __DIR__.'/../../domain/autoload/firehub.Handle.php', \FireHub\Core\FireHub::class => __DIR__.'/../../firehub.FireHub.php', \FireHub\Core\Shared\Contracts\ArrayConvertable::class => __DIR__.'/../../shared/contracts/firehub.ArrayConvertable.php', @@ -44,6 +46,7 @@ \FireHub\Core\Shared\Contracts\Throwable::class => __DIR__.'/../../shared/contracts/firehub.Throwable.php', \FireHub\Core\Shared\Contracts\Traversable::class => __DIR__.'/../../shared/contracts/firehub.Traversable.php', \FireHub\Core\Shared\Enums\Comparison::class => __DIR__.'/../../shared/enums/firehub.Comparison.php', + \FireHub\Core\Shared\Enums\ControlFlow\Signal::class => __DIR__.'/../../shared/enums/controlflow/firehub.Signal.php', \FireHub\Core\Shared\Enums\Data\Category::class => __DIR__.'/../../shared/enums/data/firehub.Category.php', \FireHub\Core\Shared\Enums\Data\ResourceType::class => __DIR__.'/../../shared/enums/data/firehub.ResourceType.php', \FireHub\Core\Shared\Enums\Data\Type::class => __DIR__.'/../../shared/enums/data/firehub.Type.php', @@ -79,6 +82,7 @@ \FireHub\Core\Support\Bootstrap\Bootloader\RegisterHelpers::class => __DIR__.'/../../support/bootstrap/bootloader/firehub.RegisterHelpers.php', \FireHub\Core\Support\Bootstrap\FireHubConfigurator::class => __DIR__.'/../../support/bootstrap/firehub.FireHubConfigurator.php', \FireHub\Core\Support\Contracts\DataStructure::class => __DIR__.'/../../support/contracts/firehub.DataStructure.php', + \FireHub\Core\Support\DataStructure\Abstract\Collection::class => __DIR__.'/../../support/datastructure/abstract/firehub.Collection.php', \FireHub\Core\Support\DataStructure\Collection::class => __DIR__.'/../../support/datastructure/firehub.Collection.php', \FireHub\Core\Support\DataStructure\Contracts\Collection::class => __DIR__.'/../../support/datastructure/contracts/firehub.Collection.php', \FireHub\Core\Support\DataStructure\Traits\Convertable::class => __DIR__.'/../../support/datastructure/traits/firehub.Convertable.php', @@ -193,12 +197,13 @@ \FireHub\Core\Throwable\Error\LowLevel\SystemRuntime\SleepTimeInvalidError::class => __DIR__.'/../../throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php', \FireHub\Core\Throwable\Exception::class => __DIR__.'/../../throwable/firehub.Exception.php', \FireHub\Core\Throwable\ExceptionBuilder::class => __DIR__.'/../../throwable/firehub.ExceptionBuilder.php', - \FireHub\Core\Throwable\Exception\Bootstrap\FailedToLoadBootloaderException::class => __DIR__.'/../../throwable/exception/bootstrap/firehub.FailedToLoadBootloaderException.php', - \FireHub\Core\Throwable\Exception\Bootstrap\NotBootloaderException::class => __DIR__.'/../../throwable/exception/bootstrap/firehub.NotBootloaderException.php', + \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException::class => __DIR__.'/../../throwable/exception/datastructure/firehub.WrongReturnTypeException.php', \FireHub\Core\Throwable\Exception\Domain\Autoload\ImplementationException::class => __DIR__.'/../../throwable/exception/domain/autoload/firehub.ImplementationException.php', \FireHub\Core\Throwable\Exception\Domain\Autoload\InvalidFolderException::class => __DIR__.'/../../throwable/exception/domain/autoload/firehub.InvalidFolderException.php', \FireHub\Core\Throwable\Exception\Domain\Autoload\InvalidHandleException::class => __DIR__.'/../../throwable/exception/domain/autoload/firehub.InvalidHandleException.php', \FireHub\Core\Throwable\Exception\Domain\Autoload\InvalidNamespaceException::class => __DIR__.'/../../throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php', + \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException::class => __DIR__.'/../../throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php', + \FireHub\Core\Throwable\Exception\Support\Bootstrap\NotBootloaderException::class => __DIR__.'/../../throwable/exception/support/bootstrap/firehub.NotBootloaderException.php', \FireHub\Core\Throwable\Throwable::class => __DIR__.'/../../throwable/firehub.Throwable.php', \FireHub\Core\Throwable\ValueObject\Code::class => __DIR__.'/../../throwable/valueobject/firehub.Code.php', ]; \ No newline at end of file diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index b13c5329..f6eadb6f 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -42,6 +42,14 @@ public function __invoke (string $class):void { switch ($class) { + case \Collection2::class: + require __DIR__.'/../../../index.php'; + return; + + case \Collection3::class: + require __DIR__.'/../../../index.php'; + return; + case \FireHub\Core\Domain\Autoload\Handle::class: require __DIR__.'/../../../domain/autoload/firehub.Handle.php'; return; @@ -102,6 +110,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../shared/enums/firehub.Comparison.php'; return; + case \FireHub\Core\Shared\Enums\ControlFlow\Signal::class: + require __DIR__.'/../../../shared/enums/controlflow/firehub.Signal.php'; + return; + case \FireHub\Core\Shared\Enums\Data\Category::class: require __DIR__.'/../../../shared/enums/data/firehub.Category.php'; return; @@ -242,6 +254,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/contracts/firehub.DataStructure.php'; return; + case \FireHub\Core\Support\DataStructure\Abstract\Collection::class: + require __DIR__.'/../../../support/datastructure/abstract/firehub.Collection.php'; + return; + case \FireHub\Core\Support\DataStructure\Collection::class: require __DIR__.'/../../../support/datastructure/firehub.Collection.php'; return; @@ -698,12 +714,8 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/firehub.ExceptionBuilder.php'; return; - case \FireHub\Core\Throwable\Exception\Bootstrap\FailedToLoadBootloaderException::class: - require __DIR__.'/../../../throwable/exception/bootstrap/firehub.FailedToLoadBootloaderException.php'; - return; - - case \FireHub\Core\Throwable\Exception\Bootstrap\NotBootloaderException::class: - require __DIR__.'/../../../throwable/exception/bootstrap/firehub.NotBootloaderException.php'; + case \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException::class: + require __DIR__.'/../../../throwable/exception/datastructure/firehub.WrongReturnTypeException.php'; return; case \FireHub\Core\Throwable\Exception\Domain\Autoload\ImplementationException::class: @@ -722,6 +734,14 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php'; return; + case \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException::class: + require __DIR__.'/../../../throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php'; + return; + + case \FireHub\Core\Throwable\Exception\Support\Bootstrap\NotBootloaderException::class: + require __DIR__.'/../../../throwable/exception/support/bootstrap/firehub.NotBootloaderException.php'; + return; + case \FireHub\Core\Throwable\Throwable::class: require __DIR__.'/../../../throwable/firehub.Throwable.php'; return; diff --git a/src/support/bootstrap/firehub.FireHubConfigurator.php b/src/support/bootstrap/firehub.FireHubConfigurator.php index 12697ad4..cc69382c 100644 --- a/src/support/bootstrap/firehub.FireHubConfigurator.php +++ b/src/support/bootstrap/firehub.FireHubConfigurator.php @@ -64,9 +64,10 @@ public function withBootloaders (array $bootloaders):self { * * @uses \FireHub\Core\FireHub As return. * - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\FailedToLoadBootloaderException If a bootloader fails to - * load. - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\NotBootloaderException If a bootloader is not a bootloader. + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException If a bootloader + * fails to load. + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\NotBootloaderException If a bootloader is not + * a bootloader. * * @return \FireHub\Core\FireHub New Firehub Framework application. */ diff --git a/src/support/contracts/firehub.DataStructure.php b/src/support/contracts/firehub.DataStructure.php index e60e2905..46c88a3c 100644 --- a/src/support/contracts/firehub.DataStructure.php +++ b/src/support/contracts/firehub.DataStructure.php @@ -19,6 +19,8 @@ Countable, IteratorAggregate }; +use const FireHub\Core\Shared\Constants\Number\MAX; + /** * ### Data structures Contract * @@ -34,4 +36,24 @@ */ interface DataStructure extends Countable, IteratorAggregate { + /** + * ### Call a user-generated function on each item in the data structure + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Constants\Number\MAX As default limit. + * @uses \FireHub\Core\Shared\Enums\ControlFlow\Signal::BREAK As signal. + * + * @param callable(TValue, TKey):(\FireHub\Core\Shared\Enums\ControlFlow\Signal::BREAK|\FireHub\Core\Shared\Enums\ControlFlow\Signal::CONTINUE) $callback

+ * Function to call on each item in a data structure.
+ * Return `Signal::BREAK` to stop iteration early. + * Return `Signal::CONTINUE` to continue iteration. + *

+ * @param positive-int $limit [optional]

+ * Maximum number of elements that is allowed to be iterated. + *

+ * + * @return static This data structure. + */ + public function each (callable $callback, int $limit = MAX):static; + } \ No newline at end of file diff --git a/src/support/datastructure/abstract/firehub.Collection.php b/src/support/datastructure/abstract/firehub.Collection.php new file mode 100644 index 00000000..1a74251e --- /dev/null +++ b/src/support/datastructure/abstract/firehub.Collection.php @@ -0,0 +1,173 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.4 + * @package Core\Support + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Support\DataStructure\Abstract; + +use FireHub\Core\Support\DataStructure\Contracts\Collection as CollectionContract; +use FireHub\Core\Shared\Contracts\ { + Magic\SerializableConvertable, ArrayConvertable, JsonSerializableConvertable +}; +use FireHub\Core\Support\DataStructure\Traits\ { + Convertable, Enumerable, Shared +}; +use Traversable; + +/** + * ### Abstract collection base + * + * Serves as the foundational implementation for all high-level collection types within the FireHub framework.
+ * Defines shared behavior such as iteration, reduction, and transformation while delegating structural rules and + * constraints to concrete implementations. + * + * Enables extensibility and consistency across generic and specialized data structures without imposing specific key + * or value semantics. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Contracts\Collection + * @implements \FireHub\Core\Shared\Contracts\ArrayConvertable + * @implements \FireHub\Core\Shared\Contracts\JsonSerializableConvertable + * @implements \FireHub\Core\Shared\Contracts\Magic\SerializableConvertable + */ +abstract class Collection implements CollectionContract, ArrayConvertable, JsonSerializableConvertable, SerializableConvertable { + + /** + * ### Shared Operations for All Data Structures + * @since 1.0.0 + * + * @use \FireHub\Core\Support\DataStructure\Traits\Shared + */ + use Shared; + + /** + * ### Enumerable – Shared Iteration and Transformation Behavior + * @since 1.0.0 + * + * @use \FireHub\Core\Support\DataStructure\Traits\Enumerable + */ + use Enumerable; + + /** + * ### Convertable Trait + * @since 1.0.0 + * + * @use \FireHub\Core\Support\DataStructure\Traits\Convertable + */ + use Convertable; + + /** + * ### Constructor + * @since 1.0.0 + * + * @param array $storage [optional]

+ * Underlying storage data. + *

+ * + * @retrun void + */ + public function __construct ( + protected(set) array $storage = [] + ) {} + + /** + * {@inheritDoc} + * + * @since 1.0.0 + * + * @template TArray of array + * + * @param TArray $array

+ * Input data for creating the object. + *

+ * + * @return static, value-of> A new instance of the implementing class. + */ + abstract public static function fromArray (array $array):static; + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $collection->toArray(); + * + * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] + * + * + * @since 1.0.0 + */ + public function toArray ():array { + + return $this->storage; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function jsonSerialize ():array { + + return $this->storage; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function getIterator ():Traversable { + + yield from $this->storage; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @return array An associative array of key/value pairs that represent the serialized form + * of the object. + */ + public function __serialize ():array { + + return $this->storage; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @param array $data

+ * Serialized data. + *

+ */ + public function __unserialize (array $data):void { + + $this->storage = $data; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Collection.php b/src/support/datastructure/firehub.Collection.php index c892bf3d..6d07bfd5 100644 --- a/src/support/datastructure/firehub.Collection.php +++ b/src/support/datastructure/firehub.Collection.php @@ -15,14 +15,7 @@ namespace FireHub\Core\Support\DataStructure; -use FireHub\Core\Support\DataStructure\Contracts\Collection as CollectionContract; -use FireHub\Core\Shared\Contracts\ { - Magic\SerializableConvertable, ArrayConvertable, JsonSerializableConvertable -}; -use FireHub\Core\Support\DataStructure\Traits\ { - Convertable, Enumerable, Shared -}; -use Traversable; +use FireHub\Core\Support\DataStructure\Abstract\Collection as AbstractCollection; /** * ### Collection – High-level, Eager Array-based Data Structure @@ -38,38 +31,9 @@ * @template TKey of array-key * @template TValue * - * @implements \FireHub\Core\Support\DataStructure\Contracts\Collection - * @implements \FireHub\Core\Shared\Contracts\ArrayConvertable - * @implements \FireHub\Core\Shared\Contracts\JsonSerializableConvertable - * @implements \FireHub\Core\Shared\Contracts\Magic\SerializableConvertable - * - * @phpstan-consistent-constructor + * @extends \FireHub\Core\Support\DataStructure\Abstract\Collection */ -class Collection implements CollectionContract, ArrayConvertable, JsonSerializableConvertable, SerializableConvertable { - - /** - * ### Shared Operations for All Data Structures - * @since 1.0.0 - * - * @use \FireHub\Core\Support\DataStructure\Traits\Shared - */ - use Shared; - - /** - * ### Enumerable – Shared Iteration and Transformation Behavior - * @since 1.0.0 - * - * @use \FireHub\Core\Support\DataStructure\Traits\Enumerable - */ - use Enumerable; - - /** - * ### Convertable Trait - * @since 1.0.0 - * - * @use \FireHub\Core\Support\DataStructure\Traits\Convertable - */ - use Convertable; +class Collection extends AbstractCollection { /** * ### Constructor @@ -81,9 +45,13 @@ class Collection implements CollectionContract, ArrayConvertable, JsonSerializab * * @retrun void */ - public function __construct ( - protected(set) array $storage = [] - ) {} + final public function __construct ( + array $storage = [] + ) { + + parent::__construct($storage); + + } /** * {@inheritDoc} @@ -112,76 +80,4 @@ public static function fromArray (array $array):static { } - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructures\Collection; - * - * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $collection->toArray(); - * - * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] - * - * - * @since 1.0.0 - */ - public function toArray ():array { - - return $this->storage; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function jsonSerialize ():array { - - return $this->storage; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function getIterator ():Traversable { - - yield from $this->storage; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @return array An associative array of key/value pairs that represent the serialized form - * of the object. - */ - public function __serialize ():array { - - return $this->storage; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @param array $data

- * Serialized data. - *

- */ - public function __unserialize (array $data):void { - - $this->storage = $data; - - } - } \ No newline at end of file diff --git a/src/support/datastructure/traits/firehub.Shared.php b/src/support/datastructure/traits/firehub.Shared.php index 7d8818e9..f345b280 100644 --- a/src/support/datastructure/traits/firehub.Shared.php +++ b/src/support/datastructure/traits/firehub.Shared.php @@ -16,6 +16,10 @@ namespace FireHub\Core\Support\DataStructure\Traits; use FireHub\Core\Support\LowLevel\Iterator; +use FireHub\Core\Shared\Enums\ControlFlow\Signal; +use FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException; + +use const FireHub\Core\Shared\Constants\Number\MAX; /** * ### Shared Operations for All Data Structures @@ -53,4 +57,83 @@ public function count ():int { } + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $collection->each( + * function ($value, $key):Signal { + * echo $value.','; + * return Signal::CONTINUE; + * }); + * + * // 'John,Jane,Jane,Jane,Richard,Richard,' + * + * + * You can limit the number of elements: + * + * use FireHub\Core\Support\DataStructures\Collection; + * + * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $collection->each( + * function ($value, $key):Signal { + * echo $value.','; + * return Signal::CONTINUE; + * }, limit: 2); + * + * $collection->each(fn($value, $key) => print($value.','), limit: 2); + * + * // 'John,Jane,' + * + * + * You can also stop at any time with returning Signal::BREAK: + * + * use FireHub\Core\Support\DataStructures\Collection; + * use FireHub\Core\Shared\Enums\ControlFlow\Signal; + * + * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $collection->each( + * function ($value, $key):Signal { + * if ($value === 'Richard') return Signal::BREAK; + * echo $value.','; + * return Signal::CONTINUE; + * }); + * + * // 'John,Jane,Jane,Jane,' + * + * + * @since 1.0.0 + */ + public function each (callable $callback, int $limit = MAX):static { + + $counter = 0; + + foreach ($this as $key => $value) { + + if ($counter >= $limit) break; + + $signal = $callback($value, $key); + + $counter++; + + if ($signal === Signal::BREAK) break; + if ($signal === Signal::CONTINUE) continue; + throw WrongReturnTypeException::builder() + ->withContext([ + 'type' => $signal + ]) + ->build(); + + } + + return $this; + + } + } \ No newline at end of file diff --git a/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php b/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php new file mode 100644 index 00000000..71b12566 --- /dev/null +++ b/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php @@ -0,0 +1,33 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Throwable\Exception\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### Datastructure returns wrong type + * @since 1.0.0 + */ +class WrongReturnTypeException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'Datastructure has retuned the wrong type.'; + +} \ No newline at end of file diff --git a/src/throwable/exception/bootstrap/firehub.FailedToLoadBootloaderException.php b/src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php similarity index 91% rename from src/throwable/exception/bootstrap/firehub.FailedToLoadBootloaderException.php rename to src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php index 9d445645..0e6f88d4 100644 --- a/src/throwable/exception/bootstrap/firehub.FailedToLoadBootloaderException.php +++ b/src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php @@ -13,7 +13,7 @@ * @version GIT: $Id$ Blob checksum. */ -namespace FireHub\Core\Throwable\Exception\Bootstrap; +namespace FireHub\Core\Throwable\Exception\Support\Bootstrap; use FireHub\Core\Throwable\Exception; diff --git a/src/throwable/exception/bootstrap/firehub.NotBootloaderException.php b/src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php similarity index 91% rename from src/throwable/exception/bootstrap/firehub.NotBootloaderException.php rename to src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php index fbd0c0df..411e401a 100644 --- a/src/throwable/exception/bootstrap/firehub.NotBootloaderException.php +++ b/src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php @@ -13,7 +13,7 @@ * @version GIT: $Id$ Blob checksum. */ -namespace FireHub\Core\Throwable\Exception\Bootstrap; +namespace FireHub\Core\Throwable\Exception\Support\Bootstrap; use FireHub\Core\Throwable\Exception; diff --git a/tests/unit/FireHubTest.php b/tests/unit/FireHubTest.php index bc589a73..44a17aad 100644 --- a/tests/unit/FireHubTest.php +++ b/tests/unit/FireHubTest.php @@ -39,8 +39,8 @@ final class FireHubTest extends Base { /** * @since 1.0.0 * - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\FailedToLoadBootloaderException - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\NotBootloaderException + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\NotBootloaderException * * @return void */ diff --git a/tests/unit/support/bootstrap/FireHubConfiguratorTest.php b/tests/unit/support/bootstrap/FireHubConfiguratorTest.php index 644866c8..92c6b38f 100644 --- a/tests/unit/support/bootstrap/FireHubConfiguratorTest.php +++ b/tests/unit/support/bootstrap/FireHubConfiguratorTest.php @@ -71,8 +71,8 @@ public function testWithBootloaders (array $bootloaders):void { /** * @since 1.0.0 * - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\FailedToLoadBootloaderException - * @throws \FireHub\Core\Throwable\Exception\Bootstrap\NotBootloaderException + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException + * @throws \FireHub\Core\Throwable\Exception\Support\Bootstrap\NotBootloaderException * * @return void */ From c8630aa04420d2f555ae9db895573a7e32fbbebd Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 1 Apr 2026 12:30:49 +0200 Subject: [PATCH 10/79] Refactor Autoload and Namespace Structure; Add Collection Unit Tests and Data Provider **Details:** - **Namespace Updates:** - Renamed `FireHub\Tests\Unit\Domain\Autoload` namespace to `FireHub\Tests\Unit\Support` for consistency with the test directory structure. - Adjusted relevant `@package` and file metadata annotations for clarity. - **Classmap Refinement:** - Removed unused classmap entries for `Collection2` and `Collection3` from `classmap.php` and `firehub.CompiledClassmap.php` to clean up and streamline the autoload definitions. - **Shared Trait Enhancements:** - Updated `each` method in `firehub.Shared` with additional exceptions: - `WrongReturnTypeException` to enforce stricter validation of callback return signals. - Generic `Throwable` contract for broader error handling. - **New Unit Tests:** - Added `CollectionTest` to test high-level features of the `Collection` data structure: - Includes tests for `toArray`, JSON serialization, and object serialization/deserialization. - Leverages modern PHPUnit features, such as `TestWith` attributes for parameterized testing. - Incorporated a new data provider class (`DataStructureDataProvider`) for reusable data scaffolding in `CollectionTest`. - **Miscellaneous:** - Simplified `$Id` version annotations across modified files for cleaner metadata. These changes improve test coverage, streamline autoload behavior, and enhance the modularity and maintainability of FireHub Core's unit testing and namespace organization. --- src/support/autoload/classmap.php | 2 - .../loader/firehub.CompiledClassmap.php | 8 -- .../datastructure/traits/firehub.Shared.php | 4 + .../firehub.DataStructureDataProvider.php | 38 ++++++++ tests/unit/support/AutoloadTest.php | 2 +- .../support/datastructure/CollectionTest.php | 89 +++++++++++++++++++ 6 files changed, 132 insertions(+), 11 deletions(-) create mode 100644 tests/dataproviders/firehub.DataStructureDataProvider.php create mode 100644 tests/unit/support/datastructure/CollectionTest.php diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index e2eb432e..81bd1766 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -29,8 +29,6 @@ * @return array */ return [ - \Collection2::class => __DIR__.'/../../index.php', - \Collection3::class => __DIR__.'/../../index.php', \FireHub\Core\Domain\Autoload\Handle::class => __DIR__.'/../../domain/autoload/firehub.Handle.php', \FireHub\Core\FireHub::class => __DIR__.'/../../firehub.FireHub.php', \FireHub\Core\Shared\Contracts\ArrayConvertable::class => __DIR__.'/../../shared/contracts/firehub.ArrayConvertable.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index f6eadb6f..6c7a6130 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -42,14 +42,6 @@ public function __invoke (string $class):void { switch ($class) { - case \Collection2::class: - require __DIR__.'/../../../index.php'; - return; - - case \Collection3::class: - require __DIR__.'/../../../index.php'; - return; - case \FireHub\Core\Domain\Autoload\Handle::class: require __DIR__.'/../../../domain/autoload/firehub.Handle.php'; return; diff --git a/src/support/datastructure/traits/firehub.Shared.php b/src/support/datastructure/traits/firehub.Shared.php index f345b280..6936f8f9 100644 --- a/src/support/datastructure/traits/firehub.Shared.php +++ b/src/support/datastructure/traits/firehub.Shared.php @@ -108,6 +108,10 @@ public function count ():int { * // 'John,Jane,Jane,Jane,' * * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException If the callback returns + * an invalid signal. + * * @since 1.0.0 */ public function each (callable $callback, int $limit = MAX):static { diff --git a/tests/dataproviders/firehub.DataStructureDataProvider.php b/tests/dataproviders/firehub.DataStructureDataProvider.php new file mode 100644 index 00000000..c695a160 --- /dev/null +++ b/tests/dataproviders/firehub.DataStructureDataProvider.php @@ -0,0 +1,38 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @package Core\Test + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Tests\DataProviders; + +use FireHub\Core\Support\DataStructure\Collection; + +/** + * ### Datastructure data provider + * @since 1.0.0 + */ +final class DataStructureDataProvider { + + /** + * @since 1.0.0 + * + * @return array + */ + public static function collection ():array { + + return [ + [new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'])] + ]; + + } + +} \ No newline at end of file diff --git a/tests/unit/support/AutoloadTest.php b/tests/unit/support/AutoloadTest.php index 38908cfa..78c864fe 100644 --- a/tests/unit/support/AutoloadTest.php +++ b/tests/unit/support/AutoloadTest.php @@ -12,7 +12,7 @@ * @version GIT: $Id$ Blob checksum. */ -namespace FireHub\Tests\Unit\Domain\Autoload; +namespace FireHub\Tests\Unit\Support; use FireHub\Core\Testing\Base; use FireHub\Core\Support\Autoload; diff --git a/tests/unit/support/datastructure/CollectionTest.php b/tests/unit/support/datastructure/CollectionTest.php new file mode 100644 index 00000000..9c05fa52 --- /dev/null +++ b/tests/unit/support/datastructure/CollectionTest.php @@ -0,0 +1,89 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @package Core\Test + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Tests\Unit\Support\DataStructure; + +use FireHub\Core\Testing\Base; +use FireHub\Core\Support\DataStructure\Collection; +use FireHub\Tests\DataProviders\DataStructureDataProvider; +use PHPUnit\Framework\Attributes\ { + CoversClass, DataProviderExternal, Group, Small, TestWith +}; + +/** + * ### Test High-level, Eager Array-based Data Structure + * @since 1.0.0 + */ +#[Small] +#[Group('support')] +#[CoversClass(Collection::class)] +final class CollectionTest extends Base { + + /** + * @since 1.0.0 + * + * @param array $array + * + * @return void + */ + #[TestWith([[1,2,3]])] + public function testIsList (array $array):void { + + self::assertSame($array, new Collection($array)->toArray()); + + } + + /** + * @since 1.0.0 + * + * @param array $array + * + * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\EncodeError + * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\DecodeError + * + * @return void + */ + #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] + public function testJson (array $array):void { + + $collection = new Collection($array); + + $json = $collection->toJson(); + + self::assertSame('{"firstname":"John","lastname":"Doe","age":25,"10":2}', $json); + self::assertEquals($collection, Collection::fromJson($json)); + + } + + /** + * @since 1.0.0 + * + * @param array $array + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\UnserializeFailedError + * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\CannotSerializeError + * + * @return void + */ + #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] + public function testSerialize (array $array):void { + + $collection = new Collection($array); + + self::assertEquals($collection, $collection::unserialize($collection->serialize())); + + } + +} \ No newline at end of file From 642df48165283165b9aeaf9c1ebd497403423c62 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 1 Apr 2026 15:20:30 +0200 Subject: [PATCH 11/79] Rename `Collection` to `ArrayCollection`, Refactor Abstract Base, Add Transformable Capability, Update Tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Details:** - **Class Renaming:** - Renamed `Collection` to `ArrayCollection` to better align with its array-based implementation and improve clarity across the framework. - **Abstract Base Class Updates:** - Updated `Abstract\Collection` to `Abstract\ArrayCollection`, ensuring consistent naming patterns for array-based data structures. - Refined docblocks and property descriptions to highlight array-backed design. - **New `Transformable` Contract:** - Introduced `Transformable` interface for functional transformation capabilities, including `map` method support. - Extended `ArrayCollection` and its abstract base to implement `Transformable` contract for consistent immutable-style transformations. - **Classmap and Autoloader:** - Adjusted `classmap.php` and `firehub.CompiledClassmap.php` to reflect renaming (`Collection` → `ArrayCollection`) and include the new `Transformable` contract. - Removed stale references to old naming. - **Unit Tests:** - Replaced `CollectionTest` with `ArrayCollectionTest` to test the renamed class. - Improved test cases for `map`, serialization, and JSON conversion functionality. - Enhanced `DataStructureDataProvider` to use `ArrayCollection`. - **Miscellaneous:** - Simplified `$Id` metadata annotations for better tracking. - Updated examples and docblocks in shared traits and implementations to reflect the renaming and new capabilities. These changes improve code clarity, introduce functional transformation utilities, and ensure tests fully align with the updated class structure. --- src/support/autoload/classmap.php | 5 +- .../loader/firehub.CompiledClassmap.php | 12 +- ...ection.php => firehub.ArrayCollection.php} | 42 ++-- .../capability/firehub.Transformable.php | 56 ++++++ ...ection.php => firehub.ArrayCollection.php} | 25 ++- .../datastructure/traits/firehub.Shared.php | 35 ++-- .../firehub.DataStructureDataProvider.php | 4 +- .../datastructure/ArrayCollectionTest.php | 185 ++++++++++++++++++ .../support/datastructure/CollectionTest.php | 89 --------- 9 files changed, 318 insertions(+), 135 deletions(-) rename src/support/datastructure/abstract/{firehub.Collection.php => firehub.ArrayCollection.php} (69%) create mode 100644 src/support/datastructure/contracts/capability/firehub.Transformable.php rename src/support/datastructure/{firehub.Collection.php => firehub.ArrayCollection.php} (53%) create mode 100644 tests/unit/support/datastructure/ArrayCollectionTest.php delete mode 100644 tests/unit/support/datastructure/CollectionTest.php diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index 81bd1766..9e57b7e7 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -80,8 +80,9 @@ \FireHub\Core\Support\Bootstrap\Bootloader\RegisterHelpers::class => __DIR__.'/../../support/bootstrap/bootloader/firehub.RegisterHelpers.php', \FireHub\Core\Support\Bootstrap\FireHubConfigurator::class => __DIR__.'/../../support/bootstrap/firehub.FireHubConfigurator.php', \FireHub\Core\Support\Contracts\DataStructure::class => __DIR__.'/../../support/contracts/firehub.DataStructure.php', - \FireHub\Core\Support\DataStructure\Abstract\Collection::class => __DIR__.'/../../support/datastructure/abstract/firehub.Collection.php', - \FireHub\Core\Support\DataStructure\Collection::class => __DIR__.'/../../support/datastructure/firehub.Collection.php', + \FireHub\Core\Support\DataStructure\Abstract\ArrayCollection::class => __DIR__.'/../../support/datastructure/abstract/firehub.ArrayCollection.php', + \FireHub\Core\Support\DataStructure\ArrayCollection::class => __DIR__.'/../../support/datastructure/firehub.ArrayCollection.php', + \FireHub\Core\Support\DataStructure\Contracts\Capability\Transformable::class => __DIR__.'/../../support/datastructure/contracts/capability/firehub.Transformable.php', \FireHub\Core\Support\DataStructure\Contracts\Collection::class => __DIR__.'/../../support/datastructure/contracts/firehub.Collection.php', \FireHub\Core\Support\DataStructure\Traits\Convertable::class => __DIR__.'/../../support/datastructure/traits/firehub.Convertable.php', \FireHub\Core\Support\DataStructure\Traits\Enumerable::class => __DIR__.'/../../support/datastructure/traits/firehub.Enumerable.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 6c7a6130..0418621c 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -246,12 +246,16 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/contracts/firehub.DataStructure.php'; return; - case \FireHub\Core\Support\DataStructure\Abstract\Collection::class: - require __DIR__.'/../../../support/datastructure/abstract/firehub.Collection.php'; + case \FireHub\Core\Support\DataStructure\Abstract\ArrayCollection::class: + require __DIR__.'/../../../support/datastructure/abstract/firehub.ArrayCollection.php'; return; - case \FireHub\Core\Support\DataStructure\Collection::class: - require __DIR__.'/../../../support/datastructure/firehub.Collection.php'; + case \FireHub\Core\Support\DataStructure\ArrayCollection::class: + require __DIR__.'/../../../support/datastructure/firehub.ArrayCollection.php'; + return; + + case \FireHub\Core\Support\DataStructure\Contracts\Capability\Transformable::class: + require __DIR__.'/../../../support/datastructure/contracts/capability/firehub.Transformable.php'; return; case \FireHub\Core\Support\DataStructure\Contracts\Collection::class: diff --git a/src/support/datastructure/abstract/firehub.Collection.php b/src/support/datastructure/abstract/firehub.ArrayCollection.php similarity index 69% rename from src/support/datastructure/abstract/firehub.Collection.php rename to src/support/datastructure/abstract/firehub.ArrayCollection.php index 1a74251e..5a83bfe4 100644 --- a/src/support/datastructure/abstract/firehub.Collection.php +++ b/src/support/datastructure/abstract/firehub.ArrayCollection.php @@ -15,7 +15,8 @@ namespace FireHub\Core\Support\DataStructure\Abstract; -use FireHub\Core\Support\DataStructure\Contracts\Collection as CollectionContract; +use FireHub\Core\Support\DataStructure\Contracts\Collection; +use FireHub\Core\Support\DataStructure\Contracts\Capability\Transformable; use FireHub\Core\Shared\Contracts\ { Magic\SerializableConvertable, ArrayConvertable, JsonSerializableConvertable }; @@ -25,14 +26,14 @@ use Traversable; /** - * ### Abstract collection base + * ### Abstract Array-Backed Collection Base * - * Serves as the foundational implementation for all high-level collection types within the FireHub framework.
- * Defines shared behavior such as iteration, reduction, and transformation while delegating structural rules and - * constraints to concrete implementations. + * Provides a base implementation for collections backed by a native array storage. It defines the core behavior for + * iteration, internal storage handling, and shared collection operations, while leaving concrete instantiation + * details to child classes. * - * Enables extensibility and consistency across generic and specialized data structures without imposing specific key - * or value semantics. + * This abstract class serves as the foundational layer for array-based data structures within the FireHub ecosystem, + * enabling consistent behavior across derived implementations such as lists, maps, and specialized collections. * @since 1.0.0 * * @template TKey of array-key @@ -42,8 +43,12 @@ * @implements \FireHub\Core\Shared\Contracts\ArrayConvertable * @implements \FireHub\Core\Shared\Contracts\JsonSerializableConvertable * @implements \FireHub\Core\Shared\Contracts\Magic\SerializableConvertable + * @implements \FireHub\Core\Support\DataStructure\Contracts\Capability\Transformable + * + * @phpstan-consistent-constructor */ -abstract class Collection implements CollectionContract, ArrayConvertable, JsonSerializableConvertable, SerializableConvertable { +abstract class ArrayCollection implements Collection, ArrayConvertable, JsonSerializableConvertable, + SerializableConvertable, Transformable { /** * ### Shared Operations for All Data Structures @@ -102,13 +107,13 @@ abstract public static function fromArray (array $array):static; * {@inheritDoc} * * - * use FireHub\Core\Support\DataStructures\Collection; + * use FireHub\Core\Support\DataStructures\ArrayCollection; * - * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * $collection = new ArrayCollection(['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]); * * $collection->toArray(); * - * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] + * // ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] * * * @since 1.0.0 @@ -119,6 +124,21 @@ public function toArray ():array { } + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function map (callable $callback):static { + + $storage = []; + + foreach ($this->storage as $key => $value) $storage[$key] = $callback($value, $key); + + return new static($storage); + + } + /** * @inheritDoc * diff --git a/src/support/datastructure/contracts/capability/firehub.Transformable.php b/src/support/datastructure/contracts/capability/firehub.Transformable.php new file mode 100644 index 00000000..8fa65fa9 --- /dev/null +++ b/src/support/datastructure/contracts/capability/firehub.Transformable.php @@ -0,0 +1,56 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Core\Support\DataStructure\Contracts\Capability; + +/** + * ### Transformable Data Structure Capability + * + * Provides a functional transformation contract for data structures, enabling value-level operations such as mapping + * and reduction without altering the underlying structural semantics.
+ * This capability focuses on immutable-style transformations, where operations produce derived results or new + * instances rather than mutating the original structure. It is designed to be composable across different + * data structure types, including collections, graphs, and other iterable forms, as long as a deterministic + * traversal can be established.
+ * Transformable represents the foundational layer of data processing within the FireHub ecosystem, serving as the basis + * for higher-level operations such as filtering, partitioning, and pipeline composition. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +interface Transformable { + + /** + * ### Map Values Transformation + * + * Transforms each element of the data structure by applying the given callback and returns a new instance + * containing the transformed values. The original structure remains unchanged.
+ * This operation preserves the structural shape (e.g., order and keys, where applicable) while modifying only the + * values. It represents a fundamental, immutable transformation used as the basis for higher-level data processing + * operations. + * @since 1.0.0 + * + * @template TReturnValue + * + * @param callable(TValue, TKey):TReturnValue $callback

+ * A callback function that takes the value and key of each element and returns a transformed value. + *

+ * + * @return static A new instance of the same type containing the mapped values. + */ + public function map (callable $callback):static; + +} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Collection.php b/src/support/datastructure/firehub.ArrayCollection.php similarity index 53% rename from src/support/datastructure/firehub.Collection.php rename to src/support/datastructure/firehub.ArrayCollection.php index 6d07bfd5..7e3c752b 100644 --- a/src/support/datastructure/firehub.Collection.php +++ b/src/support/datastructure/firehub.ArrayCollection.php @@ -15,25 +15,24 @@ namespace FireHub\Core\Support\DataStructure; -use FireHub\Core\Support\DataStructure\Abstract\Collection as AbstractCollection; +use FireHub\Core\Support\DataStructure\Abstract\ArrayCollection as AbstractArrayCollection; /** - * ### Collection – High-level, Eager Array-based Data Structure + * ### Concrete Array-Based Collection Implementation * - * Provides a concrete, high-level implementation of the DataStructure contract based on native PHP arrays. - * The Collection operates using an eager evaluation model and offers a consistent, type-safe API for working with - * in-memory array data, including iteration, transformation, and utility operations. - * This implementation is intentionally designed as a general-purpose wrapper around arrays and does not aim to - * represent or replace specialized data structures such as lazy collections, fixed-size arrays, or other advanced - * structures. It serves as the foundational data container within FireHub Core Foundation. + * Represents a concrete collection implementation backed by a native array, providing a general-purpose, ready-to-use + * data structure with full support for collection operations. + * + * It extends the abstract array-backed base and exposes a complete, consistent API for working with ordered or + * key-based data, making it the default implementation for most use cases within the FireHub framework. * @since 1.0.0 * * @template TKey of array-key * @template TValue * - * @extends \FireHub\Core\Support\DataStructure\Abstract\Collection + * @extends \FireHub\Core\Support\DataStructure\Abstract\ArrayCollection */ -class Collection extends AbstractCollection { +class ArrayCollection extends AbstractArrayCollection { /** * ### Constructor @@ -57,11 +56,11 @@ final public function __construct ( * {@inheritDoc} * * - * use FireHub\Core\Support\DataStructures\Collection; + * use FireHub\Core\Support\DataStructures\ArrayCollection; * - * $collection = Collection::fromArray(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * $collection = ArrayCollection::fromArray(['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]); * - * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] + * // ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] * * * @since 1.0.0 diff --git a/src/support/datastructure/traits/firehub.Shared.php b/src/support/datastructure/traits/firehub.Shared.php index 6936f8f9..7c340e7f 100644 --- a/src/support/datastructure/traits/firehub.Shared.php +++ b/src/support/datastructure/traits/firehub.Shared.php @@ -40,11 +40,11 @@ trait Shared { * * use FireHub\Core\Support\DataStructures\Collection; * - * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * $collection = new ArrayCollection(['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]); * * $collection->count(); * - * // 6 + * // 4 * * * @since 1.0.0 @@ -61,43 +61,48 @@ public function count ():int { * {@inheritDoc} * * - * use FireHub\Core\Support\DataStructures\Collection; + * use FireHub\Core\Support\DataStructures\ArrayCollection; * - * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * $collection = new ArrayCollection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); * + * $called = []; * $collection->each( * function ($value, $key):Signal { - * echo $value.','; + * $called[] = $value; * return Signal::CONTINUE; * }); * - * // 'John,Jane,Jane,Jane,Richard,Richard,' + * print $called; + * + * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] * * * You can limit the number of elements: * - * use FireHub\Core\Support\DataStructures\Collection; + * use FireHub\Core\Support\DataStructures\ArrayCollection; * - * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * $collection = new ArrayCollection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); * + * $called = []; * $collection->each( * function ($value, $key):Signal { - * echo $value.','; + * $called[] = $value; * return Signal::CONTINUE; * }, limit: 2); * - * $collection->each(fn($value, $key) => print($value.','), limit: 2); + * print $called; * - * // 'John,Jane,' + * // ['John', 'Jane'] * * * You can also stop at any time with returning Signal::BREAK: * - * use FireHub\Core\Support\DataStructures\Collection; + * use FireHub\Core\Support\DataStructures\ArrayCollection; * use FireHub\Core\Shared\Enums\ControlFlow\Signal; * - * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * $collection = new ArrayCollection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); * + * $called = []; * $collection->each( * function ($value, $key):Signal { * if ($value === 'Richard') return Signal::BREAK; @@ -105,7 +110,9 @@ public function count ():int { * return Signal::CONTINUE; * }); * - * // 'John,Jane,Jane,Jane,' + * print $called; + * + * // ['John', 'Jane', 'Jane', 'Jane'] * * * @throws \FireHub\Core\Shared\Contracts\Throwable diff --git a/tests/dataproviders/firehub.DataStructureDataProvider.php b/tests/dataproviders/firehub.DataStructureDataProvider.php index c695a160..03f95f74 100644 --- a/tests/dataproviders/firehub.DataStructureDataProvider.php +++ b/tests/dataproviders/firehub.DataStructureDataProvider.php @@ -14,7 +14,7 @@ namespace FireHub\Tests\DataProviders; -use FireHub\Core\Support\DataStructure\Collection; +use FireHub\Core\Support\DataStructure\ArrayCollection; /** * ### Datastructure data provider @@ -30,7 +30,7 @@ final class DataStructureDataProvider { public static function collection ():array { return [ - [new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'])] + [new ArrayCollection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'])] ]; } diff --git a/tests/unit/support/datastructure/ArrayCollectionTest.php b/tests/unit/support/datastructure/ArrayCollectionTest.php new file mode 100644 index 00000000..6042b204 --- /dev/null +++ b/tests/unit/support/datastructure/ArrayCollectionTest.php @@ -0,0 +1,185 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @package Core\Test + * + * @version GIT: $Id$ Blob checksum. + */ + +namespace FireHub\Tests\Unit\Support\DataStructure; + +use FireHub\Core\Testing\Base; +use FireHub\Core\Support\DataStructure\ArrayCollection; +use FireHub\Core\Shared\Enums\ControlFlow\Signal; +use FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException; +use PHPUnit\Framework\Attributes\ { + CoversClass, Group, Small, TestWith +}; + +/** + * ### Test High-level, Eager Array-based Data Structure + * @since 1.0.0 + */ +#[Small] +#[Group('support')] +#[CoversClass(ArrayCollection::class)] +final class ArrayCollectionTest extends Base { + + /** + * @since 1.0.0 + * + * @param array $array + * + * @return void + */ + #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] + public function testFromArray (array $array):void { + + self::assertEquals(new ArrayCollection($array), ArrayCollection::fromArray($array)); + + } + + /** + * @since 1.0.0 + * + * @param int $expected + * @param array $array + * + * @return void + */ + #[TestWith([4, ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] + public function testCount (int $expected, array $array):void { + + self::assertSame($expected, new ArrayCollection($array)->count()); + + } + + /** + * @since 1.0.0 + * + * @param array $array + * + * @return void + */ + #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] + public function testToArray (array $array):void { + + self::assertSame($array, new ArrayCollection($array)->toArray()); + + } + + /** + * @since 1.0.0 + * + * @param array $array + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException + * + * @return void + */ + #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testEach (array $array):void { + + $collection = new ArrayCollection($array); + + $called = []; + $collection->each(function ($value, $key) use (&$called):Signal { + $called[] = $value; + return Signal::CONTINUE; + }); + + self::assertSame(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'], $called); + + $called = []; + $collection->each(function ($value, $key) use (&$called):Signal { + if ($value === 'Richard') return Signal::BREAK; + $called[] = $value; + return Signal::CONTINUE; + }, limit: 2); + + self::assertSame(['John', 'Jane'], $called); + + $called = []; + $collection->each(function ($value, $key) use (&$called):Signal { + if ($value === 'Richard') return Signal::BREAK; + $called[] = $value; + return Signal::CONTINUE; + }); + + self::assertSame(['John', 'Jane', 'Jane', 'Jane'], $called); + + } + + /** + * @since 1.0.0 + * + * @param array $array + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * + * @return void + */ + #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testEachFillOutOfRangeWithNegativeNumber (array $array):void { + + $this->expectException(WrongReturnTypeException::class); + + $called = []; + new ArrayCollection($array)->each(function ($value, $key) use (&$called) { + if ($value === 'Richard') return false; + $called[] = $value; + return Signal::CONTINUE; + }); + + } + + /** + * @since 1.0.0 + * + * @param array $array + * + * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\EncodeError + * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\DecodeError + * + * @return void + */ + #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] + public function testJson (array $array):void { + + $collection = new ArrayCollection($array); + + $json = $collection->toJson(); + + self::assertSame('{"firstname":"John","lastname":"Doe","age":25,"10":2}', $json); + self::assertEquals($collection, ArrayCollection::fromJson($json)); + + } + + /** + * @since 1.0.0 + * + * @param array $array + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\UnserializeFailedError + * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\CannotSerializeError + * + * @return void + */ + #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] + public function testSerialize (array $array):void { + + $collection = new ArrayCollection($array); + + self::assertEquals($collection, $collection::unserialize($collection->serialize())); + + } + +} \ No newline at end of file diff --git a/tests/unit/support/datastructure/CollectionTest.php b/tests/unit/support/datastructure/CollectionTest.php deleted file mode 100644 index 9c05fa52..00000000 --- a/tests/unit/support/datastructure/CollectionTest.php +++ /dev/null @@ -1,89 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. - */ - -namespace FireHub\Tests\Unit\Support\DataStructure; - -use FireHub\Core\Testing\Base; -use FireHub\Core\Support\DataStructure\Collection; -use FireHub\Tests\DataProviders\DataStructureDataProvider; -use PHPUnit\Framework\Attributes\ { - CoversClass, DataProviderExternal, Group, Small, TestWith -}; - -/** - * ### Test High-level, Eager Array-based Data Structure - * @since 1.0.0 - */ -#[Small] -#[Group('support')] -#[CoversClass(Collection::class)] -final class CollectionTest extends Base { - - /** - * @since 1.0.0 - * - * @param array $array - * - * @return void - */ - #[TestWith([[1,2,3]])] - public function testIsList (array $array):void { - - self::assertSame($array, new Collection($array)->toArray()); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\EncodeError - * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\DecodeError - * - * @return void - */ - #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] - public function testJson (array $array):void { - - $collection = new Collection($array); - - $json = $collection->toJson(); - - self::assertSame('{"firstname":"John","lastname":"Doe","age":25,"10":2}', $json); - self::assertEquals($collection, Collection::fromJson($json)); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @throws \FireHub\Core\Shared\Contracts\Throwable - * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\UnserializeFailedError - * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\CannotSerializeError - * - * @return void - */ - #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] - public function testSerialize (array $array):void { - - $collection = new Collection($array); - - self::assertEquals($collection, $collection::unserialize($collection->serialize())); - - } - -} \ No newline at end of file From 297943e0355578c59b1b9e7c0ae4d5709f153d09 Mon Sep 17 00:00:00 2001 From: Riddick Date: Thu, 2 Apr 2026 12:00:23 +0200 Subject: [PATCH 12/79] Update public key files with new key data --- phar/core.min.phar | Bin 207944 -> 211638 bytes phar/core.min.phar.pubkey | 26 +++++++++++++------------- phar/core.phar | Bin 685830 -> 697936 bytes phar/core.phar.pubkey | 26 +++++++++++++------------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/phar/core.min.phar b/phar/core.min.phar index c794d3802cb280edbf1257414df6cf2104fc12b4..2e4e57d677bd0b1782a9d6d6ce5a51e179a76f59 100644 GIT binary patch delta 4931 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 delta 3084 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 delta 4370 zcmai130PBC7EazJBqR_61OmwNL{XNoD6%M2RuQNmR#e=;NAi$pNJ0`+>H^f2iimyM z+nG_JP{(TPN-@+bbrf{8Dp<8zwH2+kqGM~PE!wJO?z^sN-)YLQFMv*J` z0Jy*>hbSj;9>C$aozysNeUF-et+ycSnkUvQPAKx>6hHzS(kX?ECy*f~9?QUF>~S8D zJg#<0cs<=N9b=>26pWAUNdEaKA{``rgz`t@gVUlEj0*cWjM?@iP@VlmyuM*S0b`Ju z2rCxH;B}*z_+JwfKTkd93~T%pftO2TzZ?6B2$l2nXg z4v82`9fVB5sC)wBR9X_V22-IVgpab99z-6;Tr3 z6r*0xYOFe=f$#3euEdwe;49Z&;YMOpqA9_dXsvZlRh$qJLmuB%Gya^Hi#M#hNI8n* zeDMkA>=K3fXSj^PxXL9S_vafl)|}JwB-iI)%pPM7r_^BJo`MVpL&3Jb*Elb_WY`3|S-cc%Yp4gAeRpef1SB=DR9;;?zoa!+L zV~Yoi(Z`d_K&j_+y#CB{HpXDDxfs`b5x;w0#4mGj9#+yv2?WP)h6Hm$j{q*h+Znc+ zDV0Km=7Ap+9<%;Q$A!Y{d{L&yCuHG81MMb z!YL^f^e=Uhzi~hKj^oz(De689ozh{Id-EbN_66XI=j9$tG6 zA;OmSUUgt-8kg@80FSPw+~K||%1!Yb z$*SWq9ZZYow)w}xdoI9L+(S;dwqYcZDuAFVfDr2nAQcZEPSzWSlk>a7Nf}Z{%*Kg- zL2-`unE#HH20+DHDoFg#{>Z{WLUDFrK9+JMkij@4h(xRkBInnGNaU#CTzp;=oQor0 zLvhYl)}KV(iiO|%17}VVK%Q;!AzEw^fU11JP}6v`WU6(a&E;fepp~a7#JqL-!E)gIGK>k;iP9{BeXd4 zyAfn!evNnyud_$?_h=+3nP?Ol?vj4IG|GtWCPXg4*b-TSF<>+)RCPZ-7)^$oFZG_5 zn04IMXd0T5L6ky@3cwFGkFvc#cW^%rS8*Gn9bnCNO0DSUtK)I@mG2t3?r{FpAIcjk zFL4riuyIb&Wd4o)cs{xi7gva$sxhUXt>F~0p_o=;>}ZUOV#z(-5*v%x4`UOs!%akj zvCLh_wZ-~Er@x|?Zl?^><4VThr$Y1IG5HS7ZYh&R(D)t|#L?576-A6rZ=tP5Cn?Q; zg1L9I#&EZ?Vz?pMaWD}AXV_3Kb!c9naSZ%_r{*Eqx#9sc>&!OTR zp1(py!HpVfC_H+T!Y>!ui?1t@umE1#=Nhx!yyN`!5{PK_oO3zC2*Ke2;hLOjTVIgM1n^y(!qnfo`o)A9#6EJdvH>+$7 zP2dR_;4gEh84LZQ&nZTO)y!zDFzGZH4C~ebDGXZ!F2T+wAgj1l$s=~Twb&{M4DGL5y&%%bTJ<}W(OY+R_*vKE@5HAaKR%vxDB zT|5wp)|Hs_Yzb?yGW-`A+E_$ei&-3OAQp10Ak=7*3fUQu`9hY?Nzb7fo`eP62`F1G z@_nI*Hkw#7V@1i!EIPwHnlaEU=FKi-^kpPriBZey(TNtNE@I97JS{ql6>(D2)^ZaY zYGEphSUM>ugDx_f=|x8K0zTRzowXPz)fqxd*b<|;oKT^)s1j;gXVB=&w7j9t%CkV~ zP&hMVu%I9%{cApNnN_FPS zJ&!e@T>4N`nb~Btu=FA`V?s4R#EfMq6)6=~t2Lss7>rh$(Up*=RWNO4O=i}Dg40MQ zTId-KOIu8=Mpw+}b+4l&yfoVKyvY{YQl=^9GwYex%Tb%2KTIrYx=6Q})rMM-SASMD zAJmANi`ZxvG6oH+#npQeEsV~v!mMiG9f;GQaj`Nwqz6}8XQ0z`W;VU75H;A$(rLUP zXgmYLVAoEdhN^YI3+8-DiSbSSV#sYRZvv$dhSh)&dySs4SZG*M18B*>w6CuL5keYP z9idckSTk^k4ZDDy4Xg)S0j&Q7FfjEapb+6nhw{T96V`tO7TenDfW46GS}lfq3#1CT zdJo8jeH?mTWwnAkP{{#bn0*QOz_7zW1@n)BD5#hxm2ipc2EjHCyklFo8GLC6yE=dj zs!pSyblvSjN3IfzxSB1lwlDXA1)jF2r$HeFyIK*2uCu^f7!9jF1{#=i4y?CL(o0i> zYX)5f=(0nX2wnE*5~E9E8+6s7qXHhV0zY_khSU|#EtERj@(j|G)W2`eFO`N;u%4A3 zgu||Zp|?pf{jv<&Cx22ji|_7I_p?_YTLCv!wL^&mY-C}vbX>K z#ap+JwZ3!v{7<{$pUA^|?&NR}s2RuO{2ouWZNI+fQ`IM1RhvA{7<#AJKG-DlabONV zx_PAgV!~$|`quycY;51(sKdV$^n9~+N?(hc+WGCDo*aDe+QioaF5PbJ@XIvoyeyM7 zbAD=nBk{gN{e_B(g5d9))_z<0vZ_BrV(OJxV3vj_2XRUIpzuMQ$y#J19gqkbDJ)H{Qy3ST5|FJ)3{3)KHPC; zMBD1bv^Hg(Drhw&KOrBN-h6M!B{}xl)gUD4EpYGfJiNNdEh7&RFO5K5u-pAaE)X|l$^(m Date: Thu, 2 Apr 2026 12:19:59 +0200 Subject: [PATCH 13/79] chore: add ext-openssl requirement to composer.json --- composer.json | 1 + phar/core.min.phar | Bin 211638 -> 211638 bytes phar/core.phar | Bin 697936 -> 697936 bytes 3 files changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 5dd05fab..74238f2b 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,7 @@ "license": "Apache-2.0", "require": { "php": "^8.5", + "ext-openssl": "*", "ext-mbstring": "*" }, "require-dev": { diff --git a/phar/core.min.phar b/phar/core.min.phar index 2e4e57d677bd0b1782a9d6d6ce5a51e179a76f59..55cdfd2483401f99e4bc8e651ad0c8a807a37253 100644 GIT binary patch delta 2204 zcmXw3X;f2J5Y7X#l8`_kgnf}9VTtSsiy)gI60jYI>l&v=Y$l#}8d z)e8k`k6sK?od_B&)=@e@5_B7lDufVoWU9HU9Lh_PO7tfK_kliEH!%nYE6HF2zjlmnE=t^V5?JO&xQTg2 zxU5@7*n!TU2(ih0?7p3klz#pUa3%;Q0qhqbrB8r0LyS?xMq}LWQ)7Ri2uu)SOaj4L zWil2QlBrLlX)PLFk(*4UqAB5UUo;LIQpa*>w3-gOoaC8FOd_+h@-r7?&jz{`)t{2H z(iB(PWQtc%-%QtFGu7a#)V&-V#1<76Kn9J087s_?dfg2BjF{nR2Z``3mW%L~Tod8? z2y={u>Y&sd@6#P~Z&<@8^HhMTVqE4~@f@(MEpYoPi)65xEz$v`mYD#RmYC3Ei3t;| zrsH^TsrT@!v(ld=#1hie+E{aJzHV7&kJa(-Oo~f;E z3Q(5W<^putreX2-R2g#ny8C3mZHVSK4k2KGha&8^O9S3_9i-c%q-*xm!6|k?xyyCX z?tl{HjwpVsBU1VuF=5xkE22} ztR{qvE}e{PPFP$dK`4}wQDa9KlL868 z?jW~pjI*gf059mwM~G`C*%QW$KXqe#aYMx^?zp21?)aQp9thJtu*XRc?8ug3|JgFs z)+o~*6X-U|IChvSEUA$Ye9fC}gxUW)DjAb(2yf~YMOq`0kPZ&c8bK`~&;+^=wu~X2 zf&kBKm}H+P-igniQ@~Ps>5j(>S7+djH#A=dkGxet8Sj%1aMq^)z{wYPwN3|beK9@S z4=-Q6AKnVCKUxJkc;KG}d4BRdTo995kkR9>gQU#YoUHO^lQZR(8bKXlS*^fDG8A&4 zhbsI47Ax>^omB*Y)vv&Z=M{ifegIf2PXw$z5kOox5uo?=n>wznzVAxm+<}O-qfhq z-}_dr3jP)utF=$E`~J&Mx8r8+tPbW~j0zpdif`?<+B4*OD}F=D%ZPTz@b4YG#M^%z zH2qLKF7x-xm-9Z~D^-7Rno*KY2INghu3Ov`$6Gq&d-2Apw-d*7*Y12??R8EV7?kay zsB_X(-=~8#r|cQ-hc~${9iH&Q%Jg1^Ur&h-r+2-GReUMtOG|G>vuA^{K!0A__`8gl z=6l?Bfq+cpWH-k(jY>IkaNq6***Rv_?4n~6-#xDEDQ(()X@kcG|D|pno27b*@^{^* zmynBjja?rr2jz`c75}K4f`3$~TWX?)J$!0yTN`#ASe|o)m!RG2@9EXDXk=jD;EFt& zm0CZLU*i8bwa{>&usT7}X!k@cE!tbJm5N46&+M3-#0>R{ad@=Uk~KTFvY_pe$tSnd z)4!}fl-4%1O~h=h)+khSviu%i^{da_HGc|yS%qV4%r?(w5h>Btf`)F{O&axEH>R$9 IbhtA7KM=-ifB*mh delta 2204 zcmXw3c~Dbl5YG!q2q70&NH8Erf&{tG1Q0Nw90k14DuRNDK&2RuQAf0#1;-2FDS;`q z;7N5v6hzwsY7s9+pjN4z@fAR;nI<_uj_4VaFM4>a zX39x%YUn{g9i)dNRYuTgk+zC4l3-eDHGzbf zKs6&4V3H9A5X@WzP{c&$eP$?F0#*P(Gz*=@tZ1-avcdrz^ihARz7nizeP4iQ`j{YQ zhk%v94nc`0DKUiyTCR}290{4jHX*YI*kmu80i3_s*w@)$Ay^s%ob9p!bSmXUf-j1L z43dM4ZVt|1VHgOpIKw3X7YtF^lp$*I;<|$~m5Y+9xTy0_?qYDxC_-a| zaAQBP3XB)vLXz}ow0n}<{p1m2g=mEu4vayE1M5f!yj?zilnU8vo#F`t)(-+a%7rFD znERF@aIP_j$SzYkKQw7a5@auABj<(*&ictjjnoBP8m+9C=}Yp=X$r(x8QZ@p8 z4%MHMlW&SEy<>`3P|r-);3(CgN#T@-4I;O1$%G6V3o~-fklJE~eP+$@wEabR7Fi;^ zCCwsSA7PHMARX*8$NSW3?g49Cuh&O>HmEiU@lGR{6kR$*oERp~YSzyAT z1tvtyS%c%fq25EgeY6irh~=c4)JR*KNtm0SvT{Sq?cq=^7cQmiVnM9^5`vEQ@A zGqtjc1Iiw&bb!}Z@mPGEDnnN6?;uC50<{l0gpdUuicmc_9(bR1kYJ6HnyuG>Q*48B zvvly%1||5~qWELBNEx-o^k_S@YV1~Hw*jj5gRq@oJYJMC;Q7~ofVg(4HDSc+(~U7b9~H+r;f}63;d5p?Bdl@89(B&x(ZB`! zZ*)OzZ7#ZF0^R(?^Jl2S@-jIg&<-Cb%>LieUf0!z@TU4HQlUsr+Su4@h2?}$>*qjN zu|Db)sN7Ouk}5a66aTuc04v&EcRcR6I)(?{&4WU-F{x!%`8D?CS7lqzwN zETu2dgOuI?JC*pj8k8!qMwR&R+*N30sKCmvRTb5$h-7n7Cc)XJ^HFc_Sak zLq@cYifyMH1xvOxw%~8sy3fD)V}4hCHWIPd#2%lbWZt*?QccyCvIDRCGu7NOAUV zu%x?^HORK8+vrn5M3j7Uwphp=DXmRmCK2&Ux=& z+g~iIyK0-wikrOjDqyPoH`85A^`Xp{A*%CIzni5uM{W_1_DvJ#r3bTCCoCMzT7Hvx zX1Ji-SMe~oD2g6s*Lr==5VJS@K%X>t;Hh=Edc1PU!){ke{0CKj`jJUtbJ`_3jry${ LQ&&Dr9j*Qkj)>CH diff --git a/phar/core.phar b/phar/core.phar index 2dd1521c6c2ad494920bd3e82c004e21d61c48ed..158dfd477b5b7ab04d5567462aac1cac0fc046df 100644 GIT binary patch delta 2202 zcmX9xs=*8(y*drlH@K@Tb7k5amW!vA4Z#_ zl3k&jYjh&Cxl1l9v`f|sN$t9)#eUB-f4uWMzxVk)_wPN^e%+`2y3e)_a$xNC2mbUg z#bYP{f*3vkDU8todl@4EIvL>rGBVm~U~Jo>ZWci>i^@`|?QA>hHB)37Y$UBYiA;i^ zMO9=NXkU^#)b63RMT5)q6oW0JgiM~PTt^Bml$i@N$8%Ai%ZvkkI}=lgSP{SySmOaI zSW^K$vZ4XP*--!+*{Hn2{tlQ8XB2>*gO^5*9@ry}4#1m>O)TJQfK_nS01vt7AmK#< zOXfvlnSMNih^;A1q`EAIQ29JNlk6(Vqq=x35Own~u|Iz-uuMKSc!UqBiY;Q`F4h7S zlm#m8Szr@V%Q0XxSWW^sY>B0Pw!~tBtpeb3ffd$NZiR(Dwi*YQUe*%@={hnSlEo zYZr$8N&!KLb)g5Sc6+%gc@D|r7(7tWY=_N$wTnPq);NM#?Uz21vKGrt881jH4%Y^C z>+Eru7wz#AWQxsU?P;Ta{@P;@RuGe&u@q8obwZD|Vw9d0V}dVYT=Yl>+`=jc{6Nk) z;NTdJXbUsLYDfH(S{wsm03RKb0H#WCjK?MOfjJMsxn~YZ1a@^uGJryw3Q#0PhnG@x z81FP4`}#%_M9ULjABrK7Qz~a$)2S@dk;67W5{C0M@H9Bj0%&r^s17oOOc^fxvJAKB z;$i?vj>{r|XD%}^I7x>o-4^tj>USAKZFaQ>TZQWkfNy3h722IoOvtkmF#6Ke3o7tHfVnC_49>-{ksUx~Tr zDzUCsrFlP}=%jnv*8N4tl$*ko%we2Y*aek49Cv(gIPOEMng`j+Rk-m_swu$q0p<+^ z;9OXN`28(0!`;A4kc5`wx?1hVS}lV6lVbO<89}a!E^x@Hm-%zWy*p-%->m7cgx+Lw0r!HOLb-%B& z>{V2I3za`8e$pu_Hcn31Q8cB|sN*+%t@BXDMdsXiyZ_4Qgb(tNUQbE!DvgxO9s;-V< z%w8omxc>9pHHUuI<}a{h88YN6Yj=KPtmXGL9MM^-&*l^eW;5SBI{kxnz~Z4_3);SP z-)>O~dmfZgZH>y5s4i8Lc5q_4AiG0VnQ9EHS)J|LnWPw>SGTRQC)`xnSeo6)s|(nz z3wa+A_~h6oYeJp3BF)Iz?;3OB#lO|(2m9jGtUY<>x=tTj#*00_D1;o9roRjULI3c6=c{l zaoU!Jr5Rmw2lBS*PaQ7w*f8tqsT0xFH$NSz&2buf%s~CqqqDF1(9%6Me&6zoyGjar zmIhyT+ViXaVxg-3)}4m@{-_gUmZ$m|-Kfl*NKw-Di<3`RN^)hf*9tA(dt9!3_Xqbi zY1=nYkloewdv|=b&3$%VN^AMUyT847&;1xJ)ih^458JoMf2Q!jgVt(-ejN1Q4G|ro GkN6+j!g(wJ delta 2202 zcmX9-X;c$e6rRi^Lx4aQ2niV05G3pfLL$n(#D!uJ5wL)WOF;xg(Si$77bu{jBgR_S zN{^_;N~_hnA>x9F3LX!oVo|ArR0WSmg+eQxd-LPXcfNPOyU%NHb8ByNtNxu-1n>OA zll?M$jvBy^;|7q69mxB2?ekvV+4xeds%&4f}pAnWiUH=7R(z;q940Jn$bxV zL9n7aG6b{(qz<+FS#8zWs#u1@vt>jSUw>FficGxnzs#R*g!*+UQCZwkV#L{@VgN_B(L+b!sjj)NOMjBv8i~<238KHxm z9|0_tAAx0h@Cjm8eR&e|)Wn+E$hXkjwvv42DW40XK0YS)G!6rnZ;TB#7(=RECNtn} zmI*2t6I67XU=uc`!C*@(3XEGMZ<2Bpk&&@JvxG0Jx;Us8+TJ`L?+57F*n= zom~n@itVxhUf6ws!AUmEch!EQ%#d9$Q)zDrwj=gm0E`Cn$5*M$HMYK*i|jkazz2K0BE3${wPxfrmUb-%mu&@IM6rO^*M zQDR1II_H5enD2>@?1}MDdtx?YFU-Bj z3+uY!W!TRMn{@xZO}%VPl|ICaa;9Hl7tA_u+;OKj?nCRd7_uGq!Htjj%mEhbYuJD< z&V@S(|GyjqJe-sdl4!pifHQu%0M7n6jB*3K_DA=a$@ps>pNxqF0myO<&>oNpev<>2 z;Q%D;0O(t@S{W~Y8M7n6m`M+`(I5PQwArP>LD8B(kcVg{1FY8I(>bHj0vpocv+~s< z%h3YcbV^%xO3Psn$sUS5T=wwTL$k+-J$&{UpF5>B*^^yT8nt5@718kE)%D*(y0%vR zlhngREk|H#)g^)f2w)?*@H~+mfC8Y zYmGhJnv?(b^p93ds4m`objx1j-8a_6?Jv4*H!oqhYlVN*Y4W{yUg&7})scw40nOm$ zsHS1%wSwI@kA9%{4FvvP^1MHLO-pfio8#=BUxWS#urHBc@vKUG*;_fOpo7SX5z*$BfRiU9&S^)U6VHt~iv)-Ks3CNvbnlU>$gSe?@mg`46iz`{#_*Zc{RT z2U{OLORjv|tGs`rEj8CPgML>Yx863)!#&>jX? Date: Thu, 2 Apr 2026 12:53:49 +0200 Subject: [PATCH 14/79] docs: add badges for PHPStan and PHPUnit workflows in README --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 8d55a64e..6dd695a0 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,19 @@ ## High-level API for Low-level proxy – Development Branch +

+ + PHPStan + + PHPUnit +

+

Date: Tue, 7 Apr 2026 08:52:14 +0200 Subject: [PATCH 15/79] chore: add Firehub PHPStan rules and update configuration --- composer.json | 6 +- phar/core.min.phar | Bin 211638 -> 211638 bytes phar/core.phar | Bin 697936 -> 697936 bytes phpstan.neon | 8 +- phpstan/Rule/NoNativeFunctionsRule.php | 125 ------------------- phpstan/Type/MathMaxReturnTypeExtension.php | 130 -------------------- phpstan/Type/MathMinReturnTypeExtension.php | 130 -------------------- phpstan/rule.neon | 4 - phpstan/type.neon | 7 -- 9 files changed, 3 insertions(+), 407 deletions(-) delete mode 100644 phpstan/Rule/NoNativeFunctionsRule.php delete mode 100644 phpstan/Type/MathMaxReturnTypeExtension.php delete mode 100644 phpstan/Type/MathMinReturnTypeExtension.php delete mode 100644 phpstan/rule.neon delete mode 100644 phpstan/type.neon diff --git a/composer.json b/composer.json index 74238f2b..e2b4d5fa 100644 --- a/composer.json +++ b/composer.json @@ -13,13 +13,9 @@ "require-dev": { "phpstan/phpstan": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", + "firehub/phpstan-rules": "^1.0", "phpunit/phpunit": "^13.0" }, - "autoload": { - "psr-4": { - "FireHub\\PHPStan\\": "phpstan/" - } - }, "minimum-stability": "dev", "prefer-stable": true, "authors": [ diff --git a/phar/core.min.phar b/phar/core.min.phar index 55cdfd2483401f99e4bc8e651ad0c8a807a37253..2f5acea82695c7b817b2432d18360cf483433258 100644 GIT binary patch delta 2204 zcmXw3c~Dbl5YK~Mgm`Mo11>3&;mO zc8oU4NpTvjqJTPRH4Ukr1dSFiQ@$k$8#i-NB;m~QD_UH%i1JdT66-|Z-m=E(0(vx9 zDfH<84fMGHAL(%blWe8}l-VG&!zKnSdqy~bj)BhY3>{c~jA;N~Ow_-KsR65j83J&h zi3!fEDPU!>rl7?AAg1E{N%ApALat{CNz+pn`Itoq&NCMF^<_^6tB8%WonS+!U7UFE zC2){Ia***S2WN1xjf7ab?JR&MTU7Sh7PSO%Rp4C2MM?X(sPhpw7M$blW&*6VL+gTF z3Rq$uZel49mvxbc9c=7pKrGQ7yYIF~%CLPlIA`%^12piF@|uq|BOOpgl>=_~o5wF2_kSIxz;pVyX49fa+^RYN{WU9qg%m&b>#zIseQMD3MtG!nFO0rZ;wYg zSr~=6uPFlOtj!DZmZO{(le;_@vL~~Ub3ur+eicR|HG)f{)jYNdA?=*xf*3=dF?X3^ z0no=#{V6#c9dV`C9PtWTJ6Rg+pc=F)eM+%Gd~sm`WY8FxvB3$c=bf<6KTdesVIn+> zwIaMFZ6aJBA;wsg1=fl2K3x_Ez#2Y^GXUl~<1$Y>F9gd~g4-{W%meGXBnv?4k_)ia z1rr8cFk$+bG#u|0^&UDEx?qxUmXrRj4(4M8gqZQh@=6HTRLD$s)dRG;VpWkFLXjID zd%GK+sZ^Q{lr_?PfB|VH7Jo;TA$ON|k;BqR^9>HcXMl$yG>pvz-oF;eaz{yR?rGq3 z_CUF7EzswI5<+As{s$RShGm$p8;4foxOv#^DOLM=-1_rmwzIsZln{||o)QeeG&4O1 zO36Bz#{Aht2pIzw8Eu|eTqH**l%tHBa@?Aq0^`KFA|!iqywepLADo77;~ z%B+`ARbOJ&U0$dv!z%}-Y4w^9;I71K>y;SmRbtT~?_`KodM9Ji2UNQLA6_%*F4xqI zB^*e;9A9_X1Ovv|)E~eu?9>N{n`gTd4vc=w7+)r!;&dO}(ODmS&MaSqG+*q|?28@Q ze%OD3A8NbmXE`R&&C?$~KoyqP$O(J%%WA^u{~eV~oM#Jf>Iw7`$w?0ng_&PV@XeuK zgp~2gqCo3!fJyfG8S!Q-^$m3u00W;@ug2Px=Lk$?d^xGAG2v%s)uD?9$*O z8JZBFM`_dmD>V4HPHVJa4Que>skCSrwP0;LrY$?BCC(nxT8(}+O|$*ucE$Gkpt?-| z#%0OF4nJweDC@`TLT9KK$HYAh$XdXo7atf?8B@&62|aQ&Z2w}}iayne4R(*!&CfJ@ z=g6+E3Y*=;I%*^~hu`T|tRJ|xwzt?TuWH1j<=1x8aaM9!Un|?cGF?t@t0;L}=XvIq z_hq+E=0n}1!HE^j=U+`Vr(cE%e+vi_UbWrt7yM$g-sq~zFwCg9+p*;6psr=5srB`q zd6VkN5$^ zi+g_bF3+Bm`dxf(oyP}hd*PDAbA`1@ec6)Mb%_Fb=)LPQZ$ne$tPLs8jR`~X(bb*A zfbHCI`L`9BZ#FG`@o6-wp?$>FSo&A&b**7$XA3XPE>vN9^kvzL$P|8(K;2HGe(M72 K%Ev|PqW=S=LL{L8 delta 2204 zcmXw3X;f2J5Y7X#l8`_kgnf}9VTtSsiy)gI60jYI>l&v=Y$l#}8d z)e8k`k6sK?od_B&)=@e@5_B7lDufVoWU9HU9Lh_PO7tfK_kliEH!%nYE6HF2zjlmnE=t^V5?JO&xQTg2 zxU5@7*n!TU2(ih0?7p3klz#pUa3%;Q0qhqbrB8r0LyS?xMq}LWQ)7Ri2uu)SOaj4L zWil2QlBrLlX)PLFk(*4UqAB5UUo;LIQpa*>w3-gOoaC8FOd_+h@-r7?&jz{`)t{2H z(iB(PWQtc%-%QtFGu7a#)V&-V#1<76Kn9J087s_?dfg2BjF{nR2Z``3mW%L~Tod8? z2y={u>Y&sd@6#P~Z&<@8^HhMTVqE4~@f@(MEpYoPi)65xEz$v`mYD#RmYC3Ei3t;| zrsH^TsrT@!v(ld=#1hie+E{aJzHV7&kJa(-Oo~f;E z3Q(5W<^putreX2-R2g#ny8C3mZHVSK4k2KGha&8^O9S3_9i-c%q-*xm!6|k?xyyCX z?tl{HjwpVsBU1VuF=5xkE22} ztR{qvE}e{PPFP$dK`4}wQDa9KlL868 z?jW~pjI*gf059mwM~G`C*%QW$KXqe#aYMx^?zp21?)aQp9thJtu*XRc?8ug3|JgFs z)+o~*6X-U|IChvSEUA$Ye9fC}gxUW)DjAb(2yf~YMOq`0kPZ&c8bK`~&;+^=wu~X2 zf&kBKm}H+P-igniQ@~Ps>5j(>S7+djH#A=dkGxet8Sj%1aMq^)z{wYPwN3|beK9@S z4=-Q6AKnVCKUxJkc;KG}d4BRdTo995kkR9>gQU#YoUHO^lQZR(8bKXlS*^fDG8A&4 zhbsI47Ax>^omB*Y)vv&Z=M{ifegIf2PXw$z5kOox5uo?=n>wznzVAxm+<}O-qfhq z-}_dr3jP)utF=$E`~J&Mx8r8+tPbW~j0zpdif`?<+B4*OD}F=D%ZPTz@b4YG#M^%z zH2qLKF7x-xm-9Z~D^-7Rno*KY2INghu3Ov`$6Gq&d-2Apw-d*7*Y12??R8EV7?kay zsB_X(-=~8#r|cQ-hc~${9iH&Q%Jg1^Ur&h-r+2-GReUMtOG|G>vuA^{K!0A__`8gl z=6l?Bfq+cpWH-k(jY>IkaNq6***Rv_?4n~6-#xDEDQ(()X@kcG|D|pno27b*@^{^* zmynBjja?rr2jz`c75}K4f`3$~TWX?)J$!0yTN`#ASe|o)m!RG2@9EXDXk=jD;EFt& zm0CZLU*i8bwa{>&usT7}X!k@cE!tbJm5N46&+M3-#0>R{ad@=Uk~KTFvY_pe$tSnd z)4!}fl-4%1O~h=h)+khSviu%i^{da_HGc|yS%qV4%r?(w5h>Btf`)F{O&axEH>R$9 IbhtA7KM=-ifB*mh diff --git a/phar/core.phar b/phar/core.phar index 158dfd477b5b7ab04d5567462aac1cac0fc046df..a35f8359d8230722b9316e258004a12819496c8f 100644 GIT binary patch delta 2202 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 GkN6+j!g(wJ diff --git a/phpstan.neon b/phpstan.neon index beda53bc..4d42bccb 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,17 +1,13 @@ includes: - phar://phpstan.phar/conf/bleedingEdge.neon - vendor/phpstan/phpstan-strict-rules/rules.neon - - phpstan/rule.neon - - phpstan/type.neon + - vendor/firehub/phpstan-rules/src/rule.neon + - vendor/firehub/phpstan-rules/src/type.neon parameters: level: max paths: - src/ - - phpstan/ - excludePaths: - analyse: - - phpstan/** tmpDir: storage/cache/phpstan/ ignoreErrors: - identifier: ternary.shortNotAllowed diff --git a/phpstan/Rule/NoNativeFunctionsRule.php b/phpstan/Rule/NoNativeFunctionsRule.php deleted file mode 100644 index ee90c1ed..00000000 --- a/phpstan/Rule/NoNativeFunctionsRule.php +++ /dev/null @@ -1,125 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.4 - * @package Core\PHPStan - * - * @version GIT: $Id$ Blob checksum. - */ - -namespace FireHub\PHPStan\Rule; - -use PhpParser\ { - Node, Node\Expr\FuncCall -}; -use PHPStan\Analyser\Scope; -use PHPStan\Rules\ { - Rule, RuleErrorBuilder -}; -use PHPStan\Reflection\ReflectionProvider; - -/** - * ### Rule that forbids direct usage of native functions - * @since 1.0.0 - * - * @template TNodeType of Node - * - * @implements Rule - */ -final class NoNativeFunctionsRule implements Rule { - - /** - * ## Constructor - * @since 1.0.0 - * - * @param \PHPStan\Reflection\ReflectionProvider $reflectionProvider

- * Reflection provider for class hierarchy checks. - *

- * - * @return void - */ - public function __construct( - private ReflectionProvider $reflectionProvider - ) {} - - /** - * ### Returns the node type this rule is interested in - * @since 1.0.0 - * - * @return class-string All function calls. - */ - public function getNodeType ():string { - - return FuncCall::class; - - } - - /** - * ### Process the node - * @since 1.0.0 - * - * @param TNodeType $node

- * The node. - *

- * @param \PHPStan\Analyser\Scope&\PHPStan\Analyser\NodeCallbackInvoker $scope

- * The scope. - *

- * - * @throws \PHPStan\ShouldNotHappenException If error occurs. - * - * @return array{\PHPStan\Rules\RuleError} Error messages. - */ - public function processNode (Node $node, Scope $scope):array { - - $classReflection = $scope->getClassReflection(); - - if ( - $classReflection !== null && - $classReflection->isSubclassOfClass($this->reflectionProvider - ->getClass(\FireHub\Core\Support\LowLevel::class)) - ) { - return []; - } - - if (!$node instanceof FuncCall) return []; - - $name = $node->name; - - if ($name instanceof Node\Name) { - - $funcName = strtolower((string)$name); - - $list = array_values( - array_diff( - get_defined_functions()['internal'], - [ - 'func_num_args', - 'func_get_arg', - 'func_get_args', - ] - ) - ); - - if (in_array($funcName, $list, true)) { - - return [ - RuleErrorBuilder::message(sprintf( - 'Do not use native function %s(), use FireHub LowLevel wrapper instead.', - $funcName - ))->build() - ]; - - } - - } - - return []; - - } -} \ No newline at end of file diff --git a/phpstan/Type/MathMaxReturnTypeExtension.php b/phpstan/Type/MathMaxReturnTypeExtension.php deleted file mode 100644 index 2fbd44aa..00000000 --- a/phpstan/Type/MathMaxReturnTypeExtension.php +++ /dev/null @@ -1,130 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.4 - * @package Core\PHPStan - * - * @version GIT: $Id$ Blob checksum. - */ - -namespace FireHub\PHPStan\Type; - -use FireHub\Core\Support\LowLevel\Math; -use PhpParser\Node\ { - Arg, Expr\StaticCall -}; -use PHPStan\Analyser\Scope; -use PHPStan\Reflection\MethodReflection; -use PHPStan\Type\ { - Constant\ConstantBooleanType, ConstantTypeHelper, DynamicStaticMethodReturnTypeExtension, FloatType, - IntegerRangeType, IntegerType, MixedType, Type, TypeCombinator -}; -use Throwable; - -/** - * ### Extends PHPStan's `max()` function to support constant folding - * @since 1.0.0 - */ -final class MathMaxReturnTypeExtension implements DynamicStaticMethodReturnTypeExtension { - - /** - * ### Returns the class name - * @since 1.0.0 - * - * @return class-string Class FQN. - */ - public function getClass ():string { - - return Math::class; - - } - - /** - * ### Returns whether the method is supported - * @since 1.0.0 - * - * @param \PHPStan\Reflection\MethodReflection $methodReflection

- * The method reflection instance. - *

- * - * @return bool True if the method is supported. - */ - public function isStaticMethodSupported (MethodReflection $methodReflection): bool { - - return $methodReflection->getName() === 'max'; - - } - - /** - * ### Returns the type of the method - * @since 1.0.0 - * - * @param \PHPStan\Reflection\MethodReflection $methodReflection

- * The method reflection instance. - *

- * @param \PhpParser\Node\Expr\StaticCall $methodCall

- * The method call node. - *

- * @param \PHPStan\Analyser\Scope $scope

- * The current scope. - *

- * - * @return \PHPStan\Type\Type The type. - */ - public function getTypeFromStaticMethodCall (MethodReflection $methodReflection, StaticCall $methodCall, Scope $scope):Type { - - $types = []; - - foreach ($methodCall->args as $arg) - if ($arg instanceOf Arg) - $types[] = $scope->getType($arg->value); - - if ($types === []) return new MixedType(); - - $values = null; - foreach ($types as $type) { - - foreach ($type->getConstantScalarValues() as $value) - $values[] = $value; - - } - - if ($values !== null) { - - try { - - $max = max(...$values); - - return ConstantTypeHelper::getTypeFromValue($max); - - } catch (Throwable) {} - - } - - $result = TypeCombinator::union(...$types); - - if ( - $result->isSuperTypeOf(new IntegerType())->yes() - || $result->isSuperTypeOf(new FloatType())->yes() - ) { - - TypeCombinator::remove( - $result, - new ConstantBooleanType(false) - ); - - $result = IntegerRangeType::fromInterval(0, null); - - } - - return $result; - - } - -} \ No newline at end of file diff --git a/phpstan/Type/MathMinReturnTypeExtension.php b/phpstan/Type/MathMinReturnTypeExtension.php deleted file mode 100644 index d0370c62..00000000 --- a/phpstan/Type/MathMinReturnTypeExtension.php +++ /dev/null @@ -1,130 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.4 - * @package Core\PHPStan - * - * @version GIT: $Id$ Blob checksum. - */ - -namespace FireHub\PHPStan\Type; - -use FireHub\Core\Support\LowLevel\Math; -use PhpParser\Node\ { - Arg, Expr\StaticCall -}; -use PHPStan\Analyser\Scope; -use PHPStan\Reflection\MethodReflection; -use PHPStan\Type\ { - Constant\ConstantBooleanType, ConstantTypeHelper, DynamicStaticMethodReturnTypeExtension, FloatType, - IntegerRangeType, IntegerType, MixedType, Type, TypeCombinator -}; -use Throwable; - -/** - * ### Extends PHPStan's `min()` function to support constant folding - * @since 1.0.0 - */ -final class MathMinReturnTypeExtension implements DynamicStaticMethodReturnTypeExtension { - - /** - * ### Returns the class name - * @since 1.0.0 - * - * @return class-string Class FQN. - */ - public function getClass ():string { - - return Math::class; - - } - - /** - * ### Returns whether the method is supported - * @since 1.0.0 - * - * @param \PHPStan\Reflection\MethodReflection $methodReflection

- * The method reflection instance. - *

- * - * @return bool True if the method is supported. - */ - public function isStaticMethodSupported (MethodReflection $methodReflection): bool { - - return $methodReflection->getName() === 'min'; - - } - - /** - * ### Returns the type of the method - * @since 1.0.0 - * - * @param \PHPStan\Reflection\MethodReflection $methodReflection

- * The method reflection instance. - *

- * @param \PhpParser\Node\Expr\StaticCall $methodCall

- * The method call node. - *

- * @param \PHPStan\Analyser\Scope $scope

- * The current scope. - *

- * - * @return \PHPStan\Type\Type The type. - */ - public function getTypeFromStaticMethodCall (MethodReflection $methodReflection, StaticCall $methodCall, Scope $scope):Type { - - $types = []; - - foreach ($methodCall->args as $arg) - if ($arg instanceOf Arg) - $types[] = $scope->getType($arg->value); - - if ($types === []) return new MixedType(); - - $values = null; - foreach ($types as $type) { - - foreach ($type->getConstantScalarValues() as $value) - $values[] = $value; - - } - - if ($values !== null) { - - try { - - $min = min(...$values); - - return ConstantTypeHelper::getTypeFromValue($min); - - } catch (Throwable) {} - - } - - $result = TypeCombinator::union(...$types); - - if ( - $result->isSuperTypeOf(new IntegerType())->yes() - || $result->isSuperTypeOf(new FloatType())->yes() - ) { - - TypeCombinator::remove( - $result, - new ConstantBooleanType(false) - ); - - $result = IntegerRangeType::fromInterval(0, null); - - } - - return $result; - - } - -} \ No newline at end of file diff --git a/phpstan/rule.neon b/phpstan/rule.neon deleted file mode 100644 index eeca4a1b..00000000 --- a/phpstan/rule.neon +++ /dev/null @@ -1,4 +0,0 @@ -services: - - class: FireHub\PHPStan\Rule\NoNativeFunctionsRule - tags: - - phpstan.rules.rule \ No newline at end of file diff --git a/phpstan/type.neon b/phpstan/type.neon deleted file mode 100644 index f53a04e5..00000000 --- a/phpstan/type.neon +++ /dev/null @@ -1,7 +0,0 @@ -services: - - class: FireHub\PHPStan\Type\MathMaxReturnTypeExtension - tags: - - phpstan.broker.dynamicStaticMethodReturnTypeExtension - - class: FireHub\PHPStan\Type\MathMinReturnTypeExtension - tags: - - phpstan.broker.dynamicStaticMethodReturnTypeExtension \ No newline at end of file From ec33289ac523c3dc8a1f276be07c9ac1ef2b35f7 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 09:49:47 +0200 Subject: [PATCH 16/79] **Simplify namespace structure and streamline `$Id` metadata annotations** **Details:** - **Namespace Refinement:** - Updated namespace declarations in `boot.php` and `index.php` from `FireHub\Public` to `FireHub\Core\Public` for improved consistency with the project hierarchy. - **Metadata Simplification:** - Removed hardcoded `$Id` version hash values in file headers, simplifying metadata maintenance and aligning with other recent updates. These changes enhance code clarity by unifying namespaces and reducing unnecessary metadata complexity, making maintenance and future updates easier. --- src/public/boot.php | 2 +- src/public/index.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/public/boot.php b/src/public/boot.php index 0d6499f4..86bffa7e 100644 --- a/src/public/boot.php +++ b/src/public/boot.php @@ -16,7 +16,7 @@ * @version GIT: $Id$ Blob checksum. */ -namespace FireHub\Public; +namespace FireHub\Core\Public; require __DIR__ . '/index.php'; diff --git a/src/public/index.php b/src/public/index.php index 89289757..5bf63e94 100644 --- a/src/public/index.php +++ b/src/public/index.php @@ -16,7 +16,7 @@ * @version GIT: $Id$ Blob checksum. */ -namespace FireHub\Public; +namespace FireHub\Core\Public; require __DIR__.'/../support/firehub.LowLevel.php'; require __DIR__.'/../support/firehub.Autoload.php'; From 575478fb3e4375f932dcd4622f3c9f5735df57dd Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 09:50:13 +0200 Subject: [PATCH 17/79] **Simplify namespace structure and streamline `$Id` metadata annotations** **Details:** - **Namespace Refinement:** - Updated namespace declarations in `boot.php` and `index.php` from `FireHub\Public` to `FireHub\Core\Public` for improved consistency with the project hierarchy. - **Metadata Simplification:** - Removed hardcoded `$Id` version hash values in file headers, simplifying metadata maintenance and aligning with other recent updates. These changes enhance code clarity by unifying namespaces and reducing unnecessary metadata complexity, making maintenance and future updates easier. --- phar/core.min.phar | Bin 211638 -> 211648 bytes phar/core.phar | Bin 697936 -> 697946 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/phar/core.min.phar b/phar/core.min.phar index 2f5acea82695c7b817b2432d18360cf483433258..c066546039f52952d8cabdbd845222eead70a9b6 100644 GIT binary patch delta 2499 zcmX|>dt6iZ6~J=|At3~~NeoGN6A2^`BJv19d8P;`ilDSQP+rOeI|Zo~AEhW&(GD^7 zSBb;6&eYb4tb$Cfvr;||>!X&5kEw`4u};MzIJAQSrT3nb&;I(}^E>bJJNI|`wW$5I z$b5$za^}`Y-8vS;k@Ba1;&3?3cL~dHH)^+&Sjv+g;^84nne;{jDWSr_;}A6q*h9qw zz3q}ktoKRA+jHBVm*gX!lninur01S9|2&2!$L!+3c)%_NjQuGNXP!#?l2AM^OIaMH zaMG6*m#tz>*`g}BnPA<;#S~KeM39%*rvk0^i-Du|$-qQj5^xs}?XU9Q0GW1}4NP~y zbF;&Ikb50cfLeYGu$UhOwDJwW`+W3M3QQp93QSP7m8oy%hixZGpHNA*3Z$g!k%06G z?7`@X0E^H&CV;%o5nDd#h)F5oTsU7KM7xiLXm>}5&3QP*fUr*w>!THvcd(2wbliPdcg(rIk?UP{bEBzGQsOLAlQJm{kzO$7!ZW-9a($ZGHK|~I0UIk( zfIHJJ#c@nY6TvuE#NpKU@uJuW(xjple<&y~TFE+iF!iuYwtX7T|I#$vXM0&3IGUL( z-)ME!Y!=15cS_f?P8iTNRjimT1LBTej?*F)&e5Nv5{#Qjw`H!&@(&mpTYoPS z6p{j$L1eb0_?Q>}WO{^@mV6}>{kbhVrNIK1X>y^F^O^#npBAHT)1tmdi_s&4vOr%O zlm*dym^k^9F3rq^8S8y0F`?D?^27wM1OrFrd2*iJ`U`7d$?&Db{2y(pCxWqo939T? zYaPBZjv>hG5KPq)f~kdiETu?~rGBT!>t$PU$#49E-I;ndABpVcun*X za%r_dqA;A~{tT5v5e9CA9dDs{afy$XiXM}b3lQyHbWv_v9 z<}YWS6!ytk6AceS>xt+O_{4mIN5T?&ZIlzU$%TZB$UaCj)ufrIGifHfykDwXBg`33 z9Bz3|3>H;5>6$Kg72hMThW@g_Y^+ypvgfC68Sot2m|gK{&EZc!+4{0}g=$<$zRR3{ zsrulxmQ@!EU381`SB@XqtWu30J$gt?tX}zrVhEUeE{!-9r*5u96z%=gh-FgpA z-k-d~)oo>o@i19t;-Nj~+PNJ0jbY9i4oz+{@}IS^aA2ZC!Vy&z#ps?tk*1 z;9l8Wz1@lA1g~iGi@7^8Q->S>`1^{H@zjQ=^utXTRu?z99_#Jw>dw9^E$?`vVCtJH z*Ouw!AHKD&a`InwEzT_)`|r<6;VV9i5Ik;sb~^uW^0bSJiMZyU8aEhTT?>4!{%RTGwr3atZZOarcl+-GwhOB+H^Doxq$GdR1 z`sF>#s94b${IwvVUAVi(I;HA98}{Ez+Q4zkp(mksmAY3~q;&oM3)4T3zB$!LHVie0 X8-l;2e}3>Fp2KX9gxRSS(*o0PStjX3 delta 2462 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 X@@+DTzsfA6So8~%vRJHmL$cxj+%@hu delta 2506 zcmXYxc~nzp7QmDDvWGw*goLn^#UM#A>>&s$GAyEiR;i?bK^zxEGJpcsQAAJ_9E;!^ z=XtEBZgobiHYx}8pkhi}u~Zc2426nXD-H@HM~7O6g37$yn?Jtu%iZsHzx#6kwzl`S zwyB@2%f8cmKg147$etlpaab(o_j)^vH;NxpbJ*U}w|rFEsZQ>=O08!{Lc~$_Y~Ta- zJfJU;;$)8=W}?Y`M+>NCu8bNZ-RNs6goJM*Aq~|+%mwdJA{D%kFy8y7$}=c7*N2jl z0{Z23LMqmm7M7-AVXBJ!5F+l8SVzX04{|nV0q_K88E}G=0-VoH0@icUznl99kfpph zU?vasO}uoFf99nEHT-yBAwLFqf^Ps0@-fa+kO;C_kO-ZJ2w1H2bM+?bvB;C!A&^l6 z0w-{ICcp;t!UT}Zgm~qPLM+G@rGY*}gnoY&p}`jaybw9^^u@mv;yeVGgPbJzv_Ub(CQ z{SxV7;0Y=Ey_919d9K)3qbokdPp;A6=jw(`bBhJJ&Mh7WHss1;#h#AcL^Zl;JeDQe z-*`ZR%Vp>63gvf61kcxl}RC+-kHUcFPQxgs@GlZ zl2lM$V2{WN#4WSQa3s^R`QW@Ug~h50vBcRk(AL$26QA#bp1a&}_+9R}%^dk$h;V1@ z8Eb1=?dj?KwS++0=!My7V2PkaF>3TyJN_;mjh+Pi?mbL#kZweBgC&ET!;4migcseeZ+o z@qzEh;J4Mc5IF3c3nd9A>1R!mlhjM!xzt}ia0exaQR@DgbemDe(8+vK!GFVa#{69z z@XLj0vmZ9z;b#Kb(;qLk&B34jmxJCIfEPU&fPSw6Fg`O7<(9x~C^*cdS6mECq0CA( zZIh86bbAdUmri2U^>!{Gm&a3|2N-E{Eg|ENpoQv~frS)mWT_e(>s8~#LxWJ>AB6Vj zK{$q_nR!t7Hztp5WaBO7rjEj4^-TJ4M|yTJ_L&!KhWlI(E&%##Fl~(n?GH4VK3bav z_I=tcNI%Hr>Dh6#i+M65JrO{%gZB)pAl?vD1cP#82F2@2@22!o3TnSWNae?<=+mbN)d3?; zly5XZK!Py}xY>vwZ=2Bw@+;#!Nc0Pns9@8|N~*)?OF8FB_;R#vWCJt8RIl71jUuvw=3%2VG{-?g}{|0jYb`jjKbCt}1L%MQ!^l$Jd(g&Mf(@|HkrP7j88_3JJ_) zXQ(z*=V|oR)ABw||9y_O^~-eY#v1cmzut(c`t6TOO?^*^)}gOkR9DXY@z|&;tGl_P z{r+cek2=Y~Yl?3UCBHbJKWAH!Y|3oOyEb6FeCp84xQ5EhH?=))WW~0Ym}iSFUf+GG zDyh<>JQO`0a!Y%jUEto7R&;x9&5$9H_Q}=j#;fydliTSI!?D!(6ZeE0>gU#Oo6~fX zJzc$R+IF}$?QD+5>y*bAF~X%E3Od*9y4n4!p*F13pdibhkmou}t@OKfr`1O~3D#xW z5;rvTdhg@0b=JXZ@$e$C^iZ;CUlupp8a|j`w?i}_Jm2s_`K+~}dzHV{xybzRf{0Yq WRY_mRSqK*MnYpo8tklGe#Qy^`Zs4&1 From 3931fb4f903cae94f1da498eae6faaeea3407a1e Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 12:41:32 +0200 Subject: [PATCH 18/79] Add support for professional and enterprise editions with enhanced build configurations This commit introduces a major update adding support for `Core Professional` and `Core Enterprise` editions. Key enhancements include: ### Build Configurations: - Added `.github/workflows/` for CI/CD: - **PHPStan** and **PHPUnit** workflows for static analysis and unit testing. - **Codecov** for code coverage reporting. - **AddToTriage** and **SemanticPullRequest** workflows for issue and PR management. - Centralized use of reusable workflows from `The-FireHub-Project`. - Implemented `phpstan.neon` configurations in both editions for advanced static analysis, aligning with strict coding rules and custom FireHub rules. ### Composer and Package Updates: - Updated `composer.json` for `Core-Professional` and `Core-Enterprise`: - Dependencies on `firehub/core-foundation` and respective packages. - Introduced `autoload` and `autoload-dev` for integrating FireHub modules. - Added `firehub/phpstan-rules`, while supporting PHP extensions like `mbstring`. ### Bootstrap and Public Setup: - Added minimal `boot.php` files for `Core-Professional` and `Core-Enterprise` to initialize applications. - Modularized autoload setups such as `Classmap` and `CompiledClassmap`. ### Testing and Coverage: - Introduced new `phpunit.xml` files with structured test suites for unit tests placed in the `tests/unit` directory. - Configured `core.min.phar` and `core.phar` with appropriate public keys for cryptographic verifications. ### Documentation: - Updated `README.md` files to reflect the latest configurations, workflows, version updates, and badges for continuous integration status. This update improves maintainability, enables advanced analysis, and aligns FireHub ecosystem modules with professional-grade workflows and enterprise standards. --- phar/core.min.phar | Bin 211648 -> 211694 bytes phar/core.phar | Bin 697946 -> 698040 bytes src/public/boot.php | 3 +++ 3 files changed, 3 insertions(+) diff --git a/phar/core.min.phar b/phar/core.min.phar index c066546039f52952d8cabdbd845222eead70a9b6..d4bb9a95e85006c9063a133ab243c10ef3a0e59a 100644 GIT binary patch delta 2225 zcmXw3dt6g>6yM$BatC7@doVzl12<$S$YjDM!epYu2b(WcPy~#LAP8#0M} zviomrxfaHJX^PN@B?ODrf8$CH;1_cCUOJXgfiIni1=vl*0CW(e0Rq?-0g#WgSSxS{@R zHv?F;ZqWekZW!Q0jR7l-8iNY=F=E!NKXshG0L7kYed9R;EQJt9kuSt)ofcvRo@gTYri!rob`eq@isr(hO*|Q(R*aNhG3Jc( zLJ?J7INo2qqJScnAS6mgg7vN>7AKO)VX@Bmw*E#}OSIn8%;AL#3b}08o&dJiJl)K= zf<<{tZS!)$yGMjqA1^gwd@nT0_&V_8i3X> z6JVns2Hf+*fbj!Tu%&M15u6WBilPZ04ISa{+a;Bxb=PWocaXu+ASI+^m#e`>HJ0$!AQWg&%tZ~3Ej$>l>R|NU4aNq?3{Jy>Jxsi5 zRPRNmv;PX_`Z8%BVA`!AC~kI0IyBV~G7mtd#dPIb^mS-4t3EUtd>cZOG3#|EJfmND zlvZgBj?RsQ7cJJ{tBx6BM*^RD`kpZ-o+BYuMR<|7U5&gRf|^r@;;c>%#b-=~A*6(1 zk)vT)k{^x&vcgf^x8bgv0^!1pPYy7NHI6zBA#(J+PssltQ^~Md9`GOijbW|v*3f~0 z!H$R>gou_!3OYQ*jJN6#qPz8g2?f0Fsru8cpH*Zk0#d+dmc3XQa{Yj|gh z^8NVjk|s^4EW6lLbld%jbJkxRN#(N(ll{hbB~0#cULfuzJu_$|Tk0B9UsuTWoSL=? z1I&&MFV%7B1ADI*O*t`g`|m3PEqCWnEbeZ9trL=#d}V{rr809`;KC+pY4h}DEr&u$ zTVoBk?eWZ9TdDs$RMNpa39|)31t-o4Pw!gXv_y4Nad=*Sa_fgVr$VAivf3gNwq>vX z^5zaryO}lM&E=LhTdQ-NZKwLkoVQ!U7B?qXr0)u9$$#`^WcgR4f2yjVnG>T`+|cFL z94Je#P^#HkFDFIrE916TZ>jPpd#db4zmPk}j$J)n)SPW!ceZE2XVwxbvZ8Vhkysd- ze65`|vwB^P-&o`P)8F-#YC8(PmVeyssA{ggy!&$eblZJ(l@2Edij@ES@x+uy0LX8*~YR3%lG^#HR{*w9z?b6 z^OSWgt8F5teSbcKwYt^VEQwpyr*`b>ntLfPTJ&nqNB;=_KG0`gz2j;B(rYONCG{-7 z?jyEOCj^eYzip@F3%jmIz~_0@e{LW0^}Ms?(T5MJ*!!Ie#cNID1I7CK^G?n=1>a!J htuD1%M*eV5FgbSaZSi|4#rs*zKVHJT3X3_({4cM2+K2!E delta 2208 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 delta 2228 zcmXX`X;f2J5Ki6;FCipkfrPNdRE%r^*#ZPaASw_Q@t{FKk%9^$i&3x^p;bW(wus16 z}n@R-h0hIvY#YO$O z+;Fg(xnTf(Tntd~W`mW%n~e%JJQi!gnd(&f5#O2K%5$K5c>?ec@vx?!Z7f(OTWsr` zEmW!J&x5-Kd}PpkWc2V+zl+^0@TJ=&0i3o&Rg-q8BSa7gm$?Fzb5wvD9}42&(o?t) zV3QE7tHKnpoa}K5h4wh8YxY>dMl>IM$s(+NP=u5b(F(Xs5-$R179-`U7<0~&pom=( zoNTWo6ewaTLV`2`tnJb$9LAu8#nQFtis@RZw|uc4menh?J`uo(jfxwLYr6SaHepM> zKOff^>ky5x{`M@EEFt0~-Q}pZpOaOR1<~mq$hqo(y}ohKBXvU@i}jwSFp?I^)Mnvo zLO^jv$g6b3S>ANScSp*snH?EtV$QbDA+z~P4#A^pU6H;`hP*FjnEf9a?l)478z__G zySO69p|PFN7j1?2obUx*cM5{$UpXxUSfaoYwkdMJa&yL+o19a@`qnuEz}qDYpvDCQ zEG`&ea81Le{v}wf>%aK=&}@a84ses0RmFr8Wn=v;*ltT9GTrTMfDSjzDtAXPx#O~L zyW=L6%5U9&z*vh1wioM>?1bq@+ST$y~!9 z0AK={GLvqc8gA~WARH(Qdgv?Du!LNVuuhF)eo*7={HLQ;I~{$$Psc82duCw4Q6~N? z%ZA%bd;b><*hz5AyQ>K)^#XI(d!fQ*UYXEYhgUX$${TZT^+sR6H>M8pF@oTq+42PvV&Y7P)0eODtv%?z@$Co>cY8Z{}Q2Cdz^_C?|88XQ==2ES;Y zA3~ZR7CGyOC2jptz$$+fcf;ShvvDR(!=1`snZ#e&CAx`w}P+N1Co^+vy!jwRw!ovWf!?ghKgyXl= z7On$pBpko9Kpk2IIuOG+PjQCk)zAO6PeQi~}uGHX`*+}aDHyu;~_ zy^}T?M(aLZ)hy(>vaySYhA25+pN{|pXqDX_OCUP`Cp9bLZ3*!zi0fg;CSHh zz-Rj$R}Fvi?rZR9{NIgX1OqhE(8wj2BAU#)noX{g~( z+>MElZa+|Q@5amsSJTah?-u!1u5b_7J>e-C?8+%iPae%G<39O%tiFPKcVgV5T=mhw zMEu)vWfhkvE!nERy@uS6FFf6N=8VPnFHK3<4-ca3*Kg6gs{2a&diUjxUm8C6>`2{@ z&Zoy)$of0CW)~E`Q>lFVaM$yiS7i#va@%v8O2@imTe1)MR9kZAxVFv9XY0Kb6QgZ2 z8i_roc_%&`87MDo?B3Zj!zZR=W%Hek@kb-d$9A=uy<^3ea}(OD)vK1K_TJAtCI77J dx Date: Tue, 7 Apr 2026 12:55:53 +0200 Subject: [PATCH 19/79] Test --- phar/core.min.phar | Bin 211694 -> 211694 bytes phar/core.phar | Bin 698040 -> 698040 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/phar/core.min.phar b/phar/core.min.phar index d4bb9a95e85006c9063a133ab243c10ef3a0e59a..12bd9f4188cd35d51df9825a1da0d4d24f6305f2 100644 GIT binary patch delta 2189 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 HA}-=TEQXv4 delta 2205 zcmXX_c~Dbl5Px||UIK)WJ2658AqpV`B3FV3ij;s7R73<6D0m`6_SA-{_U)#BeD62=?QeH~yZgOU-MUlVy2cx% z^X`_LAS4zKROKfTj z=}Bd<34$TDkg>phMkXS67sIU^T5hFTT%V>SQsr(aT~wOHL+WaFDo}gam|en&11p`A z1klV$19-!+08He508qu)L^o09Fbw8z?JS_ozgGKpyHZ;F-W`=0yYC;$eV_ zKN+lS{$y0B=MzNo*BdhE`|iW&YQB{2=L^7Z=VQ$fw@F}?x?x+#+@Q)<_bG6f?2ZiD z9T|P@s9)_d0eo2=(*O>6pem;a>WB~+;j%!0a`p*O|q8=4EufBuFtc4wlvL3Crp&1dLgsy2!Xj*=(m14+B@jfVzGN)zDc9OO7mxyq=Y_l)8P4*1 z8NNHV+?83zIIRoU9EZ%dj)f$jsvnN@HFD&gm1FjQ<+$Im3fw@20^dc40*A&@qA%73 zl}da;UCJ@g{2S#QfHW13@Puk1Sl+{M=B2|jz`8Ol8z4xX2T-TRfM;q9NE)7rO}!@x zqU%Ahj%KN}beOl;=DUnkQe4+>!SbFBky+j!0m)cO@yJIIhIaBjy6{y$iB^QBsF*CS0ogP;P|_?)jmF=#eOX z+eoB1Mq;?tAFUSu46J5nT2X%EpFroRw6-u0w$xTEVXH(=<{F*?U?Mwx9KC0x$=1G> zlv2;oLw5vV356D6sTRfjq{Z18Mxj+d3VlyTVV9FfXJf&?nE1|TWtW-u{x2A|k>uDK zHjonPcg(#t5Eae|%!SU{1M>lVgD_`x5c+NhVd@CoEbwj8&BD~TneguFy_aZTt;v?| z&lb}nEe8l=gBKt{%M7x+FE@AaK*N-(1nZ#OKX%iVh4Z0Gq4#mCqh2nb5VGBUczA$_RZ^LGSWi`4M zV#G0V#^9SQc0uo$QlKP+7XzFKUjh&iffL!_f)^1OZi&R_)*6Y01W{-$aY0YiJcx^o zF2X5Dm?=<~lCRK)2qoPRW)6orT;@>B;W3BL9JjW^X7_iCt0H)+?z)B*Kk@oziw-79lxGLh zo=STgBZ|Vm_^tL}TH}4cT{C2U^>1sh6?OM(g~&CuLfUN(FEHFD`cMrWR-N_eAnQ(rpate&2>@p|fI zecNk~`5#jQPn&)Yl{=>upmEef40EF(q?V30<@Iv1-0OAlQDEuIy@|W#J?wZB)6PAuPVkk-Co6m&KWQs&J#HUJKC~l# zaB%&L5%U5!rqY_8{Dcl&PVR*e Date: Tue, 7 Apr 2026 13:10:50 +0200 Subject: [PATCH 20/79] fix(gitattributes): update .gitattributes for Phar archives to enforce binary integrity --- .gitattributes | 4 +++- phar/core.min.phar | Bin 211694 -> 211694 bytes phar/core.phar | Bin 698040 -> 698040 bytes 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 21f51c94..0f673c51 100644 --- a/.gitattributes +++ b/.gitattributes @@ -42,7 +42,9 @@ *.ico binary *.pdf binary *.zip binary -*.phar binary + +# Phar archives (strict binary integrity – no normalization, no diff) +*.phar -text -diff # GitHub-specific files .gitattributes text diff --git a/phar/core.min.phar b/phar/core.min.phar index 12bd9f4188cd35d51df9825a1da0d4d24f6305f2..07458ae5bb0a40ccb9058a059c36bee8a99cb3c3 100644 GIT binary patch delta 2189 zcmXw3X;f2J5YB_-5g=p%5*8r>5+o2(0uh323e_MLv{n%i1yNKGH6E&R1k2`v1r)v3 zC?amPMXMB*Q}oDE7pPkiTTw)-7K#=ZaA6S@>6^*vpZA@)^UcgRGxxsU0bcI_uk@~w z;>nJCUd)$pDLH^I8isMLx#$0`M2qiRA>Xzx2G9HGQZ9EJ3t;Sfw zk{t$C40{^DA@*#5A+{D^5@!m)77jA6ay|!3KnDRt(RjF>jsoi;9Rc8Of=w(n(SUWx z#2=u;1Osfj;b6_@hNH~GjF`>eHk>Ap&Fn}n*NU`rdEkG-#hPBGlflxNVsEERp~_CP zNI08rh74kcj5}ti-`+d~eDUTp0Ddw@RqxGFhnlB?!=*fwbC8D`AMvKb;dqN^fOQsV zHCn`gWy8lQtl;CIF7UAeNALysW(lzRUI9}21PkDBhHxgpAt6$Fg_tu$gd$2rIN5fQ zA5esr2oaVO!P;mUjKf%H%wk=!yWB~(S<1qs41-!iHZ7Jh$6QpO%NKS)A z9uVLnCtHPLbT30PtK~c+t=2MfbAU@v=AysR3OoH|6^6869*ed6F~^@+h-Jilh)0iM zsxl%9tZ|Ud)_C)b#fGG%Owu~JA|I0SBQsX5gu*NuBl5&ZZ4hJr5i#yJP=XuClHk3l zm*CJS8}x-5V1o_bpi4GB(EO0iJb>A@IKmp+C15$&;mmb*v0z=Zn-3tjUkFfaj{!aQ z7%**29Jcj>c?H+qqWlPDDwk^t%)FssB7LFb6ezT$|R zluF})vR;}B&@D~C$>63<#qOsQCJ2W-{VAKHfols4^Qyd)HI-}Ao13Yxb z>i#aMdzTAR`dlzPY8+aX<6^N;7gOk(Hn)K+u$AdcH&YUQb`B*L8rry>3K;F$olh!U zH2P;&loj1=Xt3TDOGso0t7ItVrVPiXbVF;K8~UEQVT0l0=VQT_Onhii?@gvNEGVa+ zW5%8CsB4~kBJ@+|o($k5$4t3$^xc-g$ooR+P%H9Tm=u?SpqS-2k_JbU>Nvn+{OpyAr@vje{yQzza2oYbW5fJ2n9? z1 zgU_l)698792A`ZN0Il=@unMXIwp0aBwN(K|>d_ph+TU8u zZ#sRd#BRr!8`_NerK61-*KJICdVI&)BOCT=eN=%Tw>6C%_YtkCDAQRAGQvBKic4an z-*j6XQ;Ty*-1tptE6UpYPfl_6;~()$DQRw=b2)*3MAsACG#K$Lf28aBq95*jLt0JT zd)l+sL{7ZY)M&k(icz%G)J9A?@TPQeM|W^%!(R&WN>N$=Q9N#N=-&QY+m=<%-1oRH z`0T5NrWcp_ChzG`lA0jJKhn0=kv|&GUJZ?Fo2fpU?UCcTtF$Kbrp=O1>sjRDkNTFf zmGs@TU5?=)GmKS=3;Dg~ar><~)U)PNx=vDZ_B^ZHt7w;J?$a%!PtTk`JZIP>(WOo6 z=H8?*R+pdx+3j!y)S0w%{6~;=~LHzFQ z{Ts_g`7I5;Io>^w&hzUCR%+sb7NR_f` z<;f=vvm$JVXZ2;Q{^jQzW1{1W26gWL+7s8#BC*Qi%VrZ{d3*ar7V|^5WUjn6EGq0j D8md?V delta 2189 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 HA}-=TEQXv4 From 8c2165488f90d6f2373ac9494172aee8ca1c8b84 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 13:39:09 +0200 Subject: [PATCH 21/79] chore: update .gitattributes and .gitignore for PHAR file handling --- .gitattributes | 4 +--- .gitignore | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index 0f673c51..21f51c94 100644 --- a/.gitattributes +++ b/.gitattributes @@ -42,9 +42,7 @@ *.ico binary *.pdf binary *.zip binary - -# Phar archives (strict binary integrity – no normalization, no diff) -*.phar -text -diff +*.phar binary # GitHub-specific files .gitattributes text diff --git a/.gitignore b/.gitignore index fc61b884..fa604878 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ composer.lock # PHAR artifacts /phar/** +!/phar/build.php !/phar/*.phar !/phar/*.phar.pubkey From 4c9c930deeb2fdc2bbda32d2ccf9c3bcc390cf09 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 13:56:41 +0200 Subject: [PATCH 22/79] feat: add build and release workflow for PHAR package --- .github/workflows/Release.yml | 43 +++ phar/build.php | 538 ++++++++++++++++++++++++++++++++++ 2 files changed, 581 insertions(+) create mode 100644 .github/workflows/Release.yml create mode 100644 phar/build.php diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml new file mode 100644 index 00000000..66140862 --- /dev/null +++ b/.github/workflows/Release.yml @@ -0,0 +1,43 @@ +name: Build & Release PHAR + +on: + push: + tags: + - 'v*' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + extensions: ${{ inputs.phpExtensions }} + tools: ${{ inputs.tools }} + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Install composer dependencies + run: composer install --no-interaction --no-progress --prefer-dist + - name: Load PRIVATE key + run: echo "${{ secrets.FIREHUB_PRIVATE_KEY }}" > private.pem + - name: Build PHAR + run: php phar/build.php + - name: Upload artifact + uses: actions/upload-artifact@v7 + with: + name: core + path: | + phar/core.phar + phar/core.min.phar + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + files: | + phar/core.phar + phar/core.phar.pubkey + phar/core.min.phar + phar/core.min.phar.pubkey \ No newline at end of file diff --git a/phar/build.php b/phar/build.php new file mode 100644 index 00000000..b7b2d075 --- /dev/null +++ b/phar/build.php @@ -0,0 +1,538 @@ + + * Package name. + *

+ * @param string $version

+ * Package name. + *

+ * @param string $phar_name

+ * Phar name. + *

+ * @param string $source

+ * Relative source for phar files. + *

+ * @param string $vendor_source

+ * Relative source for vendor phar files. + *

+ * @param string $index

+ * Relative path within the phar archive to run if accessed. + *

+ * @param bool $minified

+ * If set, it will create a minified version of phar archive. + *

+ * + * @return void + */ + public function __construct ( + private string $name, + private string $version, + private string $phar_name, + private string $source, + private string $vendor_source, + private string $index, + private bool $minified = false + ) { + + $this->cleanup($this->phar_name); + + $this->phar = new Phar($this->phar_name); + $this->phar(); + $this->sign(); + $this->copy($this->phar_name); + + } + + /** + * ### Clean old phar files + * + * @param string $phar_name

+ * Phar name. + *

+ * + * @return void + */ + private function cleanup (string $phar_name):void { + + if (file_exists($phar_name)) unlink($phar_name); + + } + + /** + * ### Create phar archive + * + * @return void + */ + private function phar ():void { + + $this->phar->startBuffering(); + foreach ( + new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($this->source), + RecursiveIteratorIterator::SELF_FIRST + ) as $file + ) { + if ($file->isFile()) + $this->phar->addFromString( + substr($file->getPathname(), strlen($this->source) + 1), + $this->minified ? php_strip_whitespace($file->getPathname()) : file_get_contents($file->getPathname()) + ); + } + + $this->stub(); + + $this->metadata(); + + } + + /** + * ### Stub phar archive + * + * @return void + */ + private function stub ():void { + + $index = $this->index; + + $stub = << + PHAR; + + $this->phar->setStub($stub); + + } + + /** + * ### Set metadata to phar archive + * + * @return void + */ + private function metadata ():void { + + $this->phar->setMetadata([ + 'name' => $this->name, + 'version' => $this->version + ]); + + } + + /** + * ### Sign phar archive + * + * @return void + */ + private function sign ():void { + + $private_key = file_get_contents(__DIR__.'\private.pem'); + $this->phar->setSignatureAlgorithm(Phar::OPENSSL_SHA512, $private_key); + $this->phar->stopBuffering(); + + } + + /** + * ### Copy phar and public key to the vendor folder + * + * @param string $phar_name

+ * Phar name. + *

+ * + * @return void + */ + private function copy (string $phar_name):void { + + copy( + $phar_name, + $this->vendor_source.$phar_name + ) && copy( + $phar_name.'.pubkey', + $this->vendor_source.$phar_name.'.pubkey' + ); + + } + + /** + * ### String representation of an object + * + * @return string + */ + public function __toString ():string { + + return $this->phar_name." was successfully built.\r\n"; + + } + + /** + * ### Generate compiled classmap file + * + * @param array $folders

+ * List of folders to scan for classes, + *

+ * @param non-empty-string $output

+ * Output file path. + *

+ * + * @return void + */ + public function generateCompiledClassmap (array $folders, string $output):void { + + $classmap = $this->generateClassmapData($folders); + + $cases = []; + + foreach ($classmap as $class => $path) { + + $cases[] = " case \\$class::class:\n require __DIR__.'/../../../$path';\n return;"; + + } + + $casesCode = implode("\n\n", $cases); + + $idTag = '$Id$'; + + if (is_file($output)) { + + $existing = file_get_contents($output); + + if (preg_match('/\$Id$]+\$/', $existing, $m)) $idTag = $m[0]; + + } + + $content = << + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $idTag Blob checksum. + */ + +namespace FireHub\Core\Support\Autoload\Loader; + +use FireHub\Core\Support\Autoload\Loader; + +/** + * ### High-performance compiled classmap autoloader + * + * CompiledClassmap is a final autoloader implementation that replaces traditional array-based or PSR-4 class + * resolution with a switch-based dispatch.
+ * Each fully qualified class name maps directly to a required statement, eliminating runtime array lookups and + * filesystem checks. This approach is optimized for PHAR distribution and production environments, providing + * significantly faster class loading—up to 2–5× faster than standard classmaps, and up to 10× faster when combined + * with a single-file compiled core. It is intended to be used after a minimal Preloader and before a Resolver fallback, + * ensuring all core classes are loaded efficiently while maintaining full namespace support. + * @since 1.0.0 + * + * @internal + */ +final readonly class CompiledClassmap implements Loader { + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function __invoke (string \$class):void { + + switch (\$class) { + +$casesCode + + } + + } + +} +PHP; + + file_put_contents($output, $content); + + } + + /** + * ### Generate classmap file + * + * @param array $folders

+ * List of folders to scan for classes, + *

+ * @param non-empty-string $output

+ * Output file path. + *

+ * + * @return void + */ + public function generateClassmap (array $folders, string $output):void { + + $classmap = $this->generateClassmapData($folders); + + $lines = []; + + foreach ($classmap as $class => $path) { + + $class = '\\' . ltrim($class, '\\'); + + $lines[] = " $class::class => __DIR__.'/../../$path',"; + + } + + $export = "[\n" . implode("\n", $lines) . "\n]"; + + $idTag = '$Id$'; + + if (is_file($output)) { + + $existing = file_get_contents($output); + + if (preg_match('/\$Id$]+\$/', $existing, $m)) $idTag = $m[0]; + + } + + $content = << + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/licenses/MIT MIT License + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $idTag Blob checksum. + */ + +namespace FireHub\Core\Support\Autoload; + +/** + * ### Pre-generated mapping of fully qualified class names to their file paths + * + * This file is used by the FireHub autoloader to resolve classes without performing filesystem scanning, + * significantly reducing bootstrap time.
+ * The classmap is generated during the build process and should not be modified manually. + * @since 1.0.0 + * + * @return array + */ +return $export; +PHP; + + file_put_contents($output, $content); + + } + + /** + * ### Generate classmap data + * + * @param array $folders

+ * List of folders to scan for classes, + *

+ * + * @return array + */ + private function generateClassmapData (array $folders):array { + + $classmap = []; + + foreach ($folders as $folder) { + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($folder) + ); + + foreach ($iterator as $file) { + + if (!$file->isFile() || $file->getExtension() !== 'php') continue; + + foreach ($this->extractClassesToken($file->getPathname()) as $class) { + + $relativePath = substr($file->getPathname(), strlen($folder) + 1); + $relativePath = str_replace('\\', '/', $relativePath); + $classmap[$class] = $relativePath; + + } + + } + + } + + ksort($classmap); + + return $classmap; + + } + + /** + * ### Extract fully qualified class names using PHP tokenizer + * + * @return array + */ + private function extractClassesToken (string $file):array { + + $content = file_get_contents($file); + + if ( + !str_contains($content, 'class') && + !str_contains($content, 'interface') && + !str_contains($content, 'trait') && + !str_contains($content, 'enum') + ) return []; + + $tokens = token_get_all($content); + + $classes = []; + $namespace = ''; + $count = count($tokens); + + foreach ($tokens as $i => $i_value) { + + $token = $i_value; + + if (!is_array($token)) continue; + + switch ($token[0]) { + + case T_NAMESPACE: + + $namespace = ''; + + for ($j = $i + 1; $j < $count; $j++) { + + if (!is_array($tokens[$j])) break; + + if ($tokens[$j][0] === T_WHITESPACE) continue; + + if (in_array( + $tokens[$j][0], + [ + T_STRING, + T_NS_SEPARATOR, + defined('T_NAME_QUALIFIED') ? T_NAME_QUALIFIED : -1, + defined('T_NAME_FULLY_QUALIFIED') ? T_NAME_FULLY_QUALIFIED : -1, + ], + true + )) { + + $namespace .= $tokens[$j][1]; + + continue; + + } + + break; + + } + + break; + + case T_CLASS: + + case T_INTERFACE: + + case T_TRAIT: + + case defined('T_ENUM') ? T_ENUM : -1: + + if (($tokens[$i - 1][0] ?? null) === T_DOUBLE_COLON) break; + + if (($tokens[$i - 1][0] ?? null) === T_NEW) break; + + for ($j = $i + 1; $j < $count; $j++) { + + if (!is_array($tokens[$j])) break; + + if ($tokens[$j][0] === T_WHITESPACE) continue; + + if ($tokens[$j][0] === T_STRING) { + + $class = $tokens[$j][1]; + + $classes[] = $namespace + ? $namespace . '\\' . $class + : $class; + + break; + + } + + break; + + } + + break; + + } + + } + + return $classes; + + } + +} + +$build = new Build( + 'core-foundation', + 'v0.3.0', + 'core.phar', + '..\src', + '..\..\skeleton\vendor\firehub\core-foundation\phar\\', + '/public/index.php', + false +); +$build->generateClassmap( + [ + __DIR__.'/../src' + ], + __DIR__.'/../src/support/autoload/classmap.php' +); +$build->generateCompiledClassmap( + [ + __DIR__.'/../src' + ], + __DIR__.'/../src/support/autoload/loader/firehub.CompiledClassmap.php' +); + +echo $build; + +$build = new Build( + 'core-foundation', + 'v0.3.0', + 'core.min.phar', + '..\src', + '..\..\skeleton\vendor\firehub\core-foundation\phar\\', + '/public/index.php', + true +); + +echo $build; \ No newline at end of file From 367083bb4219b48156dda3d1416e7542d45ab93c Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 14:18:24 +0200 Subject: [PATCH 23/79] feat: add build and release workflow for PHAR package --- .github/workflows/Release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index 66140862..98ccd734 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -25,7 +25,7 @@ jobs: - name: Load PRIVATE key run: echo "${{ secrets.FIREHUB_PRIVATE_KEY }}" > private.pem - name: Build PHAR - run: php phar/build.php + run: php -d phar.readonly=0 phar/build.php - name: Upload artifact uses: actions/upload-artifact@v7 with: From fa20b0b1930bcbc3ed7da0a038774384ac5361f0 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 14:21:23 +0200 Subject: [PATCH 24/79] feat: add build and release workflow for PHAR package --- phar/build.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phar/build.php b/phar/build.php index b7b2d075..087ba45c 100644 --- a/phar/build.php +++ b/phar/build.php @@ -505,7 +505,7 @@ private function extractClassesToken (string $file):array { 'core-foundation', 'v0.3.0', 'core.phar', - '..\src', + '..'.DIRECTORY_SEPARATOR .'src', '..\..\skeleton\vendor\firehub\core-foundation\phar\\', '/public/index.php', false @@ -529,7 +529,7 @@ private function extractClassesToken (string $file):array { 'core-foundation', 'v0.3.0', 'core.min.phar', - '..\src', + '..'.DIRECTORY_SEPARATOR .'src', '..\..\skeleton\vendor\firehub\core-foundation\phar\\', '/public/index.php', true From 2aa83e261f7ea713c9ba949051eb654fb4f8e888 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 14:36:22 +0200 Subject: [PATCH 25/79] **chore: remove PHAR build and release workflow files** Removed the previously added GitHub Actions workflow for building and releasing PHAR packages, along with the associated `phar/build.php` script and generated PHAR files (`core.phar`, `core.min.phar`). ### Changes: - Deleted `.github/workflows/Release.yml`, which contained configurations for automatic PHAR builds and GitHub releases. - Removed `phar/build.php`, the script responsible for creating the PHAR archive. - Eliminated related PHAR files and artifacts (`core.phar`, `core.min.phar`) from the repository. This cleanup aligns with the new project direction and reduces repository clutter by discarding unused build and release artifacts. --- .github/workflows/Release.yml | 43 --- phar/build.php | 538 ---------------------------------- phar/core.min.phar | Bin 211694 -> 211694 bytes phar/core.phar | Bin 698040 -> 698040 bytes 4 files changed, 581 deletions(-) delete mode 100644 .github/workflows/Release.yml delete mode 100644 phar/build.php diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml deleted file mode 100644 index 98ccd734..00000000 --- a/.github/workflows/Release.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Build & Release PHAR - -on: - push: - tags: - - 'v*' - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v6 - - name: Install PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-versions }} - extensions: ${{ inputs.phpExtensions }} - tools: ${{ inputs.tools }} - env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} - - name: Install composer dependencies - run: composer install --no-interaction --no-progress --prefer-dist - - name: Load PRIVATE key - run: echo "${{ secrets.FIREHUB_PRIVATE_KEY }}" > private.pem - - name: Build PHAR - run: php -d phar.readonly=0 phar/build.php - - name: Upload artifact - uses: actions/upload-artifact@v7 - with: - name: core - path: | - phar/core.phar - phar/core.min.phar - - name: Create GitHub Release - uses: softprops/action-gh-release@v2 - with: - files: | - phar/core.phar - phar/core.phar.pubkey - phar/core.min.phar - phar/core.min.phar.pubkey \ No newline at end of file diff --git a/phar/build.php b/phar/build.php deleted file mode 100644 index 087ba45c..00000000 --- a/phar/build.php +++ /dev/null @@ -1,538 +0,0 @@ - - * Package name. - *

- * @param string $version

- * Package name. - *

- * @param string $phar_name

- * Phar name. - *

- * @param string $source

- * Relative source for phar files. - *

- * @param string $vendor_source

- * Relative source for vendor phar files. - *

- * @param string $index

- * Relative path within the phar archive to run if accessed. - *

- * @param bool $minified

- * If set, it will create a minified version of phar archive. - *

- * - * @return void - */ - public function __construct ( - private string $name, - private string $version, - private string $phar_name, - private string $source, - private string $vendor_source, - private string $index, - private bool $minified = false - ) { - - $this->cleanup($this->phar_name); - - $this->phar = new Phar($this->phar_name); - $this->phar(); - $this->sign(); - $this->copy($this->phar_name); - - } - - /** - * ### Clean old phar files - * - * @param string $phar_name

- * Phar name. - *

- * - * @return void - */ - private function cleanup (string $phar_name):void { - - if (file_exists($phar_name)) unlink($phar_name); - - } - - /** - * ### Create phar archive - * - * @return void - */ - private function phar ():void { - - $this->phar->startBuffering(); - foreach ( - new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($this->source), - RecursiveIteratorIterator::SELF_FIRST - ) as $file - ) { - if ($file->isFile()) - $this->phar->addFromString( - substr($file->getPathname(), strlen($this->source) + 1), - $this->minified ? php_strip_whitespace($file->getPathname()) : file_get_contents($file->getPathname()) - ); - } - - $this->stub(); - - $this->metadata(); - - } - - /** - * ### Stub phar archive - * - * @return void - */ - private function stub ():void { - - $index = $this->index; - - $stub = << - PHAR; - - $this->phar->setStub($stub); - - } - - /** - * ### Set metadata to phar archive - * - * @return void - */ - private function metadata ():void { - - $this->phar->setMetadata([ - 'name' => $this->name, - 'version' => $this->version - ]); - - } - - /** - * ### Sign phar archive - * - * @return void - */ - private function sign ():void { - - $private_key = file_get_contents(__DIR__.'\private.pem'); - $this->phar->setSignatureAlgorithm(Phar::OPENSSL_SHA512, $private_key); - $this->phar->stopBuffering(); - - } - - /** - * ### Copy phar and public key to the vendor folder - * - * @param string $phar_name

- * Phar name. - *

- * - * @return void - */ - private function copy (string $phar_name):void { - - copy( - $phar_name, - $this->vendor_source.$phar_name - ) && copy( - $phar_name.'.pubkey', - $this->vendor_source.$phar_name.'.pubkey' - ); - - } - - /** - * ### String representation of an object - * - * @return string - */ - public function __toString ():string { - - return $this->phar_name." was successfully built.\r\n"; - - } - - /** - * ### Generate compiled classmap file - * - * @param array $folders

- * List of folders to scan for classes, - *

- * @param non-empty-string $output

- * Output file path. - *

- * - * @return void - */ - public function generateCompiledClassmap (array $folders, string $output):void { - - $classmap = $this->generateClassmapData($folders); - - $cases = []; - - foreach ($classmap as $class => $path) { - - $cases[] = " case \\$class::class:\n require __DIR__.'/../../../$path';\n return;"; - - } - - $casesCode = implode("\n\n", $cases); - - $idTag = '$Id$'; - - if (is_file($output)) { - - $existing = file_get_contents($output); - - if (preg_match('/\$Id$]+\$/', $existing, $m)) $idTag = $m[0]; - - } - - $content = << - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - * - * @version GIT: $idTag Blob checksum. - */ - -namespace FireHub\Core\Support\Autoload\Loader; - -use FireHub\Core\Support\Autoload\Loader; - -/** - * ### High-performance compiled classmap autoloader - * - * CompiledClassmap is a final autoloader implementation that replaces traditional array-based or PSR-4 class - * resolution with a switch-based dispatch.
- * Each fully qualified class name maps directly to a required statement, eliminating runtime array lookups and - * filesystem checks. This approach is optimized for PHAR distribution and production environments, providing - * significantly faster class loading—up to 2–5× faster than standard classmaps, and up to 10× faster when combined - * with a single-file compiled core. It is intended to be used after a minimal Preloader and before a Resolver fallback, - * ensuring all core classes are loaded efficiently while maintaining full namespace support. - * @since 1.0.0 - * - * @internal - */ -final readonly class CompiledClassmap implements Loader { - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function __invoke (string \$class):void { - - switch (\$class) { - -$casesCode - - } - - } - -} -PHP; - - file_put_contents($output, $content); - - } - - /** - * ### Generate classmap file - * - * @param array $folders

- * List of folders to scan for classes, - *

- * @param non-empty-string $output

- * Output file path. - *

- * - * @return void - */ - public function generateClassmap (array $folders, string $output):void { - - $classmap = $this->generateClassmapData($folders); - - $lines = []; - - foreach ($classmap as $class => $path) { - - $class = '\\' . ltrim($class, '\\'); - - $lines[] = " $class::class => __DIR__.'/../../$path',"; - - } - - $export = "[\n" . implode("\n", $lines) . "\n]"; - - $idTag = '$Id$'; - - if (is_file($output)) { - - $existing = file_get_contents($output); - - if (preg_match('/\$Id$]+\$/', $existing, $m)) $idTag = $m[0]; - - } - - $content = << - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/licenses/MIT MIT License - * - * @php-version 7.0 - * @package Core\Support - * - * @version GIT: $idTag Blob checksum. - */ - -namespace FireHub\Core\Support\Autoload; - -/** - * ### Pre-generated mapping of fully qualified class names to their file paths - * - * This file is used by the FireHub autoloader to resolve classes without performing filesystem scanning, - * significantly reducing bootstrap time.
- * The classmap is generated during the build process and should not be modified manually. - * @since 1.0.0 - * - * @return array - */ -return $export; -PHP; - - file_put_contents($output, $content); - - } - - /** - * ### Generate classmap data - * - * @param array $folders

- * List of folders to scan for classes, - *

- * - * @return array - */ - private function generateClassmapData (array $folders):array { - - $classmap = []; - - foreach ($folders as $folder) { - $iterator = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($folder) - ); - - foreach ($iterator as $file) { - - if (!$file->isFile() || $file->getExtension() !== 'php') continue; - - foreach ($this->extractClassesToken($file->getPathname()) as $class) { - - $relativePath = substr($file->getPathname(), strlen($folder) + 1); - $relativePath = str_replace('\\', '/', $relativePath); - $classmap[$class] = $relativePath; - - } - - } - - } - - ksort($classmap); - - return $classmap; - - } - - /** - * ### Extract fully qualified class names using PHP tokenizer - * - * @return array - */ - private function extractClassesToken (string $file):array { - - $content = file_get_contents($file); - - if ( - !str_contains($content, 'class') && - !str_contains($content, 'interface') && - !str_contains($content, 'trait') && - !str_contains($content, 'enum') - ) return []; - - $tokens = token_get_all($content); - - $classes = []; - $namespace = ''; - $count = count($tokens); - - foreach ($tokens as $i => $i_value) { - - $token = $i_value; - - if (!is_array($token)) continue; - - switch ($token[0]) { - - case T_NAMESPACE: - - $namespace = ''; - - for ($j = $i + 1; $j < $count; $j++) { - - if (!is_array($tokens[$j])) break; - - if ($tokens[$j][0] === T_WHITESPACE) continue; - - if (in_array( - $tokens[$j][0], - [ - T_STRING, - T_NS_SEPARATOR, - defined('T_NAME_QUALIFIED') ? T_NAME_QUALIFIED : -1, - defined('T_NAME_FULLY_QUALIFIED') ? T_NAME_FULLY_QUALIFIED : -1, - ], - true - )) { - - $namespace .= $tokens[$j][1]; - - continue; - - } - - break; - - } - - break; - - case T_CLASS: - - case T_INTERFACE: - - case T_TRAIT: - - case defined('T_ENUM') ? T_ENUM : -1: - - if (($tokens[$i - 1][0] ?? null) === T_DOUBLE_COLON) break; - - if (($tokens[$i - 1][0] ?? null) === T_NEW) break; - - for ($j = $i + 1; $j < $count; $j++) { - - if (!is_array($tokens[$j])) break; - - if ($tokens[$j][0] === T_WHITESPACE) continue; - - if ($tokens[$j][0] === T_STRING) { - - $class = $tokens[$j][1]; - - $classes[] = $namespace - ? $namespace . '\\' . $class - : $class; - - break; - - } - - break; - - } - - break; - - } - - } - - return $classes; - - } - -} - -$build = new Build( - 'core-foundation', - 'v0.3.0', - 'core.phar', - '..'.DIRECTORY_SEPARATOR .'src', - '..\..\skeleton\vendor\firehub\core-foundation\phar\\', - '/public/index.php', - false -); -$build->generateClassmap( - [ - __DIR__.'/../src' - ], - __DIR__.'/../src/support/autoload/classmap.php' -); -$build->generateCompiledClassmap( - [ - __DIR__.'/../src' - ], - __DIR__.'/../src/support/autoload/loader/firehub.CompiledClassmap.php' -); - -echo $build; - -$build = new Build( - 'core-foundation', - 'v0.3.0', - 'core.min.phar', - '..'.DIRECTORY_SEPARATOR .'src', - '..\..\skeleton\vendor\firehub\core-foundation\phar\\', - '/public/index.php', - true -); - -echo $build; \ No newline at end of file diff --git a/phar/core.min.phar b/phar/core.min.phar index 07458ae5bb0a40ccb9058a059c36bee8a99cb3c3..c7361a1c80545d6b557c76940b0036507eb7227b 100644 GIT binary patch delta 2189 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 D8md?V diff --git a/phar/core.phar b/phar/core.phar index cd8cd1db5f8ef5769dedea37ca735c11618f07c8..2e6b88092e218ef5566fe922182df47695b60f8d 100644 GIT binary patch delta 2205 zcmXYwc~DbV6o+44l9z=5Au%K%U<85^AqEYQh-}fa2obA-fTBf2q<~~Zajl@(0hi+P z98#BxRH!%(sD%n`RdlR^wg^^53NyH%*eC^Su~4iDq%#D`H87P-9+Yj^&|r3wu6DJJ}dr!ZCuC z#EAt|aTWqbInjU!?ni)9E-G(uXM^QP%>4!oWx|lDeyZItGAK+t7e?cTzW&vL7oB*;M5YB+y_VO4MJunwIl05-EkSk7?~*7!ga1)G!X=K|K-qt#-c1eV+Z zyO8IAjk@B18Muyda5mo&vmbIq$*|*6*h~=515}AoG9<>BVNO`Y7f#sOZl@rSh$V;^ z$qcY|NJ6n0{Z0g7s5KPO=E&ZZ>enI>j~S$j9<>IVqsF#^D$vrQztS zaUcj;%#4$C=Qx$a?DVzi;GOD)nieVE^}W=H(lt>8@tI#<2yHJ@S?n`O5yf*vUCB7? z<@Is+?$|P0~Td0t1CLhj!(f$ zeINZ2)Ynx#=9S zU{5UmpeIU(J<;9dg;uRsGG-fKt|I@|D~evKP+7EgY^fzz!d8giFx&7HfHCZ(ne;JF zz2(AoQc79zgudvFDV$Y^d=(bcp~Bv2e9$WQ!Lw&Rc*|Ln(lFs`#{aT)O&fE){}XC= zk{rw4GEzdl!q^8UV}*++FN2$1n7kaI^u?IPzIfK_i=lPuL^#{6PQ=i?jC*@=Wh<>z z=`BfKY$sZ*;(#DzN+t?aOe5R7mIa}}PsMhk`fay)I|U0*^}~iW`QabU_eZ4oW0JG} zm{Op@0#<0SxN92Q%*L27M{kupW&*1$<_glAdSMH^Wh&0SYbuV%pv{DGj%)E1jA<8u zWeTtjBmmpQnTBsN*M_^(%pi%Ho(pK4z8c`I!;X~MFsMWK=s|5Bsg0M@WR0uW$8 zE7t&4Nxh-8-oRoO$t*UrILzWQi((d!S$t**n(7V0_n#IWxPP*}YY*73)U_P4|*%T4c5MK9I*RP!QmQ(n< zwEqWUeT74?vM4NlsoC80=ya?dPnY@e(^sbs))b1bM)e5$-V1t5ulyuk;o@f;=`okZ z$2nDJOvpUfshF4I?wNaF_M+!Dq|-8n>bOY@<^ zF~=v{&MW74h(sxQUrxHAe73#nAnV0~;AwHDBZZvs;fLWxiJOJDyO%VUjK2};IhZR; zs#y^@xWqW6DBpp2+?ynJ7t6-N%TKS}@VM;f&#zBts-{Nq%W#_D!*WbgJ;?_V|6j+odpiC=e}TvtDF zC?r2`v|vxGU&gbdO^a&Iv>twR?5k1rqCRi8^|!5)^0nmyFXfSn^Jy)<@uhWz6S#e~ zIpNtw zerC*Cwsh{u<^6R#?_~8&ZQJElbMLtJ!<{FMTk47feVPxE*`kI~@dsJp6@vLQBm_Z3 I8%@Ul0Fx1uS^xk5 delta 2205 zcmXX_dt6g>6u-OME@Lnld%&1uATZ>$G2R6?y#!}QE2@nY~1LGzu zHH3UXX{3Uwd_Xi`SgD9a6b2|t&N3`35tF*-tUrGD`#Hb!J?DJSIlp`IiucJY-aEc0 zeJ0-jLCt(=9?J_LkmU`qf;AtYku?`!n6(hViHx@PnHX3-!669t_Pts3`&=>ofGsl0 zqe%gk$|eYg)Jlc}*F?r3cMrqe{NSE`(^bpS){1ZH^skU4MmcbI+I%)}3>iLV|E}oAJ znvaY@KI)fSEdXD-)e?Y1R;X&)3Uvfo`@?0vHOgtSMvbG^QE)j&kO;6zfL4zn1uO>} zoWfcg9MoAGtiZL617DIYR{zKrDU-IDaJfYI0zk76DZdFZ=K?zv@tz${cE~OSC_)iJ zj3^AOt)lrjjBz`H(6{Q>)3qWm`cjLXCLFq^cb-ipIDE)s`h ztj2~Qq%mPFbe}|J^ITR@7DT7JA*V--z0Qaukh(64AWD7L&ZPxXl~IsOT2mIb$g7m# zEH6s%-La+S%o4_#kXO+TnT_3fB#)|{h4cz3@=i-J`!gx-cdk8d;7xmc7v1(aG?oMU z!p%_XfG_BrLjW}Y*kKt!vJ6MqAp&n1EoZ{ z8sM&SIVLBWG`n{MPScah1;)L_q>$p66E{0A2j0JC$Z$bP-7aZxDVvRQ-!#L>Y?Kh{ zisCpfB7GS3yzS(j%vfQuLAEcZg+uotEd@?HwQcfFTl>R~4QO8MSPw2Mk- zOmSn|(Lxmm2y=aMk)UD*d1Y`#2oii%Y&&Y)+|5%T6rS#j13Tf1e>6{xkfz2WN7Pu- zQiB3=G$`(Z#=NsBCe5C!mA9G1Dx;x+bf8v7#Ha(W_E2_#Av3J|Uf2H2>>f2l*K2WwJ?|CzrY ztu=bED%uf9BP)PY%ztEV3^acz!Xn`_YhX z@ILK>*7bgprZc}Utgr5Rbn)Sc_wbW(UGb*Hj$@+_oAxIsIqx#af6n>Iv}JT#_CZ>j z__68F@T#8p&%TOWK);?DwW;;*$)l?V1V4VGxY3^WRN-`ZR!e8;;=U4j%6lC__a&{( z5=lYg_2JUa_PYL#veU<|KSM=-ickDM{oiyjr93t^RfCJ}T~? zHwtRS&bL&J$46}Lz1{TPNa|0Ab~$>fjzmx0da-@@ZS_A(8(yKuUCVCQXZ(3S>d7Im z^XV-t%fbA(irkxf4)`lG-W^OTzI|%LRhd-u;dKwCT3TdtQ*t79^!u#+%P(hUyJR$m z-Y^MlJEm?@9KNH@owH1IU`lCs#xzkP4eUDEt9>D(@|XT~JC7$GY$+76>U-PsHTHoI zkL}zTb~nN~C+1*f|5W(SeTjpo1lfM>24l_;cWZY3&1W@@se(st9{rtFlMTZ2 Date: Tue, 7 Apr 2026 14:41:14 +0200 Subject: [PATCH 26/79] feat: add build and release workflow for PHAR package --- .github/workflows/Release.yml | 42 +++ phar/build.php | 538 ++++++++++++++++++++++++++++++++++ 2 files changed, 580 insertions(+) create mode 100644 .github/workflows/Release.yml create mode 100644 phar/build.php diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml new file mode 100644 index 00000000..eac73303 --- /dev/null +++ b/.github/workflows/Release.yml @@ -0,0 +1,42 @@ +name: Build & Release PHAR + +on: + release: + types: [published] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + extensions: ${{ inputs.phpExtensions }} + tools: ${{ inputs.tools }} + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Install composer dependencies + run: composer install --no-interaction --no-progress --prefer-dist + - name: Load PRIVATE key + run: echo "${{ secrets.FIREHUB_PRIVATE_KEY }}" > private.pem + - name: Build PHAR + run: php -d phar.readonly=0 phar/build.php + - name: Upload artifact + uses: actions/upload-artifact@v7 + with: + name: core + path: | + phar/core.phar + phar/core.min.phar + - name: Upload to existing release + uses: softprops/action-gh-release@v2 + with: + files: | + phar/core.phar + phar/core.phar.pubkey + phar/core.min.phar + phar/core.min.phar.pubkey \ No newline at end of file diff --git a/phar/build.php b/phar/build.php new file mode 100644 index 00000000..087ba45c --- /dev/null +++ b/phar/build.php @@ -0,0 +1,538 @@ + + * Package name. + *

+ * @param string $version

+ * Package name. + *

+ * @param string $phar_name

+ * Phar name. + *

+ * @param string $source

+ * Relative source for phar files. + *

+ * @param string $vendor_source

+ * Relative source for vendor phar files. + *

+ * @param string $index

+ * Relative path within the phar archive to run if accessed. + *

+ * @param bool $minified

+ * If set, it will create a minified version of phar archive. + *

+ * + * @return void + */ + public function __construct ( + private string $name, + private string $version, + private string $phar_name, + private string $source, + private string $vendor_source, + private string $index, + private bool $minified = false + ) { + + $this->cleanup($this->phar_name); + + $this->phar = new Phar($this->phar_name); + $this->phar(); + $this->sign(); + $this->copy($this->phar_name); + + } + + /** + * ### Clean old phar files + * + * @param string $phar_name

+ * Phar name. + *

+ * + * @return void + */ + private function cleanup (string $phar_name):void { + + if (file_exists($phar_name)) unlink($phar_name); + + } + + /** + * ### Create phar archive + * + * @return void + */ + private function phar ():void { + + $this->phar->startBuffering(); + foreach ( + new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($this->source), + RecursiveIteratorIterator::SELF_FIRST + ) as $file + ) { + if ($file->isFile()) + $this->phar->addFromString( + substr($file->getPathname(), strlen($this->source) + 1), + $this->minified ? php_strip_whitespace($file->getPathname()) : file_get_contents($file->getPathname()) + ); + } + + $this->stub(); + + $this->metadata(); + + } + + /** + * ### Stub phar archive + * + * @return void + */ + private function stub ():void { + + $index = $this->index; + + $stub = << + PHAR; + + $this->phar->setStub($stub); + + } + + /** + * ### Set metadata to phar archive + * + * @return void + */ + private function metadata ():void { + + $this->phar->setMetadata([ + 'name' => $this->name, + 'version' => $this->version + ]); + + } + + /** + * ### Sign phar archive + * + * @return void + */ + private function sign ():void { + + $private_key = file_get_contents(__DIR__.'\private.pem'); + $this->phar->setSignatureAlgorithm(Phar::OPENSSL_SHA512, $private_key); + $this->phar->stopBuffering(); + + } + + /** + * ### Copy phar and public key to the vendor folder + * + * @param string $phar_name

+ * Phar name. + *

+ * + * @return void + */ + private function copy (string $phar_name):void { + + copy( + $phar_name, + $this->vendor_source.$phar_name + ) && copy( + $phar_name.'.pubkey', + $this->vendor_source.$phar_name.'.pubkey' + ); + + } + + /** + * ### String representation of an object + * + * @return string + */ + public function __toString ():string { + + return $this->phar_name." was successfully built.\r\n"; + + } + + /** + * ### Generate compiled classmap file + * + * @param array $folders

+ * List of folders to scan for classes, + *

+ * @param non-empty-string $output

+ * Output file path. + *

+ * + * @return void + */ + public function generateCompiledClassmap (array $folders, string $output):void { + + $classmap = $this->generateClassmapData($folders); + + $cases = []; + + foreach ($classmap as $class => $path) { + + $cases[] = " case \\$class::class:\n require __DIR__.'/../../../$path';\n return;"; + + } + + $casesCode = implode("\n\n", $cases); + + $idTag = '$Id$'; + + if (is_file($output)) { + + $existing = file_get_contents($output); + + if (preg_match('/\$Id$]+\$/', $existing, $m)) $idTag = $m[0]; + + } + + $content = << + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $idTag Blob checksum. + */ + +namespace FireHub\Core\Support\Autoload\Loader; + +use FireHub\Core\Support\Autoload\Loader; + +/** + * ### High-performance compiled classmap autoloader + * + * CompiledClassmap is a final autoloader implementation that replaces traditional array-based or PSR-4 class + * resolution with a switch-based dispatch.
+ * Each fully qualified class name maps directly to a required statement, eliminating runtime array lookups and + * filesystem checks. This approach is optimized for PHAR distribution and production environments, providing + * significantly faster class loading—up to 2–5× faster than standard classmaps, and up to 10× faster when combined + * with a single-file compiled core. It is intended to be used after a minimal Preloader and before a Resolver fallback, + * ensuring all core classes are loaded efficiently while maintaining full namespace support. + * @since 1.0.0 + * + * @internal + */ +final readonly class CompiledClassmap implements Loader { + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function __invoke (string \$class):void { + + switch (\$class) { + +$casesCode + + } + + } + +} +PHP; + + file_put_contents($output, $content); + + } + + /** + * ### Generate classmap file + * + * @param array $folders

+ * List of folders to scan for classes, + *

+ * @param non-empty-string $output

+ * Output file path. + *

+ * + * @return void + */ + public function generateClassmap (array $folders, string $output):void { + + $classmap = $this->generateClassmapData($folders); + + $lines = []; + + foreach ($classmap as $class => $path) { + + $class = '\\' . ltrim($class, '\\'); + + $lines[] = " $class::class => __DIR__.'/../../$path',"; + + } + + $export = "[\n" . implode("\n", $lines) . "\n]"; + + $idTag = '$Id$'; + + if (is_file($output)) { + + $existing = file_get_contents($output); + + if (preg_match('/\$Id$]+\$/', $existing, $m)) $idTag = $m[0]; + + } + + $content = << + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/licenses/MIT MIT License + * + * @php-version 7.0 + * @package Core\Support + * + * @version GIT: $idTag Blob checksum. + */ + +namespace FireHub\Core\Support\Autoload; + +/** + * ### Pre-generated mapping of fully qualified class names to their file paths + * + * This file is used by the FireHub autoloader to resolve classes without performing filesystem scanning, + * significantly reducing bootstrap time.
+ * The classmap is generated during the build process and should not be modified manually. + * @since 1.0.0 + * + * @return array + */ +return $export; +PHP; + + file_put_contents($output, $content); + + } + + /** + * ### Generate classmap data + * + * @param array $folders

+ * List of folders to scan for classes, + *

+ * + * @return array + */ + private function generateClassmapData (array $folders):array { + + $classmap = []; + + foreach ($folders as $folder) { + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($folder) + ); + + foreach ($iterator as $file) { + + if (!$file->isFile() || $file->getExtension() !== 'php') continue; + + foreach ($this->extractClassesToken($file->getPathname()) as $class) { + + $relativePath = substr($file->getPathname(), strlen($folder) + 1); + $relativePath = str_replace('\\', '/', $relativePath); + $classmap[$class] = $relativePath; + + } + + } + + } + + ksort($classmap); + + return $classmap; + + } + + /** + * ### Extract fully qualified class names using PHP tokenizer + * + * @return array + */ + private function extractClassesToken (string $file):array { + + $content = file_get_contents($file); + + if ( + !str_contains($content, 'class') && + !str_contains($content, 'interface') && + !str_contains($content, 'trait') && + !str_contains($content, 'enum') + ) return []; + + $tokens = token_get_all($content); + + $classes = []; + $namespace = ''; + $count = count($tokens); + + foreach ($tokens as $i => $i_value) { + + $token = $i_value; + + if (!is_array($token)) continue; + + switch ($token[0]) { + + case T_NAMESPACE: + + $namespace = ''; + + for ($j = $i + 1; $j < $count; $j++) { + + if (!is_array($tokens[$j])) break; + + if ($tokens[$j][0] === T_WHITESPACE) continue; + + if (in_array( + $tokens[$j][0], + [ + T_STRING, + T_NS_SEPARATOR, + defined('T_NAME_QUALIFIED') ? T_NAME_QUALIFIED : -1, + defined('T_NAME_FULLY_QUALIFIED') ? T_NAME_FULLY_QUALIFIED : -1, + ], + true + )) { + + $namespace .= $tokens[$j][1]; + + continue; + + } + + break; + + } + + break; + + case T_CLASS: + + case T_INTERFACE: + + case T_TRAIT: + + case defined('T_ENUM') ? T_ENUM : -1: + + if (($tokens[$i - 1][0] ?? null) === T_DOUBLE_COLON) break; + + if (($tokens[$i - 1][0] ?? null) === T_NEW) break; + + for ($j = $i + 1; $j < $count; $j++) { + + if (!is_array($tokens[$j])) break; + + if ($tokens[$j][0] === T_WHITESPACE) continue; + + if ($tokens[$j][0] === T_STRING) { + + $class = $tokens[$j][1]; + + $classes[] = $namespace + ? $namespace . '\\' . $class + : $class; + + break; + + } + + break; + + } + + break; + + } + + } + + return $classes; + + } + +} + +$build = new Build( + 'core-foundation', + 'v0.3.0', + 'core.phar', + '..'.DIRECTORY_SEPARATOR .'src', + '..\..\skeleton\vendor\firehub\core-foundation\phar\\', + '/public/index.php', + false +); +$build->generateClassmap( + [ + __DIR__.'/../src' + ], + __DIR__.'/../src/support/autoload/classmap.php' +); +$build->generateCompiledClassmap( + [ + __DIR__.'/../src' + ], + __DIR__.'/../src/support/autoload/loader/firehub.CompiledClassmap.php' +); + +echo $build; + +$build = new Build( + 'core-foundation', + 'v0.3.0', + 'core.min.phar', + '..'.DIRECTORY_SEPARATOR .'src', + '..\..\skeleton\vendor\firehub\core-foundation\phar\\', + '/public/index.php', + true +); + +echo $build; \ No newline at end of file From e93c1f175c4d9f94bd2ea73d699cff944c15405d Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 14:46:17 +0200 Subject: [PATCH 27/79] feat: add build and release workflow for PHAR package --- phar/build.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phar/build.php b/phar/build.php index 087ba45c..c543563b 100644 --- a/phar/build.php +++ b/phar/build.php @@ -505,7 +505,7 @@ private function extractClassesToken (string $file):array { 'core-foundation', 'v0.3.0', 'core.phar', - '..'.DIRECTORY_SEPARATOR .'src', + __DIR__ . '/../src', '..\..\skeleton\vendor\firehub\core-foundation\phar\\', '/public/index.php', false @@ -529,7 +529,7 @@ private function extractClassesToken (string $file):array { 'core-foundation', 'v0.3.0', 'core.min.phar', - '..'.DIRECTORY_SEPARATOR .'src', + __DIR__ . '/../src', '..\..\skeleton\vendor\firehub\core-foundation\phar\\', '/public/index.php', true From c60ff90629494d9b0e08287f8ff5981a3502bb13 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 14:49:58 +0200 Subject: [PATCH 28/79] feat: add build and release workflow for PHAR package --- .github/workflows/Release.yml | 2 +- phar/build.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index eac73303..e49b26ce 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -22,7 +22,7 @@ jobs: - name: Install composer dependencies run: composer install --no-interaction --no-progress --prefer-dist - name: Load PRIVATE key - run: echo "${{ secrets.FIREHUB_PRIVATE_KEY }}" > private.pem + run: echo "${{ secrets.FIREHUB_PRIVATE_KEY }}" > phar/private.pem - name: Build PHAR run: php -d phar.readonly=0 phar/build.php - name: Upload artifact diff --git a/phar/build.php b/phar/build.php index c543563b..59e15312 100644 --- a/phar/build.php +++ b/phar/build.php @@ -144,7 +144,7 @@ private function metadata ():void { */ private function sign ():void { - $private_key = file_get_contents(__DIR__.'\private.pem'); + $private_key = file_get_contents(__DIR__.'/private.pem'); $this->phar->setSignatureAlgorithm(Phar::OPENSSL_SHA512, $private_key); $this->phar->stopBuffering(); From 7ec2ed937df51907f75c064d4a2b1922f25fa578 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 14:53:09 +0200 Subject: [PATCH 29/79] chore: update .gitignore to exclude build.php from PHAR artifacts --- .github/workflows/Release.yml | 42 --- .gitignore | 1 - phar/build.php | 538 ---------------------------------- 3 files changed, 581 deletions(-) delete mode 100644 .github/workflows/Release.yml delete mode 100644 phar/build.php diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml deleted file mode 100644 index e49b26ce..00000000 --- a/.github/workflows/Release.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Build & Release PHAR - -on: - release: - types: [published] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v6 - - name: Install PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-versions }} - extensions: ${{ inputs.phpExtensions }} - tools: ${{ inputs.tools }} - env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} - - name: Install composer dependencies - run: composer install --no-interaction --no-progress --prefer-dist - - name: Load PRIVATE key - run: echo "${{ secrets.FIREHUB_PRIVATE_KEY }}" > phar/private.pem - - name: Build PHAR - run: php -d phar.readonly=0 phar/build.php - - name: Upload artifact - uses: actions/upload-artifact@v7 - with: - name: core - path: | - phar/core.phar - phar/core.min.phar - - name: Upload to existing release - uses: softprops/action-gh-release@v2 - with: - files: | - phar/core.phar - phar/core.phar.pubkey - phar/core.min.phar - phar/core.min.phar.pubkey \ No newline at end of file diff --git a/.gitignore b/.gitignore index fa604878..fc61b884 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ composer.lock # PHAR artifacts /phar/** -!/phar/build.php !/phar/*.phar !/phar/*.phar.pubkey diff --git a/phar/build.php b/phar/build.php deleted file mode 100644 index 59e15312..00000000 --- a/phar/build.php +++ /dev/null @@ -1,538 +0,0 @@ - - * Package name. - *

- * @param string $version

- * Package name. - *

- * @param string $phar_name

- * Phar name. - *

- * @param string $source

- * Relative source for phar files. - *

- * @param string $vendor_source

- * Relative source for vendor phar files. - *

- * @param string $index

- * Relative path within the phar archive to run if accessed. - *

- * @param bool $minified

- * If set, it will create a minified version of phar archive. - *

- * - * @return void - */ - public function __construct ( - private string $name, - private string $version, - private string $phar_name, - private string $source, - private string $vendor_source, - private string $index, - private bool $minified = false - ) { - - $this->cleanup($this->phar_name); - - $this->phar = new Phar($this->phar_name); - $this->phar(); - $this->sign(); - $this->copy($this->phar_name); - - } - - /** - * ### Clean old phar files - * - * @param string $phar_name

- * Phar name. - *

- * - * @return void - */ - private function cleanup (string $phar_name):void { - - if (file_exists($phar_name)) unlink($phar_name); - - } - - /** - * ### Create phar archive - * - * @return void - */ - private function phar ():void { - - $this->phar->startBuffering(); - foreach ( - new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($this->source), - RecursiveIteratorIterator::SELF_FIRST - ) as $file - ) { - if ($file->isFile()) - $this->phar->addFromString( - substr($file->getPathname(), strlen($this->source) + 1), - $this->minified ? php_strip_whitespace($file->getPathname()) : file_get_contents($file->getPathname()) - ); - } - - $this->stub(); - - $this->metadata(); - - } - - /** - * ### Stub phar archive - * - * @return void - */ - private function stub ():void { - - $index = $this->index; - - $stub = << - PHAR; - - $this->phar->setStub($stub); - - } - - /** - * ### Set metadata to phar archive - * - * @return void - */ - private function metadata ():void { - - $this->phar->setMetadata([ - 'name' => $this->name, - 'version' => $this->version - ]); - - } - - /** - * ### Sign phar archive - * - * @return void - */ - private function sign ():void { - - $private_key = file_get_contents(__DIR__.'/private.pem'); - $this->phar->setSignatureAlgorithm(Phar::OPENSSL_SHA512, $private_key); - $this->phar->stopBuffering(); - - } - - /** - * ### Copy phar and public key to the vendor folder - * - * @param string $phar_name

- * Phar name. - *

- * - * @return void - */ - private function copy (string $phar_name):void { - - copy( - $phar_name, - $this->vendor_source.$phar_name - ) && copy( - $phar_name.'.pubkey', - $this->vendor_source.$phar_name.'.pubkey' - ); - - } - - /** - * ### String representation of an object - * - * @return string - */ - public function __toString ():string { - - return $this->phar_name." was successfully built.\r\n"; - - } - - /** - * ### Generate compiled classmap file - * - * @param array $folders

- * List of folders to scan for classes, - *

- * @param non-empty-string $output

- * Output file path. - *

- * - * @return void - */ - public function generateCompiledClassmap (array $folders, string $output):void { - - $classmap = $this->generateClassmapData($folders); - - $cases = []; - - foreach ($classmap as $class => $path) { - - $cases[] = " case \\$class::class:\n require __DIR__.'/../../../$path';\n return;"; - - } - - $casesCode = implode("\n\n", $cases); - - $idTag = '$Id$'; - - if (is_file($output)) { - - $existing = file_get_contents($output); - - if (preg_match('/\$Id$]+\$/', $existing, $m)) $idTag = $m[0]; - - } - - $content = << - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - * - * @version GIT: $idTag Blob checksum. - */ - -namespace FireHub\Core\Support\Autoload\Loader; - -use FireHub\Core\Support\Autoload\Loader; - -/** - * ### High-performance compiled classmap autoloader - * - * CompiledClassmap is a final autoloader implementation that replaces traditional array-based or PSR-4 class - * resolution with a switch-based dispatch.
- * Each fully qualified class name maps directly to a required statement, eliminating runtime array lookups and - * filesystem checks. This approach is optimized for PHAR distribution and production environments, providing - * significantly faster class loading—up to 2–5× faster than standard classmaps, and up to 10× faster when combined - * with a single-file compiled core. It is intended to be used after a minimal Preloader and before a Resolver fallback, - * ensuring all core classes are loaded efficiently while maintaining full namespace support. - * @since 1.0.0 - * - * @internal - */ -final readonly class CompiledClassmap implements Loader { - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function __invoke (string \$class):void { - - switch (\$class) { - -$casesCode - - } - - } - -} -PHP; - - file_put_contents($output, $content); - - } - - /** - * ### Generate classmap file - * - * @param array $folders

- * List of folders to scan for classes, - *

- * @param non-empty-string $output

- * Output file path. - *

- * - * @return void - */ - public function generateClassmap (array $folders, string $output):void { - - $classmap = $this->generateClassmapData($folders); - - $lines = []; - - foreach ($classmap as $class => $path) { - - $class = '\\' . ltrim($class, '\\'); - - $lines[] = " $class::class => __DIR__.'/../../$path',"; - - } - - $export = "[\n" . implode("\n", $lines) . "\n]"; - - $idTag = '$Id$'; - - if (is_file($output)) { - - $existing = file_get_contents($output); - - if (preg_match('/\$Id$]+\$/', $existing, $m)) $idTag = $m[0]; - - } - - $content = << - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/licenses/MIT MIT License - * - * @php-version 7.0 - * @package Core\Support - * - * @version GIT: $idTag Blob checksum. - */ - -namespace FireHub\Core\Support\Autoload; - -/** - * ### Pre-generated mapping of fully qualified class names to their file paths - * - * This file is used by the FireHub autoloader to resolve classes without performing filesystem scanning, - * significantly reducing bootstrap time.
- * The classmap is generated during the build process and should not be modified manually. - * @since 1.0.0 - * - * @return array - */ -return $export; -PHP; - - file_put_contents($output, $content); - - } - - /** - * ### Generate classmap data - * - * @param array $folders

- * List of folders to scan for classes, - *

- * - * @return array - */ - private function generateClassmapData (array $folders):array { - - $classmap = []; - - foreach ($folders as $folder) { - $iterator = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($folder) - ); - - foreach ($iterator as $file) { - - if (!$file->isFile() || $file->getExtension() !== 'php') continue; - - foreach ($this->extractClassesToken($file->getPathname()) as $class) { - - $relativePath = substr($file->getPathname(), strlen($folder) + 1); - $relativePath = str_replace('\\', '/', $relativePath); - $classmap[$class] = $relativePath; - - } - - } - - } - - ksort($classmap); - - return $classmap; - - } - - /** - * ### Extract fully qualified class names using PHP tokenizer - * - * @return array - */ - private function extractClassesToken (string $file):array { - - $content = file_get_contents($file); - - if ( - !str_contains($content, 'class') && - !str_contains($content, 'interface') && - !str_contains($content, 'trait') && - !str_contains($content, 'enum') - ) return []; - - $tokens = token_get_all($content); - - $classes = []; - $namespace = ''; - $count = count($tokens); - - foreach ($tokens as $i => $i_value) { - - $token = $i_value; - - if (!is_array($token)) continue; - - switch ($token[0]) { - - case T_NAMESPACE: - - $namespace = ''; - - for ($j = $i + 1; $j < $count; $j++) { - - if (!is_array($tokens[$j])) break; - - if ($tokens[$j][0] === T_WHITESPACE) continue; - - if (in_array( - $tokens[$j][0], - [ - T_STRING, - T_NS_SEPARATOR, - defined('T_NAME_QUALIFIED') ? T_NAME_QUALIFIED : -1, - defined('T_NAME_FULLY_QUALIFIED') ? T_NAME_FULLY_QUALIFIED : -1, - ], - true - )) { - - $namespace .= $tokens[$j][1]; - - continue; - - } - - break; - - } - - break; - - case T_CLASS: - - case T_INTERFACE: - - case T_TRAIT: - - case defined('T_ENUM') ? T_ENUM : -1: - - if (($tokens[$i - 1][0] ?? null) === T_DOUBLE_COLON) break; - - if (($tokens[$i - 1][0] ?? null) === T_NEW) break; - - for ($j = $i + 1; $j < $count; $j++) { - - if (!is_array($tokens[$j])) break; - - if ($tokens[$j][0] === T_WHITESPACE) continue; - - if ($tokens[$j][0] === T_STRING) { - - $class = $tokens[$j][1]; - - $classes[] = $namespace - ? $namespace . '\\' . $class - : $class; - - break; - - } - - break; - - } - - break; - - } - - } - - return $classes; - - } - -} - -$build = new Build( - 'core-foundation', - 'v0.3.0', - 'core.phar', - __DIR__ . '/../src', - '..\..\skeleton\vendor\firehub\core-foundation\phar\\', - '/public/index.php', - false -); -$build->generateClassmap( - [ - __DIR__.'/../src' - ], - __DIR__.'/../src/support/autoload/classmap.php' -); -$build->generateCompiledClassmap( - [ - __DIR__.'/../src' - ], - __DIR__.'/../src/support/autoload/loader/firehub.CompiledClassmap.php' -); - -echo $build; - -$build = new Build( - 'core-foundation', - 'v0.3.0', - 'core.min.phar', - __DIR__ . '/../src', - '..\..\skeleton\vendor\firehub\core-foundation\phar\\', - '/public/index.php', - true -); - -echo $build; \ No newline at end of file From d6e89fe87de2917d1d05914bd96c743ff5eb3c2c Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 15:03:48 +0200 Subject: [PATCH 30/79] Update PHAR build and release --- phar/core.min.phar | Bin 211694 -> 211694 bytes phar/core.phar | Bin 698040 -> 698040 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/phar/core.min.phar b/phar/core.min.phar index c7361a1c80545d6b557c76940b0036507eb7227b..550a2f15f7bdaf13743d2841d56b426e068f5745 100644 GIT binary patch delta 2428 zcmY*Zdr(tn7SAQ`a03Y;Bmu%pgM{*w5JHQ*R6s3Y1s8dghbt{0NLXgnTH1iF7Ijhd zQ{pnKjHn&0S`mxxsLO=LG8WgWIEHoeskWx^Z34rX?kLs zt{>zUa0d3>4Pb$YDL+61r3cKXq5zwyR{@8q7(frZ1e)Yb8*{T?1omwE6u>j~7&mK=#KP$i&==82@Fg$3^^4 z9u9tTC&Xn=ksxn(ih_X^a5KTKtrnEA3Z3(;o zCP%cgcr+}%oJf^AVphl?*8~$Hxx^nQUpnhZ-?T^=C&Fv_Oo79AsfYu|MKp)g@PHoy z(e^*nLN|s5dscsS#;JeqjAzVKMngb7lliJXU@Mzhy}Yt~1IvXYKrSqP=P9S5Y>N{2 z{iza5zEI+!M7iMps$B5UI$Uthb}F>T+VFi99%h#+6y`Le$^u-i#<{nt3qjUua9Uam(G-Kqo&iPp;QD*+?k0j)b_&tsnC!m246pVlj)ew??~& zmyWgK8_#yngOu&=SW2ZutkB{K^=R=lJUueO?_G}~z;8XWq2v^kl>EK+Ci&4Ln(X#; z{$1&J;k=PiMp(btNU4O6k;8tkY>3YFLgF1>Ye3d`V`Eh|yzl)d(3^a)(SttdH|c}% zDf3W1H7^4Sjxy`NU^JlGfIy}oFF5zGt$&>%wp@rF&$x7Ezaw605z$5CFb>Japz9Z>t7oLGf ztrsO1{@+%6?iFO89f0HeX8`^y;y}c#K&*8>5Nk_Iu~gd_R`YX?>_VAms8SDtDkaW zDoc_)^H;QM4?o}TbUZWdxOT1lVMk?Q%}jc2c4_?8qU;7s$Hk#9CXSQdm{h~k5UqKv zA;Z55S=!$+-L1+0SJyko5;pfmy3eZnU0TznMbyRX=k%8Y@5Nm#Qb%8s ztX{NF`MLA?3QJkz)*jK2sMi1X&~EcL z^)x;A=AGuDPo971(mvh!RbAqc`|5_5`(N*l;rkTlAKDL z{w-YDwO93@{_Tf4Yi3`(lQ(!WYrcc8Tfsp=wWVdLk$0`lantxMODLJl{!U})?xMn# zr@W8dK3JkYustbh%PcJ^IVpO4cHJ>`#)8Zbj(1)Q{^^M*(`9OkI(%}t?WuWHU+;y7 z-PMwBPFI~?QtJ5?efWoxTubPfqGn)Y`IVI$=a~+yx!?2RS>f$QH|HLMv|!7gM}y+0 zy{)FwYWmS0W#faUe>}Uf?MjpD@JONVT4`UVLNzxi@v>`tYg8%|9|%b0c}!k4&qXef z?)rMnBS@bb8_P8}EuN~H+vYoSChLe`!^vn%4_W`;z%2eUDw*g7`axOFubV14%z-#D KSCbf@9RC}s>T^E; delta 2428 zcmY*Zc~n$o6rVQ>k69TQhGE!baezTUmSLEY0fbbL1kDW;WKlCj);wy31{h6ah=4C0 zQ`01s)CiT3w3y5&6PL8aElRKh0tsS5u3_)pJEwE{>v!({yUX_tkBNrIM77sB6$4l6 zZUr(x@d@$Bv`B@Z}kI;;JH&$j;;A<3?UT;7v~ngMq8MO4V+gX;tB`r$hdJJ zr*abk>$&p)A9H5_#_^^Bnt15n!Fvg0sZA7MiVf;(ZDxUd+a>`}O=4fUWF*M-q!#d3 z662J%@gQf~#sl+unxFA~%W}hkhe=OF%zIIvcQFihlQ{m_ODYd2O-BMclNH06%*N z#F-9ykl%GMz`$}iEY^?8_B+%T2Q{^K)JDo>!-iKf*uLXoEp6~s=C7W;G>_T;UOTih zxG#Ku5ha$ZsA8EEat+fVf>z!jb=grx{WNAv#@XVvoR;A*UdZCWF=2DvaeFu`5~Wsk~n-`~iw zqP?*zW#bUq(&N%lL=T|{?SK_`(l&K(} zS7rbPxMTxXyI|a)3&th6ra>q7=qGpHH(5&&&MGRz&EEVumrzJY@FA{b@Y&CQv{Rlc z#)@w|-7O1Jwz**`g*#%2JD$)vcRY;=9*e-Q)FT(L&m$d5KBSXUADS*v_dQ~$stJz& zDgB#|X=!Do`NCR4K@K5@t)A%+o#~0hEuLv0E4{F>^;W#?wGi|=Z)|j%H~NiuV|kx>G2uCjYc%Cj60NhJPls(&nE7=%vPt z6>7A1sWEdzz@agYJ9M$|cc$hp1 zd$Pw``}rhfpB{+g`!W#!6@C!n;vlSbEC_20f|1Ls!N~Q8U|cTKizNH-0p?=NS=$IZ zv(I)y{@?I6OimRt|NkA@&FG|}yu5tPC1g1;-WP($^dw|1$SI-L^@ZXz zd0}|>1y<|~D+0fS@Kt~<;RS#y4bE_r6^AsKCouw#_;3WCkywjzkrl6KmqNTYG7lz4 z(vy>PJ|ClkH43Um%crs;UCbF;!ey%tM@;Ip5HMAz0bHlUhuosmfjpv%g+#B@jZO}` zbceF&JgBPaVsZ)nmoR@#fgXN>cbfF?HR*}gCOtd+McEm>$KB2g=CEK5TWAxr&RF`$ zbvIE_vexI@wmnrL#?}XqN@txr{rx-3zIR$1B{D41ZTR%i?zkNdKew~;+Sc^M+Z{fs z`Ffw`qo-3wj{Kq<&AeNh!76X|V{`gTqHo>!ZjEJoKDSFdXHDnDb9H{7?5|YTZ9dg7 z^SS0qcIN%@?%p!_P|&H_$z>(frN2anAMP~gtl9XLvAM6Gzxm|x#maf|CtpPM^vf-w zHG?}Ziw|CI8)|LO>*+P+XB(E9YV^v2$ngu@Ejd>gG`48oJD^V)Zd`KmVqo`8{if?K zAG>y48~pIh(8N_Ycg3f2DmC>Pt5O>e3S_>~9h-8Bg_5{fRoTmK+UZYMnEU){2L?Pw zTVH-yeRXz2-?7Sm&o72&RE~Du&h=}{9U=7#kI7trt6K3QKUOf%@|V}5pv37JV<$rA zXB89`UJR6#ts^`1NoNwbcB~eBWAq<75uaA&)%sn7>Gi^p-|Dlb7-Ks&&2k$lP20$8 zUO4TCqV%SMq{4ewo|bhbZ4OYLc=OyiYwX8-P1N~&rdxAY^*iK0t9(0conv29^*;r_ zma})&zWcj0CxFX8`|NDbc&DW^cU}WOy60Aedw&1ee%}RoCdufe{Gzbxic`_;ipFIt zI>=G??jyyGb*WjS!;k&)IK4G@DC67%r7=fFGs6wDDjxrG`>Qa?C26YZ>@^mBAP)4^ JB*Z7j{|mpiJ0So7 diff --git a/phar/core.phar b/phar/core.phar index 2e6b88092e218ef5566fe922182df47695b60f8d..65e4178f86191be522524c8ad98e93544fdc64db 100644 GIT binary patch delta 2445 zcmXYxdsI_*631`uO>z@LAP*q{B;{cskbps6iH(3D1e9O}L=;LB3W`(|@WC#NqGBsl zmWP*;E?ThE(-pT=SBr4Y3R-Hlw#A|rlxpkiEP|~^>bhOUR`+HmfBeqp%x}KGnfc9c z?j0Bj9T*91xkg!uvDP1S4lqKF1{lQ&0a`gGU>9d0@Fpi7s3KEbS^fG+EQM{d60piOP zrjTAtvOw zq`|($1$AvMsJrHZ7xNJ<0)L(;1Neyu&pj7mVbQL7*e`L#0zY)c!f(4K!@fpr0scvh z_F3^tu$6AusEuye&|x>s$9G=}{w#N_r^6j}Gw!d${%exuz-|fZ9!W5MycFwdlHx;5 zNTWd~l_Aq)MzG(OnV@0!qy%9+V%*F$$wEA{5*=@RT?}u$-ob@im0z;1Ap1-qDU|G3 zh8_o}pPcJt#2#vOS2zGHX=}Ob?sN6Fr0Sde@2ZxyJ5eFycuzt(hT_+vk?SpGcfuzX?t8sAZVc-Ub zhdJ(n?|sGt6Ta}kK{0va`_*{jpbdFqpGgJ!6P(QJ)xRZ(7&l7UHKJzQ)gm* z1Ie{F*OM~(u`>rpgT>}+3gA+M8XM3*1Y_?CLI2GV%n==$4gSW^Y{+qgjWe>d>jL|D z2768*C1oUPE+|aeB2cK=evgd55d#XHnv&A@oVkD3;yv$TeY@>z`qm z+a(-pDGtY4&xhk%KV{<`yi|ABF+le6c5)v5vopi?`8YM#=3Akrh591khkBf%XZlRA zGa{T%7J(h)Ex>^9KCeWE9-vahUmI2jK*sTU9A4XxE)M%XEqtRB-iDS^-VMk@99HV^yG{4Kct3Llm&efS+%l!2tG*As(XK zVWZeKTemSo1{Jd*Urc`|!rx1o5x)PrW5&J5j2w26?4sDkWfzZKe0I_760l3yf6VCe zM`>;FIax^Zk$jEE@wV)uh)0Y3`c*-{ytD59@QsPJl?*{-EVi#)xFiV$<_KhNtaHYxoz3EtiNOJR_m=Z zPwInh$&q|A>DnIN-`Zv;#t(eF{+*}%*F9}pC2u{yQu8t^(D!+rZEAS4cLlHY@VnC;5$Q(h$oI@tch$re(1*k%Ua&8)c)hm z%%TUKC8x*V_NnvB_m|a-&g<&b_Y?(dhif)2_w9fGg=}z{xwBDIY|=%Q3zpjF4Sb%q zOL665A01g#wZW~)zfw5&`6*-jr|%hOND#stXo;*5MlTds5-;K#_-L2EXJBok&seX&wf`f5& hYdV9{!aRRe=4wUv>Lk6H#qSgBcO)YS!klPH{6EA*bFKgY delta 2445 zcmXYxc~nzZ5Qkr05*`T&WHBayU?c`1V2m0DK`k!N zl8RQULdCX7Em-Ix+G@oO*D6#zh@xn4qn1`&s(qQsANPD`?)>h|+`02!Q>&(_RkOW~ zz1I52j$8gV&^(q8P|xxO&S8ZBD_Oz7+pI94CmAJR^w~Wef?#j0%%FF0rSwy_#NrlB z3aJz}LD-@lCPP8pOGblwFQeZ2W?4MV;(C!jvea9gh=u6?1vZz3?4^ReR2ZiTc z9Zg`TJDQ+qe@B9dt1U^PyZEm3T1P3}?kE7kLq{w?%L@m42@h}kJr5JI__44b&qv)Z zKI+=|crkaU@!(H&N&tTAgy-HkVPOFR9qeZbu)zHSEWAtbA?*7I#1--U7yP=*q zk|3}@k%U0Qy2S($R1;J{mq~mFPczxxxLpWuoNZ(9M~dGWm$#*FF3A(EnTQ@6t^KF> z(L$M;HcLeiN$X4yvY6mQ^p!zsm&lA|8Mat6RX8svrPz-5(g+YQjUtHE{(0kU5iG(? zQb18IsN6UR8{aYrhnOP^g%g7qfBb@V^|tVq;|oYfQJFhdW8iL1-SAwm8=jlso&wi+PZGqbyM7v)rBKtlA!3WNfRu~4_zh;;7+;aFh*qj? zUi`dMhs=hM$A@4lxd(EI2aeD=4;+o5o-;tV(lZO#HL z5yzg+M!##37a32WC42=br~YNiV}1rZm8lRSU5V8-k*O6g(3%fDAe(di1cMd!qpT5=_9h3GYA&9*UyofJav^DV-WA%Lj{1^GSzG9rwuq4)ev>>wM9F+ZS^LXr_aIt7ban=wRZsuB~ig9?xh=QnAIf zNX-F7h~IorsF{AZ-kfa!g}<6Drn>F9-}>P_QvI=!P5$_s;f+Mj9ErJ(j>O!2E!L8$ z#ahp3@vR4#czZ8xxMv$6i@BT}PCd3~SUn1-rfn2HVX$sK)V5!TQ}jwV73_r3_9q*S z9psL|fzPw^#+ZE2MUTw^9vhnnRO_)@rFK5mW1N@(oZhbkFt5;ncD|ig4RhhVA#f4& zNW%2Up(XA-t<}rvZ3dp@iizz;_XK)^iZU92;YK}hxe-6#V@4y`ea0||a+iscQ81^F zZZ>+-xoJY`vJ?JZ@`B*|-%uB{sV<1cERtDlW^tIsWtIc8C}ue_i`Q5e#Q$$m@y@nG ztsD9@ZPrQWQ>q+{W>v@JM$2@q;cbQ6(ykl#PL&aE-UrLA3EK0lfBQrG+x0&motHPd zby78_M!By1EtON@(Kzm`VzVdfQq8%Iy9&;8mRY?^$JuXuG-DCbPF`_X% zygsb5tzm=vx$$04a%D-?^8=ownf!|Lor!xLNg@xCY#^-cn`K4!N-lhIW@uv-owd+x zsFwcHxn<3r=^=?tTtR$MS^ItWvIi~ub;4t_*4NjRCe>e_5WU9b$>iY0tz`eU^_zxY z(^@ab#MUJqxOwQKBg3AJ%g=jRu(id1-oxS*$<=i&6?gZ2@luoAIef_StJV?uy0V@= zd4%GJStoqsHq{mm<#yKO96fR0xB1my<8%8PT)Tff_@MvJv&xxW;YA+@F1?FYFw3cC)Jb#+SPH*Y7v1s$Co4-L#v` X7Sz8Ky_W_2N-*D%gdm7$Q@rVaK&mtj From d22355d2cbecb0963afd99743372d8eed4fe8513 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 15:19:13 +0200 Subject: [PATCH 31/79] fix(gitattributes): enforce strict binary handling for .phar files --- .gitattributes | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 21f51c94..263176b4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -42,7 +42,9 @@ *.ico binary *.pdf binary *.zip binary -*.phar binary + +# Phar archives (strict binary integrity – no normalization, no diff) +*.phar -text -diff -merge # GitHub-specific files .gitattributes text From 9ccd2088810284b5ae0e0910ae5060b85d82c572 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 15:22:28 +0200 Subject: [PATCH 32/79] fix(gitattributes): enforce strict binary handling for .phar files --- .gitattributes | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index 263176b4..21f51c94 100644 --- a/.gitattributes +++ b/.gitattributes @@ -42,9 +42,7 @@ *.ico binary *.pdf binary *.zip binary - -# Phar archives (strict binary integrity – no normalization, no diff) -*.phar -text -diff -merge +*.phar binary # GitHub-specific files .gitattributes text From 6066adc228645cb985dfc5001370e77da064f18d Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 15:31:12 +0200 Subject: [PATCH 33/79] Test PHAR --- phar/core.min.phar | Bin 211694 -> 211694 bytes phar/core.phar | Bin 698040 -> 698040 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/phar/core.min.phar b/phar/core.min.phar index 550a2f15f7bdaf13743d2841d56b426e068f5745..899d9e505bc2aea29debcee4980eaffee9b16033 100644 GIT binary patch delta 2189 zcmXw3Yfw{H5YEku1VR!LLI4xQKrlgw1PCM&0g-|)plY-M1=K2vqB4qNK?|Zqgo4N| z#@DD=Tk(acSdfZnD{9q&)M|a!B91Qob5&EM)%1iUv!-HUh-4@o)<}4y=dl2>>cPY+|9E9;_<6 zP=I@O7~sko4^}c~Jj&cpi76~Tcam(kcO&yTV)71$2mYrVtm)4k2UaE*dpp5}Di!vV z;B1OLGDv%5{ArK+-5tWgm*kKDaKr&s{p)}_f_YjvT*yN?`*^7FZ(a->j&zI%$aX}l z*>NUVQa(;$DIW)QfsYkfg2~{UCcx@D1W4%-q`+Z<@NWbZhI z07WQ5m>?Ph)<)4-9L8J*jdsQDVh33!Qj>fCVGEgbSkC{^%PEJCAY*01yv4A{ zy#ie1IB^6XtZtZtWeTXq9h##cNdKP18ZhPmJda$WFV zG`Zl=2r2p^Y_Lv>H|SSsAT&Q9odsZW#SzxIrhz4M!obS+uI;yUqED%Y!1L#8D@2nBV@{P*;nMa zNe_=CpyYU@13dAVjmdkdG~|w=RG_Btlyox6%RQy`L12 zdlY(0rrQX6TC7ej1 zk_m*cQ45g3rCz*a*r|Rb6nPR(>_@g9K8!-SNq#t{dOv)^9DjsFe=Jh#k0rSp6fj?d z;#xGeC4q4MoWnm*iItYrNHrl;>?(VcsDa_a5FFyC^1190Chpj0K9{7P(?O)6^!ArI=ps= zba*LvA!seLfi>hyh|`5G!Qt3Z!{Of=>?1Y7QgTZOmrMkm!exjdz@{Ag!<2|c@3d*&23yK-so zJoWxZqn>}w96ModioNgD-CYB#-dzt1vvRWQGrZ(dVBj3pDM(LTn}s2{qBy7IA6aZ&#P D${nMc delta 2189 zcmXw3dsNJM6rW!+^J|)Z(@ahCsAhU;s)^Dt)y&dEQIX_$_n<;3VVutKY|j*nun}Jx zoF(s*_1Gjjhsuex#jda=D`F#$kVm5R+~2)(_MhM9-0%I|dq4Ny@Auc+&-C^)CG9qu zoNa#xvR@*gv;f1Y0DyEV9AF`D%Yqbe+ZOSbW)OfoVSLVTt+NNx;9s#S%`u zXt1X7#sVDRO#%4Givx(_j{(@gM`kmBG+1JKBtRmKhg<1HusZ2@0DoI-V!o{btOK@T z0C#OMKq-g;Yo;IuWgcY3tlv~uNgfJaNP$2~?g$w0KM`QfK)X?3ne4E)({@m0yKo$w zjTa(=2$6AHi27aaBfytpp9FB+9#ws^M;&@b2Z!?+l(U~fjSrYuIP?=u09Y!N5H zSPBQ6!XgJ8RJ{XM;ENN$H%W}ucZ-qoT09F5lOz)X4oHyFE5V!*jwqto5hr`cF%&2g zCxm#XAHe#_DIAB9$>ngGTpGH_7AGw!drwPvHn6I;Y`}(HeI=~JSDc%dG&=_tStiCs zj*>=VbT3O1R`Ywv4QCB$=@-zW1n9pg#ZJFTqmdTQa5$w8`C&vP(-8ZQ4DH5NWksxY z#z8hZtvY!s|@!$LXI0)EysINE61Tx z3iL%<;YS7Dpv#J3(ELY5D!>#aj<8BO4=j}n&fMfO1FWkqGXb=&nE*e#V!(4(3>fQ{ zjBUMSU%@rs#85&hH6&Q&XgS5B6!aVG+n`j_Au>gk0Z^mDta3GiNsY^HQsXAw-BWopy6V=puCc~l93ze?6LZ=s25A#Od zJG_zd+8e_Y2ccCyXa*K~#1^_5S5QZ0DK(ao^_1L_Z>D4tYa4CZfD?SW*N}bQ21}2W zlG5GQ25Wt=gj|ELM1x{lG&r^(U$nOPqVK6MHW=eK6AQj#<0D7*wy>RHK`s3PGj8`s zU8(-*&`*v3YyeL!W-8F4uS1Io^#N1Cw>e-cCcMXnXMA<2Af6h7g(;>SiA2K#!id3H zNU&pHylBLk4@fBTq#WsgtUY`ljB-#WAo^cxbz^WAsN5fn zw_zZ7GFXW^>vnWFGu|+~o4HnK9cBVb?C@NGs^N#G^*2=mbH4Y9E*8A!MCRqhdt@Zks`q|f z=X5xE@?rIC$ES69S%m{ric)ipH*DJXxRUpWxTkDtwn`p|b-#>=({fSLz?>_FB@058d>l>5hzBfA)TO&!UqF z&&;*+40j7NE;p<^6uY9usQRqDDX*L&T0os^`b~R2uyfS81$J&)e3Hc#p$NqiksyrT1p?Zk$yia&3z+f`rq z`P<6$_VN@T2Vb|$opgb@VoWIS(pmBHo?B)ed6W9wMc>#!g~*P19ctZ~qujABK7Q3_ zMwnABcy)5_A?0+x!bFT-#h!>G^ypy{R_En9M7;<7=89Wx#@fBTTty2s7ASue_5wdGm6-TP~mhTHb;`{>2x5$0yH@UOrW{#YuJXlZS`B<<7kJP!LqcVe%6Ty$dee;mov4FCWD diff --git a/phar/core.phar b/phar/core.phar index 65e4178f86191be522524c8ad98e93544fdc64db..7b985e98c9980fee47b2856653206ad64543a4ad 100644 GIT binary patch delta 2205 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 Hh&JRuo(a-b From 7f3d5468ffa7fdab29eeccb284d5c3b1c53caf25 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 15:37:33 +0200 Subject: [PATCH 34/79] Test PHAR --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 21f51c94..8e318bf3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -42,7 +42,7 @@ *.ico binary *.pdf binary *.zip binary -*.phar binary +*.phar binary -diff -merge -text -ident # GitHub-specific files .gitattributes text From 8377d2b7ee99ac9d190e8e9c36e5577199abc274 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 15:38:01 +0200 Subject: [PATCH 35/79] Test PHAR --- phar/core.min.phar | Bin 211694 -> 211694 bytes phar/core.phar | Bin 698040 -> 703888 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/phar/core.min.phar b/phar/core.min.phar index 899d9e505bc2aea29debcee4980eaffee9b16033..62a1662222b7698a4697411a8dba11ad20c8ef63 100644 GIT binary patch delta 2189 zcmXw3dpMM76rYco&tS$3V+Ipqnvsc_+>Hiubgwne+8m2P@gT9+Q(+b*J;m5TN|XP*7%`#tA9zjMy-ob$e4-vFm?fV2B=qgr-J zr-J@cY(fs;O^gH35~is00;+cVBG7!3Q3JKj+xECKb#*h;@Pkl>OH z^eIiMGSUF|rBNhur38Z!C6T|Q2$loIH)iW=g9*NwQny%_PJ3wLdgGbEzhjIgte9b7 z&0$UksASFt7-U8Ogs{E?*vvv^3o9Hf9vKJ_P2%A$G8(KNG7`Ym1e-`VQGr!y;t$Ye zf&sSdiC`tMC!);5w3wpe#;g;V@E+8H{UoO^>OaR&uK1BgtnP!K&Ib0GsxG*iAcJc$wML7A%29R`76< zp#lv?_t7M?3#?bv9cvlYI>07F+33F{z)nX5VMq(&Fc^CuvivEoP)3;#a>!A1Ra!)W zH4gGmYrJ{JLPOHsbkcgcdp;z!h{|4`1%(+TMr;%!wNZ%qhlRLbwFoz`PK5WOL4-pi zY|y7Mzy=$~9ADFEBW81Pbz0h33~ z!?t?qS8&56+K(b^Wt4}#rM`wq*pP1xZ-cO(3z6~m$pH2Cm{sI}pmV@wUvt1sIy%M! zWvycdz%$20O#XpRLzQj0P4znlQ`<&cgRgRQBEUBTBsrm)2B&#&XzPqh*BPM48LRtC zQ1?#~r1VQLJbDaTRb%3?&=b1Q^@zMiYQC*Zzq^PK>DT8HLcXDm_6)!n>9c&QT%yvy z5)cCNnW4c3DV7k)5SGhOOsfpXrgTATrwjW2alr;Bj!nXXZ|HbUU|%cU85We2uQ6k( zE9y#c)j~h@t_uL1j=pX=CiEE>3%+gRVlm-;Iy`yUqLy-!sq~y3geAq7F@d0V zOGSby{o=XmbN?b?ixXiut==}OPVTCz#=7zyQ(xS z34~iDpFBneT<)73`UN1Y-(_3C`XYr-$mUyBr z*Qudu+U0|?;LD*y-zGeNpR;auPTMbRX^pDze69A_X48`wPP`}_P`>cawk{?UjejfM z68P|-{AtRL;#^azIf(5PmMZGR3i_lbPcDpj=u-7FUcP z?>ekeM74zG#uf2p0%7kPZTP+~*<#(!<5zXUq{rsAb>T^EC;hLqN)Hscr*dnnPO8Hi zuS=>{-_F0)-{zG#<2tQ!Q9@^6`S+S_5_Z!#^{nCim(8s_8-;q`6ZT(TZR(Mmr|vgj za*X+wf0|uA_%W^K-sawmc~8ob5&EM)%1iUv!-HUh-4@o)<}4y=dl2>>cPY+|9E9;_<6 zP=I@O7~sko4^}c~Jj&cpi76~Tcam(kcO&yTV)71$2mYrVtm)4k2UaE*dpp5}Di!vV z;B1OLGDv%5{ArK+-5tWgm*kKDaKr&s{p)}_f_YjvT*yN?`*^7FZ(a->j&zI%$aX}l z*>NUVQa(;$DIW)QfsYkfg2~{UCcx@D1W4%-q`+Z<@NWbZhI z07WQ5m>?Ph)<)4-9L8J*jdsQDVh33!Qj>fCVGEgbSkC{^%PEJCAY*01yv4A{ zy#ie1IB^6XtZtZtWeTXq9h##cNdKP18ZhPmJda$WFV zG`Zl=2r2p^Y_Lv>H|SSsAT&Q9odsZW#SzxIrhz4M!obS+uI;yUqED%Y!1L#8D@2nBV@{P*;nMa zNe_=CpyYU@13dAVjmdkdG~|w=RG_Btlyox6%RQy`L12 zdlY(0rrQX6TC7ej1 zk_m*cQ45g3rCz*a*r|Rb6nPR(>_@g9K8!-SNq#t{dOv)^9DjsFe=Jh#k0rSp6fj?d z;#xGeC4q4MoWnm*iItYrNHrl;>?(VcsDa_a5FFyC^1190Chpj0K9{7P(?O)6^!ArI=ps= zba*LvA!seLfi>hyh|`5G!Qt3Z!{Of=>?1Y7QgTZOmrMkm!exjdz@{Ag!<2|c@3d*&23yK-so zJoWxZqn>}w96ModioNgD-CYB#-dzt1vvRWQGrZ(dVBj3pDM(LTn}s2{qBy7IA6aZ&#P D${nMc diff --git a/phar/core.phar b/phar/core.phar index 7b985e98c9980fee47b2856653206ad64543a4ad..55064ca908a71352a02a00113375afb283089396 100644 GIT binary patch delta 10409 zcmZ9Scf3`_wa4$d{T$#@rAt6X#e%!f44@z?9W)|fBQkr>-s)2kHPL4jA)--Z=O*qX zc7sVYpI||=6Q4E4nrBI|B$hn&sp+CGMxrV2J991q`NwhJv)7b0YyH;mw>Cd~X0NM0 z+3Tv8TJPw-`d9n%-`?)pBs+w)z3gyYZGSu5P@8IpS86ltuygC|{&#f0aN;}dEiG-A z-Kcx7?ikwpr?w&G=-I6UI*)8?Y2l^swobS2{;qY7d-potz3h|EFYK*#?0n7K){%|L zt4>%ox68eHZrkDZ)#uyX>_ggT+NY)MbM0_*`w@2dsC~8_W^^24hl@Jgn@@EdY@Y^p zPP4?H`Zt@3wPOf49fq^q*z_xW|A+b~tN*dwOWVQu{Qb z$9dtD9_Oe>dfW;f1Lxb{4j<@N|HeS~%6kJpXa9KUpu_BN^C0)ip9i@)4;bt=art29 z*_Q_=_LV_H+%RXz6#I0+ko}!A-WuG}qQ0xn=)Gddq~VKa+RJ)*fW532PPF5cFN}PQ zpLQ=dr>*tQ^X9v2JaFiAXFIv4rDdl%Q@+#t{IH2V2kXykYkl;t?wyB*y0iXs=uG$O z>9bl|R_}Al)ZPI*O)LlGt^GT@2D8&>V?F8j%y-A#@gceH)wi{nnT z!`tJIb(6O;&9zsBANRgD?tt>fvs(vswl^of`7_7b_x{x!mXCK^dSLuf_Kzbcxb2?P z9A2N`wjg$KoB!%A?v?j;apntmbx+^j^+>ncI~--i-Mh}}{oKfjrPr@*XnFFGwvmHA z=Fc`1>^P@w>9pP(c9G@%=eG{+{GI!y_krEq62m9D;naz4GtW(QzMH(ed%9wG_uIR> zyHg&t$8xvehuA;-yVIZKczp|cm$bH*S6g0_>=rqXT-+S~7&-IVu?x4`Vz*HL#67KS4$miZO>XgC`(`9UjGo{O=d!({Y?@58XGNNZejuaB50y?*-w*vH9lzp$a{nXSs5QqId1RotvJ&<<1cp`hMZ1vCx^(iB5|`3eSX*i9;O(LFh$s68KS3 z2)m*+?7!*J`!?1wjH6s8xlln7`6kSRIQNw)ST!m*Md+C*QYs5L+i5?U+Kxe%ibw@% zAwyZjQi;HebCDY%RF)}~=ty|hAQ<0!+D{g2+VW&R93yGsA~j(gr73ISvmg^mmKIr{ zQ%>roQII5w@U78jH*NgQeGR*{LIj~wTFEHYN^4$bhQiA;;d2>bo^m6hDy-4|n{NGm zc!k|wtP)Ykh^0)H3B%ztrA@4b$}?ir3j>}bJcv>G+GDN#s|jb<{=?o{U`&|#L8z6{ zsUP{dOu2wO$s?mYDHAV`Sx-mSbV_;5`JIjGxeIE)?Z8x}N(QQklps)|IEy3Sk0PBX zaVGsRO!=!R{8U;~Rc-!C?f5RN3YlmE!V{?yNo*u{Aymlr^GFpYh;n=@wQvin>Za?Q7D?bS)w)|S{?Cx{IT`Z0Hxn<9-uZB!Bl!b^i9 z4Z<`C{5!cnB2w=6RISObnNF@s-5KzzEyj| zdM1?8q-iFk3=*PO>W~8_L1v6lTx6Q(I?hw0wk@~k_i7JYORX}})$S#WgFKC+IOQ5- zBu$bSPei%ml9bN3Sh!Y0NyN$O!jQV`QZh%j$Dr=0%Zt)1oT z_tmY8TiY z$T*N12q=;~^Yesbrz#5k6l+pMurHZ~a)%w*S$e9^zEpd4r1e3Pq=|_0fE@%W)*=XG zuG2URNs%DUVlPNUR{YyGddeHt*Sf29n`?h?p45R71h{X&JLzSBKp~kk7X~O7egPU~ zA`jdwM^#UJSbMsY#Xa(&2np^`Ns||`m-^BoC<_9QvCMpnT46E1;_{N|SQMsE%9q*$ zMU5X?=(7h^MaWsXc;lHQlmZC7Yejg`$5UIYkEgc1alf?`;9F)mj|QV+uGWHY5+oE0 z5~)a{1l;zV<>cPA%R8%qe`^cv;k+Vahorg(n8hSAq3lcFvT9EK@xNLA|;ot{Z%J+9Cyt(Tf53JUvK?Pb;7Y7 zANOaDh@B?|cpiBo@v8gr>aHobcivS zCIuzIA`ex_q@IV{(gf&C0&X2lgD2#LQ1Pdxi_80FbPlM7ws!vL5bO&uD>iA6Na`KP z1J?VQ5>a5Jmu9+vVB}sZwq06W?Kh|M>>f-##Z`Nr333z2fXI*mV3>%U!Vm*dVNy^q z{AQ%s`_`3M)_KNLn8rbpvC&)=Sqk{(9u5#%6(lvRL2H$eTZN%YY`yC8;o*(;^1R*K zMwWkV?HpX030<#@W+o&3%o9X;0f41R7@Ac0)JXgog(RXc6Cg9}yE-{qe>;{#nohG9jiBdoD2_3(W0`}Q&-rO~&+|t_F zQ$F+au159X&%4gtnVF(O3lb#BWJWb)OO!CKQ4v8&oWoMVFf1sDN-yaPDGLGR_>qpJ`1>-Lsms+3*O5D`D4ClE9;){DW4Sn1;?13_%eRR$8S|LLPs*^y2cQAGbEDT_)GRZ!rkQ zk$KV!m<2S604fPpHlZzWd6bZg0HB5$mhWF%pH)7*rXE#uzgS;t8Htw^hUy;!Sp}p7 zS_AP_1f`cK4xvdVl_(>&v%O|hy((hNO8@^}HP$`~Rh2oum8)v+~h>;x4P zTxM-GU`jX!Qkk)EhU74j2JRoPrq&PTfb3XU?=e70(Hv~v`$50AvlSl zX3%L+f_RVc50xk!U*Uq+tOW%LtOXrlSCTk~bZNlP2S{@eOv{vr&F)(^90 zGD2cS2n#^g7@Y}j7WPGrK#P+xIYcUhmo?4sa8I?%E%j;EG(c8K0c(zAW{C8{5->Ow zG?JPRZA=gjfJ)zrzuM3YX&)H#Q93vP1`?pnq0JtgDg@I5)Qkxb--L8E;XC#Foihy3 zAQ3Z!97V$y0)d$_z+W-} zWW)DMch@he#P{oG*wxV3ge^*xT4y;hh#!Sf9>p?qk@EoJR~MTjG&sOms5)&Y!Fyh`;}WLj-fR469Rk~_&OFI-2)l{_z`*L8?atL zoZUiet6$$+pKs0JG2lNysJSYzGY+|7G%!d`NEs-VA8`rBnXRcd{II#d)F!;g4HJw2 zl87?;E*@@VYhYo@wIxt7oXGyxRHyw{{Rp=jdq4=2gd{5tPbnZiax-EsxDR4165L_p zd_SvP`)Yk^HS59p{?^uyG}vebA@L{>)H#SL@IAT5Oxnxfy|LEY*_N+9S|3=x_DH>7 zHSUq-EGZoaRIEZYs?;;oPv8hblyZ(JFLJ|$=AqtU2h6g}?tqp>lq6Yz1dRlI)wd*0 z`y?fOB$`3!c$FG&YaY7Y-}87~SX)w@0P_9R4+7jw7X-Oa7b-U~coe7HF?|VdYyMl? z();gvS9Qiy&HT`ShT-fGWu1_RsZN0sI7krFLqa~&rJ~=#{W=(Pi!*_99o+@?%K4%w zWrtiR*P4U2fhE3_>|7$qtR(!@wz>F+&+>7C-GlcEq9K4#Tlc7$94k|XH97+z5 z!aui7P~H2p=Hj`8JP{j&C$}$YPas&Z)Y?OwhqUCp6lmMQYiInjKEsBOC;b3C`^i@!Qs&UIj1J=ULkI-x0_{wGuWOCI!@8g zOkhC}I9OHW^ruWU*h#b@u3cC-+qd3rR&(TV%#vA_1+-NpF^q!B5mL6lB2%)1CIg~i z`=eIBZyuFyBn$`j=%JoyCj|u;lUvGX^?@m%cWIVcsIu!;-k<8L?NNO%PzJZs<^&3h zz}PM&%^L%3JL!vWLu5hUl9d_CIAqBXm%A+YE>3`+{;?eg|W3nK+Ob}D^P`wa>ZMIXZ)m!SHbtk7iie!T;z}kV2 z*g_61D9SDE2D}NUkciUlZ4dpVS+|f0o-jyT%k-u4Ei)E{B4tB5q;zf*2_Y$V0KDD* z*-W8G(@3Ef#&8TkA|!u>A`Lk(-6tSdY6bRfmwr?4eZSE}YukCrd_zS-6rq1zHF`h<206I7E%k0V(8Zmd1X9P}Lgj$#&TDnx4klcF%MMlZ-wS zjR-Q)5*Zi<*q9NhS|@bxgQy7d?Lu;Db@t%qy1*!U1!q7iBjCzbHbIAwo~Pn}Jd{C7 z7iot*`@hV#H$l5~i=y-)88-+k=A@P?L2FOV0CcRbq zY*=qy65Ey5j1;FyM8}CFg1f^O09oK2ngYY2tYyd`^k`p1+__gv(eeQL{P zprrjGLN^4GfJ%-t=o`g6^-MqX`nx z_eKdKL7;CLkd^f(!xvii^lyM~#yF!Fi9@qknGH4{-t>$*= zMRZg*?brCcwY7DY+ySCuT&<|G2o3|RqjTu1z|LY&l6I@JrIpxOtq2-lv!;@EzEYAee{TkHF7Y6Ql{J+x{ldW z8ap2D>&yLZ_FtdTSm@4=b#%&^1Uh|;uNYD$pWN6l=`l1#c}lk<^L>d zG}Y}H2Q^%MfePk0AB95qhialSKKvP=KZIJd3%b*SuFTfE-*J+|XEi552~&em05t18 zkQ%KArQS%zZ${7n96Ur5L*1O9SMBA8h?SjU6<)2nV z-iOa?e5J-^;}@DWFzFQPl35xT=3F+CnAAW+*pDjE(XBwab&1*Kd5h{@<-EC#@#SHM zve2E^^Rb5M2Urhgf+9#a5;hJ)rzOEBLz)zHR5KdvL?;-|y=*PacG3zD-ehfygiaay z2UZDlptj~Y`kL6IM~n7Coj?JR?f>R|RrNodf7-(Y$a2^`@*O(QM{C-Fn$|!LEuk|4 zN#_enDj?e1O;Fu*M8h>UazCc5&<#S|<#heRlr{mrCsh;3E$vjkIU}%~?IGoqc^#bm z!urnD*OxV>?Ze`9k$q1=$92HAEsP=rG}wnllt&5eH5kH6M9#C{dVVXR3L-Zo?sgc!sE^$!QNY0Qe`Vt{r-=Lh z_55Ei?Yw^Rm{oI5T5i7mxBu<9`|*W)9=Ggg?_YY?irQ1Ret6E!t6x8`--KDqYU`gZ zFWzsLqmw^gyRusP(-AbhgvLADw&F9qKcW%ztP> zvbg`_Mb|f9{rI-$mTdUN#Y-P}?K(YSZ+}?4^fwQ^`<1H)J@xpO7yjdc&b7yOt?`HN ze$@Iad+xdZvB9G+>3`dYcYXGqD}TA<#GhQacG{1ot+@WlmiL!DJn8O!FCJEZ_TY|F zJ~yHI{W`^gFZ^4}qz`VH zTlg=~8Y-#;VzjLp=Z}XpTxb)sJS1I^b4$`{66QPoA=P&8wGf zx@6BO|M|g^I~JXK(w3LMm@fO=uIpYo?x=lVY#bOJI`U@o9e=}y$Gavkzwgn1p7e6d zg(C+%dE9S{(HkCX+_dh^Gw+`i?-Bhr?fCW=x^Mg7z?1)a%b*4EEqAx@uVjX_w6x5g Ixp3zH1N=0?X#fBK delta 4884 zcmZu!XFwF!7T(!1yEC+1ItYjY0!tC3gDnii#?>pz7bMBqXPGN`k;CXG~ zWvND4)Z|0{3M$5vngB*iO)4{lnldJWnrqB(Y8<6e#v0|t%)4@lM7D8fnoy*$5FW_P z(cjTh6E;aEkq}XZbQsm%myQAL4x-)Iu_Q)d6pn&grb5$Wq?YVhC1`VH@l@L=gY@R| z5!6eNkELdpd=fR!8cMljqgZObF@nd0n(gE zi6qZ^L4;sp<%U`_rN*q%40LNOVV0*X;q=L@#LSk2jG4WM^ZHSE9&Yd9Q7tzl@44RFImlV=0R=%mdc+Wd2y6lx~f!U$_^XH(C?4rZQZ zmqfiYcGIZwv`?dEqdf%Nw}*hSeWpNDZ=@2*$v?cb0%PkY_&I3MoA;$QtU`P_7>7g} zne3pW=7R=Z1Dv8i^6 z6sFs{p{mtV3lwc5vsJefm>vac$H)=}3uXO7QRzCV1$!SD;ixMtVeJNHksB0q!3}2T zI{>`R1Ax0X0Jn-<#1MtFcBK2bY#l7%{3CRb+ahxxj-v(t-No2r$YH9-( zQsWv36Im~s)<6i43WAgNRS+y>91Pw<(KH6nq;WwZ^I!_*WD4x*@n;0zKpSC8Fejvj z*b8?M`~IcmRRdO;4d{F z7uTq1Y|(9g%MC)!@lqxJayc{C=q;v2u?;Mb^FCt!QUHd_H!_7vctqqe6n|07oE9n3 zzfr=hlIp_+UAY|Bea1|d>mgLNn{mf`K4*4!$uPlAi&@DKw4y{-$(-nk#U3F4bGuSy zEmX4j_Ccn_AU$B=$C$xli>UcLGYUVeXR1UECVr7P9ZLD(>pwHzoefYQ5#J1dc$wK? zAflitF1W^Aw-sA|t2D(;PnjoTW}40mJd#(j)nr? zi&x(0)KCnQ%^RPfkI6$P&M1|5MV->z(g6IHQ`zC^SCxg1A_&FO*&s3-Zv=GP3#FGK zO&V4pU4zsZU$Rye7G^7!=I1n$zZ}PH3Z3h%c8;|{OkjvylrnpC_Wv|$M<9~30d6}q)?>NAF#Cl>d#? z2=_b4&y=k?e5QC&hEt|r|G!`7`aP|YsW|((EnN zI&i98P0f4y4x2Fg%|pNP`7d@}D~y|(Q4qneeU>8(xw-o1Wvh-?{<`;G@mD*o(zm-# z-0=OA?YfTThu1tR*pc}muA$bPjXYV(>AGQ2c+LpZ|-CKesyY^A5P<#ZAq#E-sk;XYS{!O#7KBwMnyX#CJS49+dhtrDfcX zHrwD6dn@l%oSk^SIPsJnx3BJVS>eg*I`_2Fd1)aI#;?U)>5{V>gM9hf)0YVasivR!s From 98cfb187bd730bd8321be89c0e590a60f7fd01e7 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 7 Apr 2026 15:59:45 +0200 Subject: [PATCH 36/79] Test PHAR --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 8e318bf3..21f51c94 100644 --- a/.gitattributes +++ b/.gitattributes @@ -42,7 +42,7 @@ *.ico binary *.pdf binary *.zip binary -*.phar binary -diff -merge -text -ident +*.phar binary # GitHub-specific files .gitattributes text From 3834db4dce1cd4b2765c8c64fa03a1222434f929 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 8 Apr 2026 08:10:47 +0200 Subject: [PATCH 37/79] Test PHAR --- .gitignore | 8 ++++---- {phar => dist}/core.min.phar | Bin 211694 -> 211694 bytes {phar => dist}/core.min.phar.pubkey | 0 {phar => dist}/core.phar | Bin 703888 -> 698040 bytes {phar => dist}/core.phar.pubkey | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename {phar => dist}/core.min.phar (94%) rename {phar => dist}/core.min.phar.pubkey (100%) rename {phar => dist}/core.phar (96%) rename {phar => dist}/core.phar.pubkey (100%) diff --git a/.gitignore b/.gitignore index fc61b884..25d0a69b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,10 +12,10 @@ Thumbs.db # Composer dependencies resolver composer.lock -# PHAR artifacts -/phar/** -!/phar/*.phar -!/phar/*.phar.pubkey +# Distribution artifacts +/dist/** +!/dist/*.phar +!/dist/*.phar.pubkey # Storage folder for runtime-generated files /storage/ diff --git a/phar/core.min.phar b/dist/core.min.phar similarity index 94% rename from phar/core.min.phar rename to dist/core.min.phar index 62a1662222b7698a4697411a8dba11ad20c8ef63..0d68f4bb6ef93748c36c420a28bff39493bd9a24 100644 GIT binary patch delta 2189 zcmXw(cT`h%6vy*29)Se12oQuYBtVoYBZ&hP5L5_Q1PdslI1r1%DQXqb#8E_%Ay0{% zI>0(`0aX<30n~~;D6Pn;IMAa4#cdE3x6*fSPXEd0+~57)`TM;Xhxo=Je%URic5wS0 zZ~B+w5=uY-F$$1IOaSa9#sTgU69JCQD86>EEAu3S!Ejh#JVmWt&x!~AbrzNov%|oe z$({n*V4FP#JhjJwsUwnc ztQYiG(C)4crU*L)<>w$W)UpX%@|Ee^ARNAj$P|aUfF=jbYU7B=am34RbHtmJ%Tqv- zC(i`*%V%TqH*^}RvhW%;AP=F6oUFlD?KB%OY(lCtcGK*f42O0u*y$P*?z>=hl`HnW z!xbe1t{AQziB`?XBrMcN7rGjyZ=vScDGX%=gpDCzM@WUHF}gB=v2OhvsJ*Ug!!rpX zA^S}OHoIX78wDa;fz5O%aBV*BXqC95@3A`$819jZ1z*zfq2rAm^ki62Nj}Gn<(}Br zEYCEUr^z!N;H<<&L#O?VNA;ZZ^O?2ZKCqu>Xl zwakR;!Sf+5Nc96Q$BbT%Ro9mx$|um4Dh)QL(p2__*};T;xf+*9s#PElRR;l9s`0aG zP;0;%P)`K-YtYKlfVHt!v$a&fx|jJ0xm#0X{@x?s{UEwEd11}|>h+;FS{(lRXncO<=bHn^wGj$ftqh?D(_($`A_O*1tiZgR!h&8x(o;T<1t44>z1ae8w2R95fWc6q6OSImWs zOeJSWdY-;ba^Qlm>cfJ(#mVg@w{IP)k!!loo%0HFJFsUsdY3V{BKq#PtSigj$%i>_ zIWl(Fhx!$t+SUd{^*vlvD!G__BB=G%{H_f;UH2DXnP*hcZqDHAv)XmiC8ghOUb?9I zpG2PQX>CfxVpdf8@u`lzCEVxCCn@>Y!Bj*R5waa#^ecW!IAyd;J=cD|(Q z+8L(KqjVNor!-z*aqkRH&2AB{o!1$gC9Ll-KM?YEzaXnK<8?$Ld9{!8bZFK+WpQEB z*yQqxbvJ#_C9D>ef9arZ#sBhf=T6%rHQ{TvZE=cQK0Lli_v^K$bXmmdoqv4x=urhY zwy)`lOln#DZ?kI`?@nLma<#?V8>bQuciJC4dz>x2eWvI&gZ@Jo(@#DsOdIwel_PfW delta 2189 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 Ixp3zH1N=0?X#fBK diff --git a/phar/core.phar.pubkey b/dist/core.phar.pubkey similarity index 100% rename from phar/core.phar.pubkey rename to dist/core.phar.pubkey From d9fb3e9d58094aa1771c1ec5af333b1553bcc7a7 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 8 Apr 2026 08:23:16 +0200 Subject: [PATCH 38/79] Test PHAR --- dist/core.min.phar | Bin 211694 -> 211694 bytes dist/core.phar | Bin 698040 -> 704617 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/core.min.phar b/dist/core.min.phar index 0d68f4bb6ef93748c36c420a28bff39493bd9a24..9b3d65c575c6cf81da920ea611180bed4e4df300 100644 GIT binary patch delta 2189 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 diff --git a/dist/core.phar b/dist/core.phar index b98bb7afcbb583bb64c5cbdfaa371ac4378ad78d..c9bb69ca2dfea998812f574c4c8c0ae908baebcf 100644 GIT binary patch delta 8804 zcma($3wTuJm3c8F1B8$Oi3s=;Cd>@UWbz_U@&b|&O&|?1LP8wx%-l&XnaAzSog_Tc zi)**ql}cf{M6C<5)-Ahk-7VsyT~gbniqc};e$;|)wdw~g)=G5?qS(6Uod4d*Odh-P zeV2d!^Pl%Q|2gO0Ja=~W<-Pgp+Io3FHX2RCqLbA!vt155y^_l=`Q743Asm@&j7G`B zERx?L1cSm(i&-8Jg60AiQi7u3bM%XfV>l?tvKS0mtX8&a6?1uoP{<*UNFgO;F?VqE zA~@S^#7%Xz5 zF(@kGpufgA%1v#sNFmV0Vgk9H-A$dn=FX-s-QKjN%W->WtGSPCoC%}7scYlr4H{BB z2bEap2&@*o-O|)$W_$LqsgmN*IyP_VGF!=k@%r}%EJ`pef|Vwp>K^`O{L`e>r zS#2FFDKMH{_)BGGMI2G=vR9D&W`q)W3RISfZZdLy{&Zls;+_sXFbz;OdjtK`z|BGb zv|wdKnGSm-G_6ETRW!F441b$oVAWGxdO4gM{EcH?mJ{L77p8f4%R%y zRha<8F)^P6*Q|lt33pl*6e-}hkJxqyLqfTn>AbqsES$%s?S z2d)Ed5ejLcM_pCyxGgZkbu|u%f?Et)a@Py40nxTT;8%hHZ#DA=Y%YWpFkd*N*n;Aa z;Fa8hBIW{-PSX(-`hCI#GM*VtP9Y@v1)m5tK>ulRIGS7Anj8*5kUT20tbn2|2SV|6 zX`-@0&D2S$*tiDVQqU4#a!iWolaU`U)Kq0-E2v3UK!Z@&38LcV@cKt3l)A?kRD|VY ztMQ6{ON?@85150(uzaFSY+h#UF}A@ zyA}&h-F81)ixhP#{903Ow@Fo zHqqa&4Di@_z_O6Ei~ACDRB$5*WUDbTqv3}4d+MRRrg&AjE{Mf@?38mzy;@d`3PMJ7Jd0ggxThD0l9Zt}>u z4aiVQRJ|}3Fmup}*TfSN#X$?;Kxq=ap6Y6l0AN!a(1iW6;2N};yJ7038}7kW;>cw< zeVTlLWyVR_9e^|d;es0=mBm#hJjqRMy~TZSYxF{<`tWY!IR;iBbBg?w8w8~?7hMb~Wx~r3wy5044$ZSB zwAAE*148J9d9_bd5TL8Hh_v+39mBe>hdTO_(Z35gd!bLlm>e}A7z_lf*)Ff-WYN;X zq!2V&RbkL8onGhyHZ;S`q6{onrgLY0QFH@}ClDkqHdnwW2SunAZU)&X1Vh{`?X@9B zRmk?4b#?A?tD??os=m%$l3X%b;VJq8lPHfFRCewvnMq?6V?pf*S~aD+;*+u0>v^$) zpF&$&A%)=mPEycY7T)~PG*bxt0GACbI>b%eIYKa4@pm`igryG>1o}MG&KUdxrsme< zTG}ga=K#Pw@`o%4!pd&%K6s zAH6v8H%{%U21OX{#V()Rj9ryyLP1oc|68R7ii#Xo98kTnm233TDaz+oC(8!+pl6J5 z`9zqAAs4WA^qPICxLlxV?HUM9r*F?4jaM45hIFiqcDNS@xP zv=qazShNH33G^zDOm?~kd;w@zQ@sG9p@pJkBUA)z`84pyCydrgsh(*wKTiqm;|UQ? zZozsvfxbIY1uPvKI~<$0KxFS|-2|ih#QkTxRl+k32|=FcqJPL@?rQGSk zg?^P_X4F)o6XZzBq;j9oxCJrg2N{bEY~ z2nglE=q+ywtu_Yg#BnoQl%5M#_3nYzVQFNVDn;ws-E9fdM zv2cwc8)EYGi|Ga*v|NLsu#fAfONI1-ukMW4)~M5##p#C*eImkAIjLhsr-goRz-ckB zhPsc#f=ACJ>a5ydCICucnhC*vK&odAK_3lPu&HJZVZT@M<7*-K2}3-I9RJv%kCdF* z48xKqZc@UI30~JlVSlpL!i(~h;X*S`8vrR*K-U!aCk%MmwbmS1`|YIqKOeYYga0F` ziB?=n6IbKnNUX)>aAFNEZzMM0vMi}(ZvCHsC0$BMNJ!pyM2H-il@gz=h5!@dEL0nPA4z;(#cUjNhb-j=HG^Ao%2chL-Psc%KSSKxH+Q(m!lbk@<9gi ztXn`zd}9H5_WXi!M9IjcWn*SF?!KB?OU`(AK|(^+v8qtyflTY-E$c8?=jUOtekI{r z9nN_Hj#iER$(fX9_{wb*#>T9AqAg5MNLaM7`n!==7v`mJfP#e7Ju3<4`7E;auUYE| zHQ1bxFk0ZNiOgG+H#Sd9nroOnpYZNkNWOe=A?022BF=ds9JYJzehN8{jeC+(4G-K* z=yxw7ydNzh?tfWC@vT`*5!k($@?v~3IV~}p&g%IxnoSvWD!T-Y|2VrBm#!Rg;fWj% z?v~y}K9_IWin}v6_2FV&BH*%b2@zagLIkZhZzH2VPfAEQ^>+U1NMcT2q-g1aF&0Y7 zHq7GJB5~;*NZGUWE?iD7C9aE?(IPLSV867CBDs8d52EZ^F5z-<`F3KS1Z=+j&C*XJ zSC-d}9odK>y>*!I!{1O<>X2lTya^-A+C+zW*~X4iquBd^@^4lvFelMf}C41eH^_t+`!uh}U)RYfAI^Jo!e!S$joxN9%w z0VyUorIb)kdiip$L`Ib6QZFtiO8vN)%E%-4@#Xz8B5zqk>GscSNYLDJ+WGnNYPk#P z)>I6V7c#*MhSP0lB86qyk^SXqW3R4DUJ|)fu^f>Ml@++uSFXWjsFLo|iOMS6U8$sd zR$N6pZx!zDd9v!>C#w?SNrERCo)may!DE1DHaw~Dq&@p&mGQ4T)WE=v-#lYED*f$) zmholDXS^Bz@{2)Baogrc&;9Ile#3JWRXeWT)qJGkXSLSjmBZ%qFTT~jXwI_LKm7gK z>+XLtt_x*1{`#4BKCisv{xv6e1--r7YCb%8zrencHGDYmkE1PDKd2o1y6fswKg?;Y zd3kSf`iX-6UvBMqsA0hq_D{Z&`L;axUG=@L&Zd+7`3WC%BxEd0Jn~6s)%f)f*L?V! zny=k^GX0j9{^OzV7cV?^CUbM=pAKE#?YZ#yru+V~!}Rk{e*RJ2<$J15{%h5VlSeN- z{A0uR#iO?r6}c>xUmXp1!=|@{6`~ z%kvLDn0DpX!}*>csG~o+BXNJq>F>$E^R55yq_+@VaB^726ZX{_bM;o`V_h45q)Z?9RfUmhU~C z$zJ)-;~)RtR@?BpZG-sA=&5JUUAz9stS;HqcJ1HFFYHUd+4}bPw zpQYaIyO8(M>P;PoH{JTBOV_W3K6IztFt#ObxN+ssT|dZ3A9TKz05>BuAt9k}%ojt{ei*XTPX(J7{o(+&0v%wj01tdBz-sOZ!eP_Z zAB)QN$4dA5C&T8Te04;Ms4p_}Fre)0g0i!EizhYeebl7upA+I`v^#DgEzdS^p6$@y)ZKNGf?7(_} zOH!i`Q*~m2gF1gpJ|xWb1t(<=!Co8>QK52qGC^z;l`1gF*=o{`YrP2Lq+;y#Kg2kG zo#J>5cV?X0jdh*w z95hoHwz?w>ePb-d;W&L;!XuzdZQ*MG^CO_~lrdr>pf3VniZ59OR+VHO;D#h05G%z4 z%~CutD_sqnD_5++E6itJOxv7ULiNW9=$;00F}=Z+%!iD@k?_%fW4 z*JL;Vmt?sR5-cwUyenUeX-OvS{=Je}s#P9GXHg`NXT|Km3j%{LtG{DBGWrER$A$ZZ z)oPDg3mF`uu}o7mmibLIUO}WlyrXy#LLMmaLP;?g(i(&3=2&ZW>?$naK9kg?!#9~) z6d|DQBrK)9MVuwPS(Lh33{2(Z#8A2zIbC{ybmES%MVR7H!NS5j9&4$M$9CRkt#~Dd zyr;x_Pb$};-XF~Qo{{nk%(Xzzg;st@I&vr2tS1t%Qae>1lwYbU0Q9Rcd3YlF8WJ(< zy~LH^i&3w{tT&nSeYGtX=5^$>bu4Ew_h&ZasM?4D0;ZdN*YYAUU?}eIfTKxRvu!fA zYEv@)Dx79vlY%1oDJXd+1q)b`ip5o?vJW`T=p6Wd`!LQ$^>K0$9o9}R;XY#JL(*^{ zcBbL8JWMk}(b?%Z7e~?!V9ljt+SM7@rjr>srk)x^y~Ye7Q<}{Hqt*nts>QZMWg-q{ z;_>NB9Kc*13jJ4y*77VwT~;BSyPx$Ew!)EV1=phamb$HVp>F9GQoL+8iq7_en67LY zU@UtDAV7~_mr)-DR;!-fPIDYuV3vuvd^c?*Ftz%{(Rr^V`A@~qf*UX)u7{%eU~RLKgi6= zSI0eVX>6Vp?UQBXuIZ3i*MBmaZ6)=VOFs&^wP|9st@AaGg?@N=+s*Z|e-{kT_54~> zn!YllKW~4_DpTp*!$X4^um0)YT3A#WzSOa2qSrolT@lx(UqYX6`rv}wVA76z=c`*v z=M8MOx)<{7yf*ah>UFb4k2=fh6jc|8ukoBl+dh0^G(=p~y*s%rC$fgCZ@L*qPd(_3 zZ?ZbT5$^5#`bVjJY$&6{f5-izJ=NLmRcC5~Tq{&!ZPv$KeH_Zl`OKYDf!2AccRL>| z-f(jmp{_@nX38P1U8a599 zZZ$XaAJL=f9EHiUdu_@1aQDWKhI&%W;kJC8WBt7D;%R~7TQRfk$+cbQZl|Z6?w1_A zP-E>!Xs7DcPJu@g+6`5o?t1-6bMV=T`mrjHD-Dt-LtKyH$*`wKTbsN6g51i8yyI7@ zP7O@`e$w5c;JLcHapv;J-LjLs>j$6h2rrg@{d$?W^{`Cw`1(JONwiI*{A{6q^v1v& w&XGTnfn7N{FBvLzxs6S(%XT_%f6Cu_?of#hZ@~Zg1i^eNjs!uZsI;oT0P(K1!T Date: Wed, 8 Apr 2026 08:35:33 +0200 Subject: [PATCH 39/79] Test PHAR --- dist/core.min.phar | Bin 211694 -> 211694 bytes dist/core.phar | Bin 704617 -> 698040 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/core.min.phar b/dist/core.min.phar index 9b3d65c575c6cf81da920ea611180bed4e4df300..64efc97b1b9b94744e3a39f9e30ece0f14adb675 100644 GIT binary patch delta 2189 zcmXw3dsvKV6rZnVrnxrLOfyrX+ceG8M5B8%(nY9|k|%VPh$x%1uA9qNLM}!6Fs!Ar z*uu6U%hJtKPgtUr%PLze`=ASt+AJ&koioq=^ZlOlp5Hm=cg}g=Z(x`=Fw84`V5S(^ z^T>nxk}N_4;6u0rq!K{@M~Fax$3!TAy;%fLG18fNmPVu56_mUs_b|j{zq!b`ZX&^F zHc+P&smd$_xG&8N$aNuTv`A;oTasYdlR|Tru{M|xa3;a9gSVBY( z11pX`4WN=f8(@SU0T9ZV3Q)vA=5@vtumsGB0MSf5+|7&z>j~2U;AVkMEV0mmRcR3b z@Vf;D*svypmBN~gGLKSXw(e*=OZISV$$XZWe8}Q~{{;(cdax&fmBYr~&ak0M87C6X zqBzJPImo!rLH%-WF!++VF#xBysOke3b@=kU;BW~KI3$j+mq%DO-mJ4u^ zlf)qyJwTB-7Z|U|JJu?)eVE0Z#6o|Q7&{#mhaoM9N2BfUVFZwTiHhWo@R(z$s+5RA zYaC>&HQqdPi79C*m9$>ew6TrG*n*yMbF90Z(W57!}222~1 zh;8*zui&OS+MgtBRHUb!m9d6S$e3?TZ-cOlhsY$m`2h8Hm{n?zkYkU_ZnMWtIyfW& zWt~GNz;lPWnEV};hCI0KHaX}JOzw2F24AJ)T!7CeNO3|n4Ni%0Xrn-->rL=Pfz<!vnp*H3l2`%#J;Ew-7i1Q2h0*7Nk4ac(c-(gbgD7JXChb~}x`8g_Pi zM*sSSc^!UZ=2w+{h_aYI_QDna-W{<;!!0XwoBF)JAJvw&?3D2azcF_78;U31TU$`C zWB=)wAK5-+_cr^|hX+}$x)V2FIfSnw?C*xRC|5T$DriG_H+IbFh>Pzo^i+N+U~dl{ zjk$fbKUKGC>5I6>Uu#}>e$4tTZhth*z;}r%YAyVn#~lo--c@nQJ!g2(I%u&=Z$YlT zALn2}lfJ2SQCD)GbEkHE+{b?o1wEZxJom3{awech#!jonix zq$=NgL~vzp8KqC%o1+Jc4Q*a$rrQ57(6ghfXV7|2YUR+cryky3Ju5@>{?Wb?_Uc*E z+l_r8TQ7Fi2DVytczjzvw*UYD delta 2189 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 delta 8804 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 Date: Wed, 8 Apr 2026 09:00:44 +0200 Subject: [PATCH 40/79] Test PHAR --- dist/core.min.phar | Bin 211694 -> 211694 bytes dist/core.phar | Bin 698040 -> 698040 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/core.min.phar b/dist/core.min.phar index 64efc97b1b9b94744e3a39f9e30ece0f14adb675..1fcd9a8ed57c21e7aa420ed0ba5bc3331786048c 100644 GIT binary patch delta 2189 zcmXw3X;f2J5Y8jXBalEABndGrq5%RV5(E-Nfq;sr0jpvKM3y3oB2a0q3pNNA5elMD zNnI+SwFMW%Ai`0WBVvzetGMrqdR$OMtqav!?VHKzpZA@)^UcgRGxxs1x4gl(yvnOq zT^~1ISJ7XJLnr~p5Z(aE#CU+6Lr%!28omCic`>iG;cND>3OmSDfq6oG#C17$)jiH3VR-L;rcLD98iTTVK!0%;Z z2@xv-tl6w+fLhipfFV{CKsb9Mz&bWEd)O1e;*;Y53?v?IAPr#MAtwWPSz{9mtaV`3 zT5ADrSYv>c6A4xlClY1uqQw-Kc9^L?TPLc3<3L^G@WB6wgEdt)da!bBu(v}tP-T2^QVGu1|O?$_ec97ZaW!8qmAeV?ijDXHo=q=01wtGb*C*!|P%O4{MU&&rEUTLg=& z=Hnvu4q+HQNRw<^*iWh6VG8QpTMnt`puf`rJN@Jkfwb{F2BWHvt)=W76%==fM-Hc} z(jtn6;UIq>hBuGtXh~X0Cv8*u7D7_{DS0{BP?$kt#2QDWb~s}Ge;skZA!6LXDly)R zb}gHA~Nq4^<6BET#uj_|NF11z}{&OFy?4p^t1k^q#lRDd647|<`n zfau}z*wz633eI>Kf+#|&p#0=QQv-{TkS{H7gOGm-kqPn?fHpa16+0v3I^(iWIpZc> zToQn?(j^n%q03xM{+dohZ7n%Vy>JPo%3Ozmuhw-gz-J32xuKeNw|F>|jzFcWEO2K8 zR@b_t?#=EWicT(*(Mzhk<@8{9;OQf zSf;~gbyyb+)(agzIZZHHS;1fxH3Y9~2qsz@f~^8R8&|&hRDLl2Qib%1f2ZNyqV(M{ z`r`wNA|J`-vg-w5+Xr0_6{dLZZeF{*`GDq|iZ|m!KCbcaJJD4>-)F%u7Xt3Hiu3B8 z*PLv*+TS#;wV^*I^+vB@ZRL8^AFV;cnGI#C=)nB0`a3qEuQEEqbI-ZAK8cq!FL}Hz z+o3vdf^VLc-uO9M^~f`2Zujc*d^XFwDX(+R!IXOQjWd-+4{ODqb)_MxUp(>Xm|(0Z z?usd3wq99yLf+F6DA~K-81vVL^ew&37vgU8kh2r_-(8Vt9y9RLIxz9uUamP$JP;LG zvvZq%NON28!93FMy!*n9Kc7!4lScQfT9LQIdTNe-L!+qFm~&Qd(;DXYTb$KVRnzT1 z1Nt0W1&#b$(Y&9>JUDcRZ*HW+Vt`kk{ z`8vIH>&=_8DkE3Aq+XG(I!(qr`xL7S5~UXUmsVx(E6}qtv_;oP3-=gPy6T=R^rh)l>cA=T@d@#8zp=9i( zJJq|g_NQ^vnx5`I(!O=mGN0^=5qn*pd49iC5w1N@)srLWug~AipnvEh`pQQ|7$W`y D58}vQ delta 2189 zcmXw3dsvKV6rZnVrnxrLOfyrX+ceG8M5B8%(nY9|k|%VPh$x%1uA9qNLM}!6Fs!Ar z*uu6U%hJtKPgtUr%PLze`=ASt+AJ&koioq=^ZlOlp5Hm=cg}g=Z(x`=Fw84`V5S(^ z^T>nxk}N_4;6u0rq!K{@M~Fax$3!TAy;%fLG18fNmPVu56_mUs_b|j{zq!b`ZX&^F zHc+P&smd$_xG&8N$aNuTv`A;oTasYdlR|Tru{M|xa3;a9gSVBY( z11pX`4WN=f8(@SU0T9ZV3Q)vA=5@vtumsGB0MSf5+|7&z>j~2U;AVkMEV0mmRcR3b z@Vf;D*svypmBN~gGLKSXw(e*=OZISV$$XZWe8}Q~{{;(cdax&fmBYr~&ak0M87C6X zqBzJPImo!rLH%-WF!++VF#xBysOke3b@=kU;BW~KI3$j+mq%DO-mJ4u^ zlf)qyJwTB-7Z|U|JJu?)eVE0Z#6o|Q7&{#mhaoM9N2BfUVFZwTiHhWo@R(z$s+5RA zYaC>&HQqdPi79C*m9$>ew6TrG*n*yMbF90Z(W57!}222~1 zh;8*zui&OS+MgtBRHUb!m9d6S$e3?TZ-cOlhsY$m`2h8Hm{n?zkYkU_ZnMWtIyfW& zWt~GNz;lPWnEV};hCI0KHaX}JOzw2F24AJ)T!7CeNO3|n4Ni%0Xrn-->rL=Pfz<!vnp*H3l2`%#J;Ew-7i1Q2h0*7Nk4ac(c-(gbgD7JXChb~}x`8g_Pi zM*sSSc^!UZ=2w+{h_aYI_QDna-W{<;!!0XwoBF)JAJvw&?3D2azcF_78;U31TU$`C zWB=)wAK5-+_cr^|hX+}$x)V2FIfSnw?C*xRC|5T$DriG_H+IbFh>Pzo^i+N+U~dl{ zjk$fbKUKGC>5I6>Uu#}>e$4tTZhth*z;}r%YAyVn#~lo--c@nQJ!g2(I%u&=Z$YlT zALn2}lfJ2SQCD)GbEkHE+{b?o1wEZxJom3{awech#!jonix zq$=NgL~vzp8KqC%o1+Jc4Q*a$rrQ57(6ghfXV7|2YUR+cryky3Ju5@>{?Wb?_Uc*E z+l_r8TQ7Fi2DVytczjzvw*UYD diff --git a/dist/core.phar b/dist/core.phar index a231f1f67c9414019d476359f30562acb0e1fec6..cf18c21e9d8e1aaaff889d7d72d6284e6512431a 100644 GIT binary patch delta 4504 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 Bd|Lnj delta 4503 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 Date: Wed, 8 Apr 2026 09:31:56 +0200 Subject: [PATCH 41/79] Test PHAR --- dist/core.min.phar | Bin 211694 -> 211694 bytes dist/core.phar | Bin 698040 -> 690634 bytes src/domain/autoload/firehub.Handle.php | 2 -- src/firehub.FireHub.php | 2 -- src/public/boot.php | 2 -- src/public/index.php | 2 -- src/shared/constants/firehub.Number.php | 2 -- src/shared/constants/firehub.Path.php | 2 -- .../contracts/firehub.ArrayConvertable.php | 2 -- src/shared/contracts/firehub.Arrayable.php | 2 -- src/shared/contracts/firehub.Countable.php | 2 -- src/shared/contracts/firehub.Iterator.php | 2 -- .../contracts/firehub.IteratorAggregate.php | 2 -- .../contracts/firehub.JsonSerializable.php | 2 -- .../firehub.JsonSerializableConvertable.php | 2 -- src/shared/contracts/firehub.Throwable.php | 2 -- src/shared/contracts/firehub.Traversable.php | 2 -- .../contracts/magic/firehub.Serializable.php | 2 -- .../magic/firehub.SerializableConvertable.php | 2 -- .../contracts/magic/firehub.Stringable.php | 2 -- .../enums/controlflow/firehub.Signal.php | 2 -- src/shared/enums/data/firehub.Category.php | 2 -- .../enums/data/firehub.ResourceType.php | 2 -- src/shared/enums/data/firehub.Type.php | 2 -- src/shared/enums/datetime/firehub.Zone.php | 2 -- .../datetime/format/firehub.Predefined.php | 2 -- .../enums/filesystem/firehub.Permission.php | 2 -- src/shared/enums/firehub.Comparison.php | 2 -- src/shared/enums/firehub.Order.php | 2 -- src/shared/enums/firehub.Side.php | 2 -- src/shared/enums/json/firehub.Flag.php | 2 -- src/shared/enums/json/flag/firehub.Decode.php | 2 -- src/shared/enums/json/flag/firehub.Encode.php | 2 -- src/shared/enums/json/flag/firehub.Error.php | 2 -- .../enums/json/flag/firehub.Validate.php | 2 -- src/shared/enums/number/firehub.LogBase.php | 2 -- src/shared/enums/number/firehub.Round.php | 2 -- .../string/count/firehub.CharacterMode.php | 2 -- .../enums/string/count/firehub.WordFormat.php | 2 -- .../enums/string/firehub.CaseFolding.php | 2 -- src/shared/enums/string/firehub.Compare.php | 2 -- src/shared/enums/string/firehub.Encoding.php | 2 -- src/shared/enums/string/firehub.Sort.php | 2 -- .../systemruntime/firehub.IniAccessLevel.php | 2 -- .../systemruntime/firehub.PhpExtension.php | 2 -- src/shared/firehub.ValueObject.php | 2 -- src/support/autoload/firehub.Loader.php | 2 -- .../autoload/loader/firehub.Classmap.php | 2 -- .../autoload/loader/firehub.Resolver.php | 2 -- .../firehub.RegisterAutoloaders.php | 2 -- .../bootloader/firehub.RegisterConstants.php | 2 -- .../bootloader/firehub.RegisterHelpers.php | 2 -- src/support/bootstrap/firehub.Bootloader.php | 2 -- .../bootstrap/firehub.FireHubConfigurator.php | 2 -- .../contracts/firehub.DataStructure.php | 2 -- .../abstract/firehub.ArrayCollection.php | 2 -- .../capability/firehub.Transformable.php | 2 -- .../contracts/firehub.Collection.php | 2 -- .../datastructure/firehub.ArrayCollection.php | 2 -- .../traits/firehub.Convertable.php | 2 -- .../traits/firehub.Enumerable.php | 2 -- .../datastructure/traits/firehub.Shared.php | 2 -- src/support/firehub.Autoload.php | 2 -- src/support/firehub.LowLevel.php | 2 -- src/support/lowlevel/firehub.Arr.php | 2 -- src/support/lowlevel/firehub.CharMB.php | 2 -- src/support/lowlevel/firehub.CharSB.php | 2 -- src/support/lowlevel/firehub.ClsObj.php | 2 -- src/support/lowlevel/firehub.Constant.php | 2 -- src/support/lowlevel/firehub.Data.php | 2 -- src/support/lowlevel/firehub.DataIs.php | 2 -- src/support/lowlevel/firehub.DateAndTime.php | 2 -- src/support/lowlevel/firehub.Declared.php | 2 -- src/support/lowlevel/firehub.FileSystem.php | 2 -- src/support/lowlevel/firehub.Func.php | 2 -- src/support/lowlevel/firehub.Iterator.php | 2 -- src/support/lowlevel/firehub.Json.php | 2 -- src/support/lowlevel/firehub.Math.php | 2 -- src/support/lowlevel/firehub.Random.php | 2 -- src/support/lowlevel/firehub.Regex.php | 2 -- src/support/lowlevel/firehub.RegexMB.php | 2 -- src/support/lowlevel/firehub.Resources.php | 2 -- src/support/lowlevel/firehub.SplAutoload.php | 2 -- src/support/lowlevel/firehub.StrMB.php | 2 -- src/support/lowlevel/firehub.StrSB.php | 2 -- .../lowlevel/firehub.SystemRuntime.php | 2 -- src/testing/firehub.Base.php | 2 -- .../arr/firehub.ChunkLengthTooSmallError.php | 2 -- .../firehub.FailedToSortMultiArrayError.php | 2 -- ...ub.KeysAndValuesDiffNumberOfElemsError.php | 2 -- .../lowlevel/arr/firehub.OutOfRangeError.php | 2 -- .../arr/firehub.SizeInconsistentError.php | 2 -- .../firehub.RegisterAutoloadError.php | 2 -- .../firehub.UnregisterAutoloaderError.php | 2 -- .../clsobj/firehub.ClassDoesntExistError.php | 2 -- .../firehub.FailedToCreateAliasError.php | 2 -- .../constant/firehub.AlreadyExistError.php | 2 -- .../constant/firehub.FailedToDefineError.php | 2 -- .../constant/firehub.NotDefinedError.php | 2 -- .../firehub.ArrayToStringConversionError.php | 2 -- .../data/firehub.CannotSerializeError.php | 2 -- .../data/firehub.FailedToSetTypeError.php | 2 -- .../data/firehub.SetAsResourceError.php | 2 -- .../data/firehub.TypeUnknownError.php | 2 -- .../data/firehub.UnserializeFailedError.php | 2 -- ...ehub.FailedToFormatTimestampAsIntError.php | 2 -- .../datetime/firehub.FailedToGetZoneError.php | 2 -- .../datetime/firehub.FailedToSetZoneError.php | 2 -- .../datetime/firehub.FormatTimestampError.php | 2 -- .../datetime/firehub.ParseFromFormatError.php | 2 -- .../firehub.StringToTimestampError.php | 2 -- .../filesystem/firehub.CannotListError.php | 2 -- .../firehub.ChangeSymlinkGroupError.php | 2 -- .../firehub.ChangeSymlinkOwnerError.php | 2 -- .../filesystem/firehub.CopyPathError.php | 2 -- .../filesystem/firehub.CreateFolderError.php | 2 -- .../filesystem/firehub.CreateLinkError.php | 2 -- .../filesystem/firehub.CreateSymlinkError.php | 2 -- .../filesystem/firehub.DeletePathError.php | 2 -- .../filesystem/firehub.DiskSpaceError.php | 2 -- .../firehub.GetAbsolutePathError.php | 2 -- .../filesystem/firehub.GetContentError.php | 2 -- .../filesystem/firehub.GetGroupError.php | 2 -- .../filesystem/firehub.GetInodeError.php | 2 -- .../firehub.GetLastAccessedError.php | 2 -- .../firehub.GetLastChangedError.php | 2 -- .../firehub.GetLastModifiedError.php | 2 -- .../filesystem/firehub.GetOwnerError.php | 2 -- .../filesystem/firehub.GetPathSizeError.php | 2 -- .../firehub.GetPermissionsError.php | 2 -- .../filesystem/firehub.GetStatisticsError.php | 2 -- .../filesystem/firehub.GetSymlinkError.php | 2 -- .../firehub.MoveUploadedFileError.php | 2 -- .../firehub.ParentLevelTooSmallError.php | 2 -- .../firehub.PathDoesntExistError.php | 2 -- .../filesystem/firehub.PutContentError.php | 2 -- .../filesystem/firehub.ReadFileError.php | 2 -- .../filesystem/firehub.RenameError.php | 2 -- .../filesystem/firehub.SearchError.php | 2 -- .../filesystem/firehub.SetGroupError.php | 2 -- .../firehub.SetLastAccessAndModifyError.php | 2 -- .../filesystem/firehub.SetOwnerError.php | 2 -- .../firehub.SetPermissionsError.php | 2 -- .../func/firehub.RegisterTickFailedError.php | 2 -- .../lowlevel/json/firehub.DecodeError.php | 2 -- .../lowlevel/json/firehub.EncodeError.php | 2 -- .../number/firehub.ArithmeticError.php | 2 -- .../number/firehub.DivideByZeroError.php | 2 -- .../random/firehub.MaxLessThanMinError.php | 2 -- .../firehub.NumberGreaterThanMaxError.php | 2 -- .../random/firehub.NumberLessThanMinError.php | 2 -- .../random/firehub.SecureNumberError.php | 2 -- .../regex/firehub.InvalidPatternError.php | 2 -- .../firehub.ChunkLengthLessThanOneError.php | 2 -- ...irehub.CodepointOutsideValidRangeError.php | 2 -- .../string/firehub.ComparePartError.php | 2 -- .../lowlevel/string/firehub.EmptyPadError.php | 2 -- .../string/firehub.EmptySeparatorError.php | 2 -- .../string/firehub.InvalidEncodingError.php | 2 -- .../firehub.FailedToGetProcessIDError.php | 2 -- .../firehub.FailedToGetServerAPIError.php | 2 -- ...ub.FailedToSetConfigurationOptionError.php | 2 -- ...irehub.InvalidConfigurationOptionError.php | 2 -- ...ehub.InvalidConfigurationQuantityError.php | 2 -- .../firehub.InvalidExtensionError.php | 2 -- .../firehub.SleepTimeInvalidError.php | 2 -- .../firehub.InvalidValueObjectError.php | 2 -- .../firehub.WrongReturnTypeException.php | 2 -- .../firehub.ImplementationException.php | 2 -- .../firehub.InvalidFolderException.php | 2 -- .../firehub.InvalidHandleException.php | 2 -- .../firehub.InvalidNamespaceException.php | 2 -- ...irehub.FailedToLoadBootloaderException.php | 2 -- .../firehub.NotBootloaderException.php | 2 -- src/throwable/firehub.Builder.php | 2 -- src/throwable/firehub.Error.php | 2 -- src/throwable/firehub.ErrorBuilder.php | 2 -- src/throwable/firehub.Exception.php | 2 -- src/throwable/firehub.ExceptionBuilder.php | 2 -- src/throwable/firehub.Throwable.php | 2 -- src/throwable/valueobject/firehub.Code.php | 2 -- 181 files changed, 358 deletions(-) diff --git a/dist/core.min.phar b/dist/core.min.phar index 1fcd9a8ed57c21e7aa420ed0ba5bc3331786048c..d65b1eff3e724f86a3a656088dcade3dee03d648 100644 GIT binary patch delta 2428 zcmY*Zc~n$o6raZov%ml|3@{AKunsW@BLXuFifppEFltaJAY$oZF*X4+MOlhP1q7Zt zN=FgWV-hK-1XO~MT1qaMM3@CZnt}pmm|9}*-8;u~`s;V@{=3WfP0sKqXZY2F%ns&{ zHMiYqAbErxub*cZfhhsa`mr@=ra@U@&ZoDj$^!{P)%k2TJByAlPp3kn8t^gO5;B_$1afe zGTMr7Jlmu>Mh?4+x~Z<{m)@SZdtNw@wg7qs7Z!7+rskpPA1z5@LxuTz~uVL4|)mzi)yiV3cX(8@X2b$||X z%vdBx`yDxER=UN2y}~U9GT)){B)v3lp|+*g@+%1;DUh+i!+*|t@ZeG3k%B|EwMmjjSXbZK3g7aL*W4`BlVBFw|$MoFuO^`M7bnBak z)71CEyHD5QfLA8?MR;!nZ1YYBl=v^o$HZK4{T z>ve6E>{3g~-C;(YHPl~1|264;@DqG^%CGE{AJKlwPtW^R!FR`ARl6y3iw^`J^Gbf%Fj&}Tv%TaHchTV9 zzAs~@F%=G-aD&x4LgC_^hnPA|RuDOXb{Vm%N=ziz2K)do%OF;nv(6QJ=nj^r~L}Scz?? z#(mir)+V9%?|ofrZZ`PhVC0j-X_-g9Ob)x#va>O)Dx>hh#lI!%J_uqp zRQ+)K?$O2Gm&a^}zf!E*;k~6MC7|)d%#>TI)a~qp&a%+Yh5K5rZYy;w{ynE|)`Q_! zAN{H?{u?V7$7g>IKV7(abKOrB#IC-9>7@={k2lYG$Vyal&xgi#TqRA;b_SkZI2CwC z>77y86O=o!`&MsLhBC!f&YNFQ7ui`K?v!D_tw$rz-Fv*&)+t|o- z?ESW!eeSPTeDw0N>YL$blM@vZ&5NhUONLTAa+9Wfl6`wv+=4=zp^D}a^3vjxpthnt z+S+daJX7De{$Eb=Q*V!6`Iz53apLTb_Wd8udVP}VG?E-INO1f1X}urs`&9zwy@_xJ Obs(nH)kK6uh5QGOMY+)c delta 2428 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 z
vmC>lm};n*|oe|@)FnakDdO52Drtc8qp!5-c3CdzO3gm$8N@2rU)9sgfKi}any zM@gG5q94kr5;Q2QIo}W!b`fWw-}A`}<=RP{q>vAwIbR~0(M?dJPRXJ#O6g95tIEiC z9|?J9A;hGk1^?M%|W!!7%X`{hUa z9TJBY-r*aSbmeXEu7ToQ8(Bk$QeJwbntu51aIv+eeQ}i7mB%FAQz_Fle099oO?ouo z?1^HEj;^i|7Uzf+QbzK}*@>bOonIn4W7i@vMY_@(A;NdU9~X-G79vbUv+8+g^zs}p zqSos~TYO@<7-mZ|2Vi1n^97?@R-Y;?Yk9Qw8{=f>}Xo_ zvdytQA7`L=OKw>PK!?GtU8DNAtF}{;y_9vo*(BZnZeTuPQ ziBE36_ovy4vm4K^c=N*%j|H`Z5_&wVP&`{!oqC~D-8!$j7qLNq+P&Ctr!0Q@+RWS6 z$6!zR+x42{wS3AnmW7RnVBUuALsvZWBn+#XX>y&9+k98o;UyN(%5CftJy{4 zT|!(tzIvA@HjBTIq1f(lE`4fZ-LCn?2dCH>K#v!;PjMU1$7d?HZ2z;>i0s-_-*G-8 zg(#m#*`Y0sGYj0FcTSzKpuPW3vtmN`MrOt?Z#nd6qZdH~w1GZzM?S87^UD^)hM#9O z*?xM*gD%bIU7xY|!4O`&;in^$eM#-%5@mv3+{_tJUzziL4K!R|=@ L-}1zSt_lAKdBkgd delta 15252 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 Knb<9*+y4O|V%M4g diff --git a/src/domain/autoload/firehub.Handle.php b/src/domain/autoload/firehub.Handle.php index c8fba260..29004310 100644 --- a/src/domain/autoload/firehub.Handle.php +++ b/src/domain/autoload/firehub.Handle.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Domain - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Domain\Autoload; diff --git a/src/firehub.FireHub.php b/src/firehub.FireHub.php index 473d49e2..b3ddd6c4 100644 --- a/src/firehub.FireHub.php +++ b/src/firehub.FireHub.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core; diff --git a/src/public/boot.php b/src/public/boot.php index b4ef3b16..58f7a5a8 100644 --- a/src/public/boot.php +++ b/src/public/boot.php @@ -12,8 +12,6 @@ * * @php-version 7.0 * @package Core\Public - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Public; diff --git a/src/public/index.php b/src/public/index.php index 5bf63e94..24c76c4f 100644 --- a/src/public/index.php +++ b/src/public/index.php @@ -12,8 +12,6 @@ * * @php-version 7.0 * @package Core\Public - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Public; diff --git a/src/shared/constants/firehub.Number.php b/src/shared/constants/firehub.Number.php index f5ee6220..f5f02cdc 100644 --- a/src/shared/constants/firehub.Number.php +++ b/src/shared/constants/firehub.Number.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Constants\Number; diff --git a/src/shared/constants/firehub.Path.php b/src/shared/constants/firehub.Path.php index 4c4b8a50..2402206c 100644 --- a/src/shared/constants/firehub.Path.php +++ b/src/shared/constants/firehub.Path.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Constants\Path; diff --git a/src/shared/contracts/firehub.ArrayConvertable.php b/src/shared/contracts/firehub.ArrayConvertable.php index 0d45580e..32965e8f 100644 --- a/src/shared/contracts/firehub.ArrayConvertable.php +++ b/src/shared/contracts/firehub.ArrayConvertable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.Arrayable.php b/src/shared/contracts/firehub.Arrayable.php index b23e647f..1896b453 100644 --- a/src/shared/contracts/firehub.Arrayable.php +++ b/src/shared/contracts/firehub.Arrayable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.Countable.php b/src/shared/contracts/firehub.Countable.php index 1cd92118..9c4654c7 100644 --- a/src/shared/contracts/firehub.Countable.php +++ b/src/shared/contracts/firehub.Countable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.Iterator.php b/src/shared/contracts/firehub.Iterator.php index 60c94a9e..9a3ee4fd 100644 --- a/src/shared/contracts/firehub.Iterator.php +++ b/src/shared/contracts/firehub.Iterator.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.IteratorAggregate.php b/src/shared/contracts/firehub.IteratorAggregate.php index 36dbbe73..7c4cc33f 100644 --- a/src/shared/contracts/firehub.IteratorAggregate.php +++ b/src/shared/contracts/firehub.IteratorAggregate.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.JsonSerializable.php b/src/shared/contracts/firehub.JsonSerializable.php index f33032ac..facd71e7 100644 --- a/src/shared/contracts/firehub.JsonSerializable.php +++ b/src/shared/contracts/firehub.JsonSerializable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.JsonSerializableConvertable.php b/src/shared/contracts/firehub.JsonSerializableConvertable.php index e25d945d..558d9a88 100644 --- a/src/shared/contracts/firehub.JsonSerializableConvertable.php +++ b/src/shared/contracts/firehub.JsonSerializableConvertable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.Throwable.php b/src/shared/contracts/firehub.Throwable.php index 7b3c6f85..431eb89c 100644 --- a/src/shared/contracts/firehub.Throwable.php +++ b/src/shared/contracts/firehub.Throwable.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.Traversable.php b/src/shared/contracts/firehub.Traversable.php index 45d17202..e2c417dd 100644 --- a/src/shared/contracts/firehub.Traversable.php +++ b/src/shared/contracts/firehub.Traversable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/magic/firehub.Serializable.php b/src/shared/contracts/magic/firehub.Serializable.php index 191c59b9..5746ed24 100644 --- a/src/shared/contracts/magic/firehub.Serializable.php +++ b/src/shared/contracts/magic/firehub.Serializable.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts\Magic; diff --git a/src/shared/contracts/magic/firehub.SerializableConvertable.php b/src/shared/contracts/magic/firehub.SerializableConvertable.php index c0107ce4..47399378 100644 --- a/src/shared/contracts/magic/firehub.SerializableConvertable.php +++ b/src/shared/contracts/magic/firehub.SerializableConvertable.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts\Magic; diff --git a/src/shared/contracts/magic/firehub.Stringable.php b/src/shared/contracts/magic/firehub.Stringable.php index 11f0b57a..69f166fc 100644 --- a/src/shared/contracts/magic/firehub.Stringable.php +++ b/src/shared/contracts/magic/firehub.Stringable.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts\Magic; diff --git a/src/shared/enums/controlflow/firehub.Signal.php b/src/shared/enums/controlflow/firehub.Signal.php index 38abceae..70ec6b18 100644 --- a/src/shared/enums/controlflow/firehub.Signal.php +++ b/src/shared/enums/controlflow/firehub.Signal.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\ControlFlow; diff --git a/src/shared/enums/data/firehub.Category.php b/src/shared/enums/data/firehub.Category.php index 54e86e79..bdadab01 100644 --- a/src/shared/enums/data/firehub.Category.php +++ b/src/shared/enums/data/firehub.Category.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Data; diff --git a/src/shared/enums/data/firehub.ResourceType.php b/src/shared/enums/data/firehub.ResourceType.php index cb7492bf..40e2d225 100644 --- a/src/shared/enums/data/firehub.ResourceType.php +++ b/src/shared/enums/data/firehub.ResourceType.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Data; diff --git a/src/shared/enums/data/firehub.Type.php b/src/shared/enums/data/firehub.Type.php index 8d5fbd35..ea83deb4 100644 --- a/src/shared/enums/data/firehub.Type.php +++ b/src/shared/enums/data/firehub.Type.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Data; diff --git a/src/shared/enums/datetime/firehub.Zone.php b/src/shared/enums/datetime/firehub.Zone.php index 5f72399a..3a4efc82 100644 --- a/src/shared/enums/datetime/firehub.Zone.php +++ b/src/shared/enums/datetime/firehub.Zone.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\DateTime; diff --git a/src/shared/enums/datetime/format/firehub.Predefined.php b/src/shared/enums/datetime/format/firehub.Predefined.php index c5967f84..9cf8ada4 100644 --- a/src/shared/enums/datetime/format/firehub.Predefined.php +++ b/src/shared/enums/datetime/format/firehub.Predefined.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\DateTime\Format; diff --git a/src/shared/enums/filesystem/firehub.Permission.php b/src/shared/enums/filesystem/firehub.Permission.php index 2dd3c123..ae7280ee 100644 --- a/src/shared/enums/filesystem/firehub.Permission.php +++ b/src/shared/enums/filesystem/firehub.Permission.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\FileSystem; diff --git a/src/shared/enums/firehub.Comparison.php b/src/shared/enums/firehub.Comparison.php index 9b9829f4..bf8f053a 100644 --- a/src/shared/enums/firehub.Comparison.php +++ b/src/shared/enums/firehub.Comparison.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums; diff --git a/src/shared/enums/firehub.Order.php b/src/shared/enums/firehub.Order.php index f86a5210..eb578043 100644 --- a/src/shared/enums/firehub.Order.php +++ b/src/shared/enums/firehub.Order.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums; diff --git a/src/shared/enums/firehub.Side.php b/src/shared/enums/firehub.Side.php index 90899f8a..69f21baf 100644 --- a/src/shared/enums/firehub.Side.php +++ b/src/shared/enums/firehub.Side.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums; diff --git a/src/shared/enums/json/firehub.Flag.php b/src/shared/enums/json/firehub.Flag.php index ce08ec5f..f71f3d1a 100644 --- a/src/shared/enums/json/firehub.Flag.php +++ b/src/shared/enums/json/firehub.Flag.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Json; diff --git a/src/shared/enums/json/flag/firehub.Decode.php b/src/shared/enums/json/flag/firehub.Decode.php index 368d1851..d541208b 100644 --- a/src/shared/enums/json/flag/firehub.Decode.php +++ b/src/shared/enums/json/flag/firehub.Decode.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Json\Flag; diff --git a/src/shared/enums/json/flag/firehub.Encode.php b/src/shared/enums/json/flag/firehub.Encode.php index 7c4906ee..8da9af21 100644 --- a/src/shared/enums/json/flag/firehub.Encode.php +++ b/src/shared/enums/json/flag/firehub.Encode.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Json\Flag; diff --git a/src/shared/enums/json/flag/firehub.Error.php b/src/shared/enums/json/flag/firehub.Error.php index 388dbbc7..5410fa0f 100644 --- a/src/shared/enums/json/flag/firehub.Error.php +++ b/src/shared/enums/json/flag/firehub.Error.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Json\Flag; diff --git a/src/shared/enums/json/flag/firehub.Validate.php b/src/shared/enums/json/flag/firehub.Validate.php index a9cf5e1e..56a674b2 100644 --- a/src/shared/enums/json/flag/firehub.Validate.php +++ b/src/shared/enums/json/flag/firehub.Validate.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Json\Flag; diff --git a/src/shared/enums/number/firehub.LogBase.php b/src/shared/enums/number/firehub.LogBase.php index 2f019fa4..6e39b1f6 100644 --- a/src/shared/enums/number/firehub.LogBase.php +++ b/src/shared/enums/number/firehub.LogBase.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Number; diff --git a/src/shared/enums/number/firehub.Round.php b/src/shared/enums/number/firehub.Round.php index 3e2cebe8..db641516 100644 --- a/src/shared/enums/number/firehub.Round.php +++ b/src/shared/enums/number/firehub.Round.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Number; diff --git a/src/shared/enums/string/count/firehub.CharacterMode.php b/src/shared/enums/string/count/firehub.CharacterMode.php index 8acfff47..16ede02f 100644 --- a/src/shared/enums/string/count/firehub.CharacterMode.php +++ b/src/shared/enums/string/count/firehub.CharacterMode.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String\Count; diff --git a/src/shared/enums/string/count/firehub.WordFormat.php b/src/shared/enums/string/count/firehub.WordFormat.php index 237e96d9..1dfc7bd2 100644 --- a/src/shared/enums/string/count/firehub.WordFormat.php +++ b/src/shared/enums/string/count/firehub.WordFormat.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String\Count; diff --git a/src/shared/enums/string/firehub.CaseFolding.php b/src/shared/enums/string/firehub.CaseFolding.php index a82f6808..6d74dc51 100644 --- a/src/shared/enums/string/firehub.CaseFolding.php +++ b/src/shared/enums/string/firehub.CaseFolding.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String; diff --git a/src/shared/enums/string/firehub.Compare.php b/src/shared/enums/string/firehub.Compare.php index b8a82fce..a20703ab 100644 --- a/src/shared/enums/string/firehub.Compare.php +++ b/src/shared/enums/string/firehub.Compare.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String; diff --git a/src/shared/enums/string/firehub.Encoding.php b/src/shared/enums/string/firehub.Encoding.php index 8528ab42..527dab59 100644 --- a/src/shared/enums/string/firehub.Encoding.php +++ b/src/shared/enums/string/firehub.Encoding.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String; diff --git a/src/shared/enums/string/firehub.Sort.php b/src/shared/enums/string/firehub.Sort.php index 266b675e..1d9ad9b1 100644 --- a/src/shared/enums/string/firehub.Sort.php +++ b/src/shared/enums/string/firehub.Sort.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String; diff --git a/src/shared/enums/systemruntime/firehub.IniAccessLevel.php b/src/shared/enums/systemruntime/firehub.IniAccessLevel.php index 2a297513..9fa76920 100644 --- a/src/shared/enums/systemruntime/firehub.IniAccessLevel.php +++ b/src/shared/enums/systemruntime/firehub.IniAccessLevel.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\SystemRuntime; diff --git a/src/shared/enums/systemruntime/firehub.PhpExtension.php b/src/shared/enums/systemruntime/firehub.PhpExtension.php index 0edff313..e9403946 100644 --- a/src/shared/enums/systemruntime/firehub.PhpExtension.php +++ b/src/shared/enums/systemruntime/firehub.PhpExtension.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\SystemRuntime; diff --git a/src/shared/firehub.ValueObject.php b/src/shared/firehub.ValueObject.php index fdf9918a..17a2c802 100644 --- a/src/shared/firehub.ValueObject.php +++ b/src/shared/firehub.ValueObject.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared; diff --git a/src/support/autoload/firehub.Loader.php b/src/support/autoload/firehub.Loader.php index d280a8c1..c7acaef1 100644 --- a/src/support/autoload/firehub.Loader.php +++ b/src/support/autoload/firehub.Loader.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Autoload; diff --git a/src/support/autoload/loader/firehub.Classmap.php b/src/support/autoload/loader/firehub.Classmap.php index e89dfe0b..8b282ee2 100644 --- a/src/support/autoload/loader/firehub.Classmap.php +++ b/src/support/autoload/loader/firehub.Classmap.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Autoload\Loader; diff --git a/src/support/autoload/loader/firehub.Resolver.php b/src/support/autoload/loader/firehub.Resolver.php index f6a9a41d..0144108a 100644 --- a/src/support/autoload/loader/firehub.Resolver.php +++ b/src/support/autoload/loader/firehub.Resolver.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Autoload\Loader; diff --git a/src/support/bootstrap/bootloader/firehub.RegisterAutoloaders.php b/src/support/bootstrap/bootloader/firehub.RegisterAutoloaders.php index 1534c1eb..6f5a8550 100644 --- a/src/support/bootstrap/bootloader/firehub.RegisterAutoloaders.php +++ b/src/support/bootstrap/bootloader/firehub.RegisterAutoloaders.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Bootstrap\Bootloader; diff --git a/src/support/bootstrap/bootloader/firehub.RegisterConstants.php b/src/support/bootstrap/bootloader/firehub.RegisterConstants.php index 41dc6647..c2750913 100644 --- a/src/support/bootstrap/bootloader/firehub.RegisterConstants.php +++ b/src/support/bootstrap/bootloader/firehub.RegisterConstants.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Bootstrap\Bootloader; diff --git a/src/support/bootstrap/bootloader/firehub.RegisterHelpers.php b/src/support/bootstrap/bootloader/firehub.RegisterHelpers.php index 1c21e05d..22f6583c 100644 --- a/src/support/bootstrap/bootloader/firehub.RegisterHelpers.php +++ b/src/support/bootstrap/bootloader/firehub.RegisterHelpers.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Bootstrap\Bootloader; diff --git a/src/support/bootstrap/firehub.Bootloader.php b/src/support/bootstrap/firehub.Bootloader.php index 0e8395f4..def47dae 100644 --- a/src/support/bootstrap/firehub.Bootloader.php +++ b/src/support/bootstrap/firehub.Bootloader.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Bootstrap; diff --git a/src/support/bootstrap/firehub.FireHubConfigurator.php b/src/support/bootstrap/firehub.FireHubConfigurator.php index cc69382c..3f842eac 100644 --- a/src/support/bootstrap/firehub.FireHubConfigurator.php +++ b/src/support/bootstrap/firehub.FireHubConfigurator.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Bootstrap; diff --git a/src/support/contracts/firehub.DataStructure.php b/src/support/contracts/firehub.DataStructure.php index 46c88a3c..fe194fae 100644 --- a/src/support/contracts/firehub.DataStructure.php +++ b/src/support/contracts/firehub.DataStructure.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Contracts; diff --git a/src/support/datastructure/abstract/firehub.ArrayCollection.php b/src/support/datastructure/abstract/firehub.ArrayCollection.php index 5a83bfe4..acd62e7b 100644 --- a/src/support/datastructure/abstract/firehub.ArrayCollection.php +++ b/src/support/datastructure/abstract/firehub.ArrayCollection.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Abstract; diff --git a/src/support/datastructure/contracts/capability/firehub.Transformable.php b/src/support/datastructure/contracts/capability/firehub.Transformable.php index 8fa65fa9..c1977bed 100644 --- a/src/support/datastructure/contracts/capability/firehub.Transformable.php +++ b/src/support/datastructure/contracts/capability/firehub.Transformable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Contracts\Capability; diff --git a/src/support/datastructure/contracts/firehub.Collection.php b/src/support/datastructure/contracts/firehub.Collection.php index 673b68bf..accc17eb 100644 --- a/src/support/datastructure/contracts/firehub.Collection.php +++ b/src/support/datastructure/contracts/firehub.Collection.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Contracts; diff --git a/src/support/datastructure/firehub.ArrayCollection.php b/src/support/datastructure/firehub.ArrayCollection.php index 7e3c752b..f1d8e276 100644 --- a/src/support/datastructure/firehub.ArrayCollection.php +++ b/src/support/datastructure/firehub.ArrayCollection.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure; diff --git a/src/support/datastructure/traits/firehub.Convertable.php b/src/support/datastructure/traits/firehub.Convertable.php index 2fb1f4af..64f3e41c 100644 --- a/src/support/datastructure/traits/firehub.Convertable.php +++ b/src/support/datastructure/traits/firehub.Convertable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Traits; diff --git a/src/support/datastructure/traits/firehub.Enumerable.php b/src/support/datastructure/traits/firehub.Enumerable.php index 94bd4a5a..0bcde9b8 100644 --- a/src/support/datastructure/traits/firehub.Enumerable.php +++ b/src/support/datastructure/traits/firehub.Enumerable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Traits; diff --git a/src/support/datastructure/traits/firehub.Shared.php b/src/support/datastructure/traits/firehub.Shared.php index 7c340e7f..1c1f8f77 100644 --- a/src/support/datastructure/traits/firehub.Shared.php +++ b/src/support/datastructure/traits/firehub.Shared.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Traits; diff --git a/src/support/firehub.Autoload.php b/src/support/firehub.Autoload.php index 8c27aaf5..fee8fa9a 100644 --- a/src/support/firehub.Autoload.php +++ b/src/support/firehub.Autoload.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support; diff --git a/src/support/firehub.LowLevel.php b/src/support/firehub.LowLevel.php index f7c59cdc..f6883c5c 100644 --- a/src/support/firehub.LowLevel.php +++ b/src/support/firehub.LowLevel.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support; diff --git a/src/support/lowlevel/firehub.Arr.php b/src/support/lowlevel/firehub.Arr.php index 7cfeec7e..08f2a8a7 100644 --- a/src/support/lowlevel/firehub.Arr.php +++ b/src/support/lowlevel/firehub.Arr.php @@ -9,8 +9,6 @@ * * @php-version 8.5 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.CharMB.php b/src/support/lowlevel/firehub.CharMB.php index c80eafd3..e95bfebf 100644 --- a/src/support/lowlevel/firehub.CharMB.php +++ b/src/support/lowlevel/firehub.CharMB.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.CharSB.php b/src/support/lowlevel/firehub.CharSB.php index cd5a03ca..093b0f61 100644 --- a/src/support/lowlevel/firehub.CharSB.php +++ b/src/support/lowlevel/firehub.CharSB.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.ClsObj.php b/src/support/lowlevel/firehub.ClsObj.php index e72cf70b..4c8a675b 100644 --- a/src/support/lowlevel/firehub.ClsObj.php +++ b/src/support/lowlevel/firehub.ClsObj.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Constant.php b/src/support/lowlevel/firehub.Constant.php index b86edd10..aa0e87c1 100644 --- a/src/support/lowlevel/firehub.Constant.php +++ b/src/support/lowlevel/firehub.Constant.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Data.php b/src/support/lowlevel/firehub.Data.php index d9d08cb3..f3970fed 100644 --- a/src/support/lowlevel/firehub.Data.php +++ b/src/support/lowlevel/firehub.Data.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.DataIs.php b/src/support/lowlevel/firehub.DataIs.php index 8a2b9343..5ccebfe0 100644 --- a/src/support/lowlevel/firehub.DataIs.php +++ b/src/support/lowlevel/firehub.DataIs.php @@ -9,8 +9,6 @@ * * @php-version 7.3 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.DateAndTime.php b/src/support/lowlevel/firehub.DateAndTime.php index 6f9760e9..b6b7748d 100644 --- a/src/support/lowlevel/firehub.DateAndTime.php +++ b/src/support/lowlevel/firehub.DateAndTime.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Declared.php b/src/support/lowlevel/firehub.Declared.php index f94e5db2..37d73e02 100644 --- a/src/support/lowlevel/firehub.Declared.php +++ b/src/support/lowlevel/firehub.Declared.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.FileSystem.php b/src/support/lowlevel/firehub.FileSystem.php index 56225553..818f116d 100644 --- a/src/support/lowlevel/firehub.FileSystem.php +++ b/src/support/lowlevel/firehub.FileSystem.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Func.php b/src/support/lowlevel/firehub.Func.php index 526cd2be..66352a84 100644 --- a/src/support/lowlevel/firehub.Func.php +++ b/src/support/lowlevel/firehub.Func.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Iterator.php b/src/support/lowlevel/firehub.Iterator.php index d81c070a..e9e24f37 100644 --- a/src/support/lowlevel/firehub.Iterator.php +++ b/src/support/lowlevel/firehub.Iterator.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Json.php b/src/support/lowlevel/firehub.Json.php index 5a1001db..5ac607df 100644 --- a/src/support/lowlevel/firehub.Json.php +++ b/src/support/lowlevel/firehub.Json.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Math.php b/src/support/lowlevel/firehub.Math.php index 56efd423..438bad3b 100644 --- a/src/support/lowlevel/firehub.Math.php +++ b/src/support/lowlevel/firehub.Math.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Random.php b/src/support/lowlevel/firehub.Random.php index 21803e86..4bf9336e 100644 --- a/src/support/lowlevel/firehub.Random.php +++ b/src/support/lowlevel/firehub.Random.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Regex.php b/src/support/lowlevel/firehub.Regex.php index e2c5ee56..0d8a6500 100644 --- a/src/support/lowlevel/firehub.Regex.php +++ b/src/support/lowlevel/firehub.Regex.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.RegexMB.php b/src/support/lowlevel/firehub.RegexMB.php index b125eff4..d2cff8f4 100644 --- a/src/support/lowlevel/firehub.RegexMB.php +++ b/src/support/lowlevel/firehub.RegexMB.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Resources.php b/src/support/lowlevel/firehub.Resources.php index 30e0684c..dc587f92 100644 --- a/src/support/lowlevel/firehub.Resources.php +++ b/src/support/lowlevel/firehub.Resources.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.SplAutoload.php b/src/support/lowlevel/firehub.SplAutoload.php index b7850bf1..84aa744c 100644 --- a/src/support/lowlevel/firehub.SplAutoload.php +++ b/src/support/lowlevel/firehub.SplAutoload.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.StrMB.php b/src/support/lowlevel/firehub.StrMB.php index 228d6249..e4c87ae4 100644 --- a/src/support/lowlevel/firehub.StrMB.php +++ b/src/support/lowlevel/firehub.StrMB.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.StrSB.php b/src/support/lowlevel/firehub.StrSB.php index a75c0ab8..8b0fef4a 100644 --- a/src/support/lowlevel/firehub.StrSB.php +++ b/src/support/lowlevel/firehub.StrSB.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.SystemRuntime.php b/src/support/lowlevel/firehub.SystemRuntime.php index 7a834881..a2205403 100644 --- a/src/support/lowlevel/firehub.SystemRuntime.php +++ b/src/support/lowlevel/firehub.SystemRuntime.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/testing/firehub.Base.php b/src/testing/firehub.Base.php index 0f119c6a..b9d45e08 100644 --- a/src/testing/firehub.Base.php +++ b/src/testing/firehub.Base.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Testing; diff --git a/src/throwable/error/lowlevel/arr/firehub.ChunkLengthTooSmallError.php b/src/throwable/error/lowlevel/arr/firehub.ChunkLengthTooSmallError.php index 74ec0802..02cd1efc 100644 --- a/src/throwable/error/lowlevel/arr/firehub.ChunkLengthTooSmallError.php +++ b/src/throwable/error/lowlevel/arr/firehub.ChunkLengthTooSmallError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/arr/firehub.FailedToSortMultiArrayError.php b/src/throwable/error/lowlevel/arr/firehub.FailedToSortMultiArrayError.php index 06fda275..67bef598 100644 --- a/src/throwable/error/lowlevel/arr/firehub.FailedToSortMultiArrayError.php +++ b/src/throwable/error/lowlevel/arr/firehub.FailedToSortMultiArrayError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/arr/firehub.KeysAndValuesDiffNumberOfElemsError.php b/src/throwable/error/lowlevel/arr/firehub.KeysAndValuesDiffNumberOfElemsError.php index 78ebf2f7..9af7c3e8 100644 --- a/src/throwable/error/lowlevel/arr/firehub.KeysAndValuesDiffNumberOfElemsError.php +++ b/src/throwable/error/lowlevel/arr/firehub.KeysAndValuesDiffNumberOfElemsError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/arr/firehub.OutOfRangeError.php b/src/throwable/error/lowlevel/arr/firehub.OutOfRangeError.php index 31eb8849..68f532fe 100644 --- a/src/throwable/error/lowlevel/arr/firehub.OutOfRangeError.php +++ b/src/throwable/error/lowlevel/arr/firehub.OutOfRangeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/arr/firehub.SizeInconsistentError.php b/src/throwable/error/lowlevel/arr/firehub.SizeInconsistentError.php index edb75968..36288a08 100644 --- a/src/throwable/error/lowlevel/arr/firehub.SizeInconsistentError.php +++ b/src/throwable/error/lowlevel/arr/firehub.SizeInconsistentError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/autoload/firehub.RegisterAutoloadError.php b/src/throwable/error/lowlevel/autoload/firehub.RegisterAutoloadError.php index b920d5d9..a9b64fd1 100644 --- a/src/throwable/error/lowlevel/autoload/firehub.RegisterAutoloadError.php +++ b/src/throwable/error/lowlevel/autoload/firehub.RegisterAutoloadError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/autoload/firehub.UnregisterAutoloaderError.php b/src/throwable/error/lowlevel/autoload/firehub.UnregisterAutoloaderError.php index c07153ca..b9eae03d 100644 --- a/src/throwable/error/lowlevel/autoload/firehub.UnregisterAutoloaderError.php +++ b/src/throwable/error/lowlevel/autoload/firehub.UnregisterAutoloaderError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/clsobj/firehub.ClassDoesntExistError.php b/src/throwable/error/lowlevel/clsobj/firehub.ClassDoesntExistError.php index 313bf69a..1038f096 100644 --- a/src/throwable/error/lowlevel/clsobj/firehub.ClassDoesntExistError.php +++ b/src/throwable/error/lowlevel/clsobj/firehub.ClassDoesntExistError.php @@ -11,8 +11,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\ClsObj; diff --git a/src/throwable/error/lowlevel/clsobj/firehub.FailedToCreateAliasError.php b/src/throwable/error/lowlevel/clsobj/firehub.FailedToCreateAliasError.php index 09718607..d2d75a56 100644 --- a/src/throwable/error/lowlevel/clsobj/firehub.FailedToCreateAliasError.php +++ b/src/throwable/error/lowlevel/clsobj/firehub.FailedToCreateAliasError.php @@ -11,8 +11,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\ClsObj; diff --git a/src/throwable/error/lowlevel/constant/firehub.AlreadyExistError.php b/src/throwable/error/lowlevel/constant/firehub.AlreadyExistError.php index d3aa17ec..282e48b6 100644 --- a/src/throwable/error/lowlevel/constant/firehub.AlreadyExistError.php +++ b/src/throwable/error/lowlevel/constant/firehub.AlreadyExistError.php @@ -11,8 +11,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Constant; diff --git a/src/throwable/error/lowlevel/constant/firehub.FailedToDefineError.php b/src/throwable/error/lowlevel/constant/firehub.FailedToDefineError.php index d4128756..7f9461d5 100644 --- a/src/throwable/error/lowlevel/constant/firehub.FailedToDefineError.php +++ b/src/throwable/error/lowlevel/constant/firehub.FailedToDefineError.php @@ -11,8 +11,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Constant; diff --git a/src/throwable/error/lowlevel/constant/firehub.NotDefinedError.php b/src/throwable/error/lowlevel/constant/firehub.NotDefinedError.php index a705ab4d..b36b3428 100644 --- a/src/throwable/error/lowlevel/constant/firehub.NotDefinedError.php +++ b/src/throwable/error/lowlevel/constant/firehub.NotDefinedError.php @@ -11,8 +11,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Constant; diff --git a/src/throwable/error/lowlevel/data/firehub.ArrayToStringConversionError.php b/src/throwable/error/lowlevel/data/firehub.ArrayToStringConversionError.php index 15fead3a..a7e826f3 100644 --- a/src/throwable/error/lowlevel/data/firehub.ArrayToStringConversionError.php +++ b/src/throwable/error/lowlevel/data/firehub.ArrayToStringConversionError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/data/firehub.CannotSerializeError.php b/src/throwable/error/lowlevel/data/firehub.CannotSerializeError.php index 0bc69ef1..de2d7c58 100644 --- a/src/throwable/error/lowlevel/data/firehub.CannotSerializeError.php +++ b/src/throwable/error/lowlevel/data/firehub.CannotSerializeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/data/firehub.FailedToSetTypeError.php b/src/throwable/error/lowlevel/data/firehub.FailedToSetTypeError.php index 841444ee..fdcdbff9 100644 --- a/src/throwable/error/lowlevel/data/firehub.FailedToSetTypeError.php +++ b/src/throwable/error/lowlevel/data/firehub.FailedToSetTypeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/data/firehub.SetAsResourceError.php b/src/throwable/error/lowlevel/data/firehub.SetAsResourceError.php index 258a8796..14a057c3 100644 --- a/src/throwable/error/lowlevel/data/firehub.SetAsResourceError.php +++ b/src/throwable/error/lowlevel/data/firehub.SetAsResourceError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/data/firehub.TypeUnknownError.php b/src/throwable/error/lowlevel/data/firehub.TypeUnknownError.php index 17851b22..1f6940e9 100644 --- a/src/throwable/error/lowlevel/data/firehub.TypeUnknownError.php +++ b/src/throwable/error/lowlevel/data/firehub.TypeUnknownError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/data/firehub.UnserializeFailedError.php b/src/throwable/error/lowlevel/data/firehub.UnserializeFailedError.php index 1d033888..73dead3b 100644 --- a/src/throwable/error/lowlevel/data/firehub.UnserializeFailedError.php +++ b/src/throwable/error/lowlevel/data/firehub.UnserializeFailedError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/datetime/firehub.FailedToFormatTimestampAsIntError.php b/src/throwable/error/lowlevel/datetime/firehub.FailedToFormatTimestampAsIntError.php index 9baf8fc1..2cef5bd4 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.FailedToFormatTimestampAsIntError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.FailedToFormatTimestampAsIntError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/datetime/firehub.FailedToGetZoneError.php b/src/throwable/error/lowlevel/datetime/firehub.FailedToGetZoneError.php index 5fb9a998..4e3e9af8 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.FailedToGetZoneError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.FailedToGetZoneError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/datetime/firehub.FailedToSetZoneError.php b/src/throwable/error/lowlevel/datetime/firehub.FailedToSetZoneError.php index e2202f65..ba506639 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.FailedToSetZoneError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.FailedToSetZoneError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/datetime/firehub.FormatTimestampError.php b/src/throwable/error/lowlevel/datetime/firehub.FormatTimestampError.php index 55504a4f..a89ea2d3 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.FormatTimestampError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.FormatTimestampError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/datetime/firehub.ParseFromFormatError.php b/src/throwable/error/lowlevel/datetime/firehub.ParseFromFormatError.php index b0055b34..3c845876 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.ParseFromFormatError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.ParseFromFormatError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/datetime/firehub.StringToTimestampError.php b/src/throwable/error/lowlevel/datetime/firehub.StringToTimestampError.php index bcf650da..b2039962 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.StringToTimestampError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.StringToTimestampError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.CannotListError.php b/src/throwable/error/lowlevel/filesystem/firehub.CannotListError.php index bf17d5f9..8f5571dd 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.CannotListError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.CannotListError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkGroupError.php b/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkGroupError.php index 14ac14f0..1366c1aa 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkGroupError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkGroupError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkOwnerError.php b/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkOwnerError.php index bec9bbc9..7633d4da 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkOwnerError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkOwnerError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.CopyPathError.php b/src/throwable/error/lowlevel/filesystem/firehub.CopyPathError.php index ad5466c2..c7931754 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.CopyPathError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.CopyPathError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.CreateFolderError.php b/src/throwable/error/lowlevel/filesystem/firehub.CreateFolderError.php index 923baf11..8ffd5211 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.CreateFolderError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.CreateFolderError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.CreateLinkError.php b/src/throwable/error/lowlevel/filesystem/firehub.CreateLinkError.php index ad67d196..1809baec 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.CreateLinkError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.CreateLinkError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.CreateSymlinkError.php b/src/throwable/error/lowlevel/filesystem/firehub.CreateSymlinkError.php index 5f113844..686c722a 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.CreateSymlinkError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.CreateSymlinkError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.DeletePathError.php b/src/throwable/error/lowlevel/filesystem/firehub.DeletePathError.php index 7fc962c7..003f9cd0 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.DeletePathError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.DeletePathError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.DiskSpaceError.php b/src/throwable/error/lowlevel/filesystem/firehub.DiskSpaceError.php index e8c5e402..2cb4c942 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.DiskSpaceError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.DiskSpaceError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetAbsolutePathError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetAbsolutePathError.php index 8e2ea211..8459883b 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetAbsolutePathError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetAbsolutePathError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetContentError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetContentError.php index c4fdb97e..7571cd1d 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetContentError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetContentError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetGroupError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetGroupError.php index 25b13f21..6d5c40fd 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetGroupError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetGroupError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetInodeError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetInodeError.php index ef2c6bce..1f7d0eb8 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetInodeError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetInodeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetLastAccessedError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetLastAccessedError.php index f39ee27f..0605e19b 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetLastAccessedError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetLastAccessedError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetLastChangedError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetLastChangedError.php index ec752f45..f108db76 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetLastChangedError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetLastChangedError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetLastModifiedError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetLastModifiedError.php index 913e41c3..33906a35 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetLastModifiedError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetLastModifiedError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetOwnerError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetOwnerError.php index 0d65e3ac..841e6fcf 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetOwnerError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetOwnerError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetPathSizeError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetPathSizeError.php index 709b822e..67b23445 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetPathSizeError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetPathSizeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetPermissionsError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetPermissionsError.php index 1029deb7..0a225db9 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetPermissionsError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetPermissionsError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetStatisticsError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetStatisticsError.php index 6b3dffd3..48673608 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetStatisticsError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetStatisticsError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetSymlinkError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetSymlinkError.php index 4bc23256..6233be00 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetSymlinkError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetSymlinkError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.MoveUploadedFileError.php b/src/throwable/error/lowlevel/filesystem/firehub.MoveUploadedFileError.php index 8d3b90f3..e99744ab 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.MoveUploadedFileError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.MoveUploadedFileError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.ParentLevelTooSmallError.php b/src/throwable/error/lowlevel/filesystem/firehub.ParentLevelTooSmallError.php index 1c9aa9fb..3b12567c 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.ParentLevelTooSmallError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.ParentLevelTooSmallError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.PathDoesntExistError.php b/src/throwable/error/lowlevel/filesystem/firehub.PathDoesntExistError.php index 4cf07dad..cfe1958e 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.PathDoesntExistError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.PathDoesntExistError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.PutContentError.php b/src/throwable/error/lowlevel/filesystem/firehub.PutContentError.php index 4a0ede57..ce005fd9 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.PutContentError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.PutContentError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.ReadFileError.php b/src/throwable/error/lowlevel/filesystem/firehub.ReadFileError.php index 1398dc1d..85cf750f 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.ReadFileError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.ReadFileError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.RenameError.php b/src/throwable/error/lowlevel/filesystem/firehub.RenameError.php index 495634be..e33b43f9 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.RenameError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.RenameError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.SearchError.php b/src/throwable/error/lowlevel/filesystem/firehub.SearchError.php index 4948be64..2d6eb41f 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.SearchError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.SearchError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.SetGroupError.php b/src/throwable/error/lowlevel/filesystem/firehub.SetGroupError.php index fa6b1b3f..4ad85a42 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.SetGroupError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.SetGroupError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.SetLastAccessAndModifyError.php b/src/throwable/error/lowlevel/filesystem/firehub.SetLastAccessAndModifyError.php index 76241acc..aba6003a 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.SetLastAccessAndModifyError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.SetLastAccessAndModifyError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.SetOwnerError.php b/src/throwable/error/lowlevel/filesystem/firehub.SetOwnerError.php index 2f06c37a..aa1d0567 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.SetOwnerError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.SetOwnerError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.SetPermissionsError.php b/src/throwable/error/lowlevel/filesystem/firehub.SetPermissionsError.php index 8aabca1a..66c0366a 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.SetPermissionsError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.SetPermissionsError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/func/firehub.RegisterTickFailedError.php b/src/throwable/error/lowlevel/func/firehub.RegisterTickFailedError.php index 3d5b597d..58feccb6 100644 --- a/src/throwable/error/lowlevel/func/firehub.RegisterTickFailedError.php +++ b/src/throwable/error/lowlevel/func/firehub.RegisterTickFailedError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Func; diff --git a/src/throwable/error/lowlevel/json/firehub.DecodeError.php b/src/throwable/error/lowlevel/json/firehub.DecodeError.php index 6f371535..6c0f9d8d 100644 --- a/src/throwable/error/lowlevel/json/firehub.DecodeError.php +++ b/src/throwable/error/lowlevel/json/firehub.DecodeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Json; diff --git a/src/throwable/error/lowlevel/json/firehub.EncodeError.php b/src/throwable/error/lowlevel/json/firehub.EncodeError.php index 79693233..fb1afb05 100644 --- a/src/throwable/error/lowlevel/json/firehub.EncodeError.php +++ b/src/throwable/error/lowlevel/json/firehub.EncodeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Json; diff --git a/src/throwable/error/lowlevel/number/firehub.ArithmeticError.php b/src/throwable/error/lowlevel/number/firehub.ArithmeticError.php index d8c87c43..6edb6adf 100644 --- a/src/throwable/error/lowlevel/number/firehub.ArithmeticError.php +++ b/src/throwable/error/lowlevel/number/firehub.ArithmeticError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Number; diff --git a/src/throwable/error/lowlevel/number/firehub.DivideByZeroError.php b/src/throwable/error/lowlevel/number/firehub.DivideByZeroError.php index 132105b2..55a199a8 100644 --- a/src/throwable/error/lowlevel/number/firehub.DivideByZeroError.php +++ b/src/throwable/error/lowlevel/number/firehub.DivideByZeroError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Number; diff --git a/src/throwable/error/lowlevel/random/firehub.MaxLessThanMinError.php b/src/throwable/error/lowlevel/random/firehub.MaxLessThanMinError.php index 9538d90f..3f3070c0 100644 --- a/src/throwable/error/lowlevel/random/firehub.MaxLessThanMinError.php +++ b/src/throwable/error/lowlevel/random/firehub.MaxLessThanMinError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Random; diff --git a/src/throwable/error/lowlevel/random/firehub.NumberGreaterThanMaxError.php b/src/throwable/error/lowlevel/random/firehub.NumberGreaterThanMaxError.php index cbe7c63a..b40c0bfb 100644 --- a/src/throwable/error/lowlevel/random/firehub.NumberGreaterThanMaxError.php +++ b/src/throwable/error/lowlevel/random/firehub.NumberGreaterThanMaxError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Random; diff --git a/src/throwable/error/lowlevel/random/firehub.NumberLessThanMinError.php b/src/throwable/error/lowlevel/random/firehub.NumberLessThanMinError.php index 27544272..5eb0e0eb 100644 --- a/src/throwable/error/lowlevel/random/firehub.NumberLessThanMinError.php +++ b/src/throwable/error/lowlevel/random/firehub.NumberLessThanMinError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Random; diff --git a/src/throwable/error/lowlevel/random/firehub.SecureNumberError.php b/src/throwable/error/lowlevel/random/firehub.SecureNumberError.php index e8602001..ad3d8b6c 100644 --- a/src/throwable/error/lowlevel/random/firehub.SecureNumberError.php +++ b/src/throwable/error/lowlevel/random/firehub.SecureNumberError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Random; diff --git a/src/throwable/error/lowlevel/regex/firehub.InvalidPatternError.php b/src/throwable/error/lowlevel/regex/firehub.InvalidPatternError.php index 7c21f50d..8fa6b340 100644 --- a/src/throwable/error/lowlevel/regex/firehub.InvalidPatternError.php +++ b/src/throwable/error/lowlevel/regex/firehub.InvalidPatternError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Regex; diff --git a/src/throwable/error/lowlevel/string/firehub.ChunkLengthLessThanOneError.php b/src/throwable/error/lowlevel/string/firehub.ChunkLengthLessThanOneError.php index db97a6ba..b0a06aa5 100644 --- a/src/throwable/error/lowlevel/string/firehub.ChunkLengthLessThanOneError.php +++ b/src/throwable/error/lowlevel/string/firehub.ChunkLengthLessThanOneError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/string/firehub.CodepointOutsideValidRangeError.php b/src/throwable/error/lowlevel/string/firehub.CodepointOutsideValidRangeError.php index 4067c5e3..99492b6a 100644 --- a/src/throwable/error/lowlevel/string/firehub.CodepointOutsideValidRangeError.php +++ b/src/throwable/error/lowlevel/string/firehub.CodepointOutsideValidRangeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/string/firehub.ComparePartError.php b/src/throwable/error/lowlevel/string/firehub.ComparePartError.php index 8fd81587..dd86a030 100644 --- a/src/throwable/error/lowlevel/string/firehub.ComparePartError.php +++ b/src/throwable/error/lowlevel/string/firehub.ComparePartError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/string/firehub.EmptyPadError.php b/src/throwable/error/lowlevel/string/firehub.EmptyPadError.php index 56ed87cf..6ecbc17f 100644 --- a/src/throwable/error/lowlevel/string/firehub.EmptyPadError.php +++ b/src/throwable/error/lowlevel/string/firehub.EmptyPadError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/string/firehub.EmptySeparatorError.php b/src/throwable/error/lowlevel/string/firehub.EmptySeparatorError.php index 5c0ee43a..a4dc17b5 100644 --- a/src/throwable/error/lowlevel/string/firehub.EmptySeparatorError.php +++ b/src/throwable/error/lowlevel/string/firehub.EmptySeparatorError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/string/firehub.InvalidEncodingError.php b/src/throwable/error/lowlevel/string/firehub.InvalidEncodingError.php index 230869f1..40ebfb70 100644 --- a/src/throwable/error/lowlevel/string/firehub.InvalidEncodingError.php +++ b/src/throwable/error/lowlevel/string/firehub.InvalidEncodingError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetProcessIDError.php b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetProcessIDError.php index 8869e55d..570b5e5f 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetProcessIDError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetProcessIDError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetServerAPIError.php b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetServerAPIError.php index e9ce721e..4d2cf44e 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetServerAPIError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetServerAPIError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToSetConfigurationOptionError.php b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToSetConfigurationOptionError.php index 5538e8b1..34041550 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToSetConfigurationOptionError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToSetConfigurationOptionError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationOptionError.php b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationOptionError.php index bf4be423..2e99a090 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationOptionError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationOptionError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationQuantityError.php b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationQuantityError.php index c7f0edd3..9c19e4a3 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationQuantityError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationQuantityError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidExtensionError.php b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidExtensionError.php index f6365494..e82840ed 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidExtensionError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidExtensionError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php b/src/throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php index eada61c8..27a91e13 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php b/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php index e15e7a94..cb864a74 100644 --- a/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php +++ b/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel; diff --git a/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php b/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php index 71b12566..ef5e9470 100644 --- a/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php +++ b/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\DataStructure; diff --git a/src/throwable/exception/domain/autoload/firehub.ImplementationException.php b/src/throwable/exception/domain/autoload/firehub.ImplementationException.php index b69c03cc..136ebed2 100644 --- a/src/throwable/exception/domain/autoload/firehub.ImplementationException.php +++ b/src/throwable/exception/domain/autoload/firehub.ImplementationException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Domain\Autoload; diff --git a/src/throwable/exception/domain/autoload/firehub.InvalidFolderException.php b/src/throwable/exception/domain/autoload/firehub.InvalidFolderException.php index 53448d5f..a7b7ddd6 100644 --- a/src/throwable/exception/domain/autoload/firehub.InvalidFolderException.php +++ b/src/throwable/exception/domain/autoload/firehub.InvalidFolderException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Domain\Autoload; diff --git a/src/throwable/exception/domain/autoload/firehub.InvalidHandleException.php b/src/throwable/exception/domain/autoload/firehub.InvalidHandleException.php index 5da7387e..782ef76b 100644 --- a/src/throwable/exception/domain/autoload/firehub.InvalidHandleException.php +++ b/src/throwable/exception/domain/autoload/firehub.InvalidHandleException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Domain\Autoload; diff --git a/src/throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php b/src/throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php index d7f67d90..ea7a0af1 100644 --- a/src/throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php +++ b/src/throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Domain\Autoload; diff --git a/src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php b/src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php index 0e6f88d4..41a681c6 100644 --- a/src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php +++ b/src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Support\Bootstrap; diff --git a/src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php b/src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php index 411e401a..1575030f 100644 --- a/src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php +++ b/src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Support\Bootstrap; diff --git a/src/throwable/firehub.Builder.php b/src/throwable/firehub.Builder.php index 476a43fb..c8af92d9 100644 --- a/src/throwable/firehub.Builder.php +++ b/src/throwable/firehub.Builder.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/firehub.Error.php b/src/throwable/firehub.Error.php index 91b65550..b39a0c92 100644 --- a/src/throwable/firehub.Error.php +++ b/src/throwable/firehub.Error.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/firehub.ErrorBuilder.php b/src/throwable/firehub.ErrorBuilder.php index 28986ba5..bdcb039d 100644 --- a/src/throwable/firehub.ErrorBuilder.php +++ b/src/throwable/firehub.ErrorBuilder.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/firehub.Exception.php b/src/throwable/firehub.Exception.php index c00c6be6..6f4c4161 100644 --- a/src/throwable/firehub.Exception.php +++ b/src/throwable/firehub.Exception.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/firehub.ExceptionBuilder.php b/src/throwable/firehub.ExceptionBuilder.php index 835f33a9..334c5bdd 100644 --- a/src/throwable/firehub.ExceptionBuilder.php +++ b/src/throwable/firehub.ExceptionBuilder.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/firehub.Throwable.php b/src/throwable/firehub.Throwable.php index 0517d89f..ab38477f 100644 --- a/src/throwable/firehub.Throwable.php +++ b/src/throwable/firehub.Throwable.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/valueobject/firehub.Code.php b/src/throwable/valueobject/firehub.Code.php index 1c8dd98d..b87e4818 100644 --- a/src/throwable/valueobject/firehub.Code.php +++ b/src/throwable/valueobject/firehub.Code.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\ValueObject; From aa17bb60f6046e5873bc1ada79ff481f803cf305 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 8 Apr 2026 09:39:55 +0200 Subject: [PATCH 42/79] Test PHAR --- dist/core.phar | Bin 690634 -> 690794 bytes src/domain/autoload/firehub.Handle.php | 2 ++ src/firehub.FireHub.php | 2 ++ src/public/boot.php | 2 ++ src/public/index.php | 2 ++ src/shared/constants/firehub.Number.php | 2 ++ src/shared/constants/firehub.Path.php | 2 ++ .../contracts/firehub.ArrayConvertable.php | 2 ++ src/shared/contracts/firehub.Arrayable.php | 2 ++ src/shared/contracts/firehub.Countable.php | 2 ++ src/shared/contracts/firehub.Iterator.php | 2 ++ .../contracts/firehub.IteratorAggregate.php | 2 ++ .../contracts/firehub.JsonSerializable.php | 2 ++ .../firehub.JsonSerializableConvertable.php | 2 ++ src/shared/contracts/firehub.Throwable.php | 2 ++ src/shared/contracts/firehub.Traversable.php | 2 ++ .../contracts/magic/firehub.Serializable.php | 2 ++ .../magic/firehub.SerializableConvertable.php | 2 ++ .../contracts/magic/firehub.Stringable.php | 2 ++ .../enums/controlflow/firehub.Signal.php | 2 ++ src/shared/enums/data/firehub.Category.php | 2 ++ .../enums/data/firehub.ResourceType.php | 2 ++ src/shared/enums/data/firehub.Type.php | 2 ++ src/shared/enums/datetime/firehub.Zone.php | 2 ++ .../datetime/format/firehub.Predefined.php | 2 ++ .../enums/filesystem/firehub.Permission.php | 2 ++ src/shared/enums/firehub.Comparison.php | 2 ++ src/shared/enums/firehub.Order.php | 2 ++ src/shared/enums/firehub.Side.php | 2 ++ src/shared/enums/json/firehub.Flag.php | 2 ++ src/shared/enums/json/flag/firehub.Decode.php | 2 ++ src/shared/enums/json/flag/firehub.Encode.php | 2 ++ src/shared/enums/json/flag/firehub.Error.php | 2 ++ .../enums/json/flag/firehub.Validate.php | 2 ++ src/shared/enums/number/firehub.LogBase.php | 2 ++ src/shared/enums/number/firehub.Round.php | 2 ++ .../string/count/firehub.CharacterMode.php | 2 ++ .../enums/string/count/firehub.WordFormat.php | 2 ++ .../enums/string/firehub.CaseFolding.php | 2 ++ src/shared/enums/string/firehub.Compare.php | 2 ++ src/shared/enums/string/firehub.Encoding.php | 2 ++ src/shared/enums/string/firehub.Sort.php | 2 ++ .../systemruntime/firehub.IniAccessLevel.php | 2 ++ .../systemruntime/firehub.PhpExtension.php | 2 ++ src/shared/firehub.ValueObject.php | 2 ++ src/support/autoload/firehub.Loader.php | 2 ++ .../autoload/loader/firehub.Classmap.php | 2 ++ .../autoload/loader/firehub.Resolver.php | 2 ++ .../firehub.RegisterAutoloaders.php | 2 ++ .../bootloader/firehub.RegisterConstants.php | 2 ++ .../bootloader/firehub.RegisterHelpers.php | 2 ++ src/support/bootstrap/firehub.Bootloader.php | 2 ++ .../bootstrap/firehub.FireHubConfigurator.php | 2 ++ .../contracts/firehub.DataStructure.php | 2 ++ .../abstract/firehub.ArrayCollection.php | 2 ++ .../capability/firehub.Transformable.php | 2 ++ .../contracts/firehub.Collection.php | 2 ++ .../datastructure/firehub.ArrayCollection.php | 2 ++ .../traits/firehub.Convertable.php | 2 ++ .../traits/firehub.Enumerable.php | 2 ++ .../datastructure/traits/firehub.Shared.php | 2 ++ src/support/firehub.Autoload.php | 2 ++ src/support/firehub.LowLevel.php | 2 ++ src/support/lowlevel/firehub.Arr.php | 2 ++ src/support/lowlevel/firehub.CharMB.php | 2 ++ src/support/lowlevel/firehub.CharSB.php | 2 ++ src/support/lowlevel/firehub.ClsObj.php | 2 ++ src/support/lowlevel/firehub.Constant.php | 2 ++ src/support/lowlevel/firehub.Data.php | 2 ++ src/support/lowlevel/firehub.DataIs.php | 2 ++ src/support/lowlevel/firehub.DateAndTime.php | 2 ++ src/support/lowlevel/firehub.Declared.php | 2 ++ src/support/lowlevel/firehub.FileSystem.php | 2 ++ src/support/lowlevel/firehub.Func.php | 2 ++ src/support/lowlevel/firehub.Iterator.php | 2 ++ src/support/lowlevel/firehub.Json.php | 2 ++ src/support/lowlevel/firehub.Math.php | 2 ++ src/support/lowlevel/firehub.Random.php | 2 ++ src/support/lowlevel/firehub.Regex.php | 2 ++ src/support/lowlevel/firehub.RegexMB.php | 2 ++ src/support/lowlevel/firehub.Resources.php | 2 ++ src/support/lowlevel/firehub.SplAutoload.php | 2 ++ src/support/lowlevel/firehub.StrMB.php | 2 ++ src/support/lowlevel/firehub.StrSB.php | 2 ++ .../lowlevel/firehub.SystemRuntime.php | 2 ++ src/testing/firehub.Base.php | 2 ++ .../arr/firehub.ChunkLengthTooSmallError.php | 2 ++ .../firehub.FailedToSortMultiArrayError.php | 2 ++ ...ub.KeysAndValuesDiffNumberOfElemsError.php | 2 ++ .../lowlevel/arr/firehub.OutOfRangeError.php | 2 ++ .../arr/firehub.SizeInconsistentError.php | 2 ++ .../firehub.RegisterAutoloadError.php | 2 ++ .../firehub.UnregisterAutoloaderError.php | 2 ++ .../clsobj/firehub.ClassDoesntExistError.php | 2 ++ .../firehub.FailedToCreateAliasError.php | 2 ++ .../constant/firehub.AlreadyExistError.php | 2 ++ .../constant/firehub.FailedToDefineError.php | 2 ++ .../constant/firehub.NotDefinedError.php | 2 ++ .../firehub.ArrayToStringConversionError.php | 2 ++ .../data/firehub.CannotSerializeError.php | 2 ++ .../data/firehub.FailedToSetTypeError.php | 2 ++ .../data/firehub.SetAsResourceError.php | 2 ++ .../data/firehub.TypeUnknownError.php | 2 ++ .../data/firehub.UnserializeFailedError.php | 2 ++ ...ehub.FailedToFormatTimestampAsIntError.php | 2 ++ .../datetime/firehub.FailedToGetZoneError.php | 2 ++ .../datetime/firehub.FailedToSetZoneError.php | 2 ++ .../datetime/firehub.FormatTimestampError.php | 2 ++ .../datetime/firehub.ParseFromFormatError.php | 2 ++ .../firehub.StringToTimestampError.php | 2 ++ .../filesystem/firehub.CannotListError.php | 2 ++ .../firehub.ChangeSymlinkGroupError.php | 2 ++ .../firehub.ChangeSymlinkOwnerError.php | 2 ++ .../filesystem/firehub.CopyPathError.php | 2 ++ .../filesystem/firehub.CreateFolderError.php | 2 ++ .../filesystem/firehub.CreateLinkError.php | 2 ++ .../filesystem/firehub.CreateSymlinkError.php | 2 ++ .../filesystem/firehub.DeletePathError.php | 2 ++ .../filesystem/firehub.DiskSpaceError.php | 2 ++ .../firehub.GetAbsolutePathError.php | 2 ++ .../filesystem/firehub.GetContentError.php | 2 ++ .../filesystem/firehub.GetGroupError.php | 2 ++ .../filesystem/firehub.GetInodeError.php | 2 ++ .../firehub.GetLastAccessedError.php | 2 ++ .../firehub.GetLastChangedError.php | 2 ++ .../firehub.GetLastModifiedError.php | 2 ++ .../filesystem/firehub.GetOwnerError.php | 2 ++ .../filesystem/firehub.GetPathSizeError.php | 2 ++ .../firehub.GetPermissionsError.php | 2 ++ .../filesystem/firehub.GetStatisticsError.php | 2 ++ .../filesystem/firehub.GetSymlinkError.php | 2 ++ .../firehub.MoveUploadedFileError.php | 2 ++ .../firehub.ParentLevelTooSmallError.php | 2 ++ .../firehub.PathDoesntExistError.php | 2 ++ .../filesystem/firehub.PutContentError.php | 2 ++ .../filesystem/firehub.ReadFileError.php | 2 ++ .../filesystem/firehub.RenameError.php | 2 ++ .../filesystem/firehub.SearchError.php | 2 ++ .../filesystem/firehub.SetGroupError.php | 2 ++ .../firehub.SetLastAccessAndModifyError.php | 2 ++ .../filesystem/firehub.SetOwnerError.php | 2 ++ .../firehub.SetPermissionsError.php | 2 ++ .../func/firehub.RegisterTickFailedError.php | 2 ++ .../lowlevel/json/firehub.DecodeError.php | 2 ++ .../lowlevel/json/firehub.EncodeError.php | 2 ++ .../number/firehub.ArithmeticError.php | 2 ++ .../number/firehub.DivideByZeroError.php | 2 ++ .../random/firehub.MaxLessThanMinError.php | 2 ++ .../firehub.NumberGreaterThanMaxError.php | 2 ++ .../random/firehub.NumberLessThanMinError.php | 2 ++ .../random/firehub.SecureNumberError.php | 2 ++ .../regex/firehub.InvalidPatternError.php | 2 ++ .../firehub.ChunkLengthLessThanOneError.php | 2 ++ ...irehub.CodepointOutsideValidRangeError.php | 2 ++ .../string/firehub.ComparePartError.php | 2 ++ .../lowlevel/string/firehub.EmptyPadError.php | 2 ++ .../string/firehub.EmptySeparatorError.php | 2 ++ .../string/firehub.InvalidEncodingError.php | 2 ++ .../firehub.FailedToGetProcessIDError.php | 2 ++ .../firehub.FailedToGetServerAPIError.php | 2 ++ ...ub.FailedToSetConfigurationOptionError.php | 2 ++ ...irehub.InvalidConfigurationOptionError.php | 2 ++ ...ehub.InvalidConfigurationQuantityError.php | 2 ++ .../firehub.InvalidExtensionError.php | 2 ++ .../firehub.SleepTimeInvalidError.php | 2 ++ .../firehub.InvalidValueObjectError.php | 2 ++ .../firehub.WrongReturnTypeException.php | 2 ++ .../firehub.ImplementationException.php | 2 ++ .../firehub.InvalidFolderException.php | 2 ++ .../firehub.InvalidHandleException.php | 2 ++ .../firehub.InvalidNamespaceException.php | 2 ++ ...irehub.FailedToLoadBootloaderException.php | 2 ++ .../firehub.NotBootloaderException.php | 2 ++ src/throwable/firehub.Builder.php | 2 ++ src/throwable/firehub.Error.php | 2 ++ src/throwable/firehub.ErrorBuilder.php | 2 ++ src/throwable/firehub.Exception.php | 2 ++ src/throwable/firehub.ExceptionBuilder.php | 2 ++ src/throwable/firehub.Throwable.php | 2 ++ src/throwable/valueobject/firehub.Code.php | 2 ++ 180 files changed, 358 insertions(+) diff --git a/dist/core.phar b/dist/core.phar index ea9a61a1db47b5f58957f46df474593a337413d1..834ab6cb03f024d6f23874d26324ee2e56e225cf 100644 GIT binary patch delta 2611 zcmb7^iC5EC7RQtKOF|L|Bmu%6!V&}|G0Ga*K@E#oi>NGu0!9h4Nfa00fL4WKRpe)V zRvZ-vD zKXu5z@mo~IIXI?b{?mN6A3-47pI|jRlHfQyoZucihQJN!tg1MphCvRCHBrCq34M@j zOaDYk@s{&Q#8Xo&79(my(L_6m593E)?klrDJLtGTCAQA^_7*nw|O!AU7ROi|x6JM$g zboP-ANTzLa$mToZr35Wvko+uOLaZnWG`LR!qrW2wA)8_;AVE5xSi7W=Fs()ji?w;= zQV6|Y>L*(kr!Fff+buG;NH|cu={n=`!JS!1z?+>6_Z({*4YBta!G|reGwzQg3D=?9A>}AO1IHLO5GJ%&j?%|H!|>KhWXn4Y9(u?dO30Le zQYAEVO9^9B`+&9I2YeGgaKQLk*--El6Tg2nQ_h_1ZNa5>6bF~tQc~Ut$lc@%9cKBi zCMO&8%_C6wLC#t~@ZIx+)It8siEpp}a!6gzgkQWejcA233|rSB2`yH_ryo9B4}xzP zK}GP@1`x!!Q4(GwRHR?chQ>1kU|{_L@U8PzfD9EB=}|#Rff^cEtA^&Ts?FDRnn|Op zI&zFjti;palno9)fb4lk%-O5vz`c*ofjiP_^rY#N8h8aSG|PyUGS_@7b75ATdGIES z%(y+Tj7Sy*77_FXmJoOc!C30ecp3!Zx?p&2?ZHsUDg>+&Ge$!4NnCK~1{lQ?rnNCg z)i|vVa-a`{2(T%f3Tg_2aq+@Ji8MMan4lsIKBc}eEwQG<;4_=61*=F)toORKbzNFE z?$RO?ZPM!S$b6KD&u^hz=nYNHv`u;>E-MgN`iO)Ie??4%zT9XiEm7za)8;F@6W4kx z;)+W16!``E{0+v<#cJGp8fkD$3zFbP5h#I6qD1&$1S({U@T&-=S^A#8^39!JpPY*n{i<$QoSv8v=fyuHTdU{MgT1@%*`*r>@&y( zXPrYSjH~S&C}dq|J7YC=p=}HV-6+T0Q%M_A;#1wo3wO04JA85<$^VIXsVDledso8m|ZSnZTORh9I{^-qrKkHaFNl*Rhq&npNfXh18 zR!M4{aU?3YV=Vt}aSaNJxV!jKZ`F(>Yx}{W?RQtOJr_2m{8?}4m>%JmN=KsUTkiXZ z8%i?jkN>weHGZf2&??b|#k-T=?5zIw;m*wgJuF#r@Pf3dFMN8-)1>DUDmuOkmhy^i za*`5Nk1FO*+5IdIeRVB0wy*HOXS#l;9U;HX`o~ONr|`n2YE84gxaODKRQc1^ZdR4C zcV$oOV{Xg&M|(cL{MTdc?uWMBunk$)K0IFXX}wokTG_L&u6DK0srv&~QR90%e{+?$if^Ajt7I|X NyOhQJO2wtb{SRxhY&!q| delta 2509 zcmX|Bdr*^C7Eit}gd_w=0wDnt9)Umzkc3xA{blmQDPiFRyo8O#!e&?LuIp==) zu~B`WQrCY+43G^oe)KQJVR~Z-WU4V_Gs7{oFheoSGNUlai8%fMIhB8##bCUsIrNfh zu&|?Eks>6EBCOdOlEI)!ZA2vIE)wy;Ev32t%(yp5F)iejfaFjeq=2U>dAG#H66j@Q zGNw0SZrl+VnO8$Eryf1_?DXEIZ_oIJ8GK4$NuLWsOiUz##RXz zTI=KDDyMlH@!cjKFen}{rg)&=$tnW-(yiXX&|w9tR;@rs5Z@nP?&Svx*5~07Oyy&& zj~Ab$KIaEw-&6hu3|`h71&gQ66pRXef|@#J4f=nk+(xi3|?fFwOJy@FW>)QoOXF4zb6Ej?UM*Aj<$=0*jbuzrd9MeYQkQLDxMM? zwxv4|hU{Qb|Fw$&p34TBH-btjYq1j1viaL3Rwk;A6P<*-I)=X6Xt?3|Bb!8sF>_t0r>rS`s{mYpN0 zS{HllYjw%Q@P`?)TtUsC>kfP=bpxeG%<#kws)r~*ccTI*%L)ijatEu;Jq-#`bfMjV!>z7#Z*4V`1T`HRExsU#3$|8P2ivgJ)nSt5};TKQXVN`Xc|wj z>O8^s!V}ty^~!>Bm+1JqsdQ($FI-N7c=n`-ZGx<)RiG?Gm5n>Pt@;xNS8vEx;SIi7 zZ%7)XPQ|`jbt)vSp~HtpmI=yLX`noO#Ml?=lLx-P)4l`2qaR@(>Z~Dz?0P6h{q6&5 z(|ut^1HSNKbNm2y_(A?&Kd8plK<(Wc&^4+tZ|EwWCa&!4c{;HYJ*p#Y(QYqN%sy+* zUZ#arPibK-MqM7(bWsP3|4o;Itt5Z*BK%=MtN?h1g=Y9RpafGk1QufG4=lpq5d;&d zF~d(m5FQr{FRVQn3i0(|6`5f|pNr#yL*9c?yriYgNd4w1O^}58M9-zNL!1!DL^z!` zurQBp2*D6(2*z;00AEnQ!HBJ81AJZnMz9Kv*sAO{R(BhjsM|=)QS}QkXmTx)fC7Fd zrHD&0&r!B%LTWgBGb-6m+Ok7=Jgr)dj)W0gNS>=2O@t8zC^VeVpn`BB16?0yO3_?6 z;cHDhwY<{25B8T9xn>~YdcqEwc90GO>mrB;h1csBBuw;liHt&XX(SI-Y$w^MFN`fi zCCSA9i_CWt!BE7xizq@LcM&>tr;8{-+HTrx=_U>%#~$JkqI!s(Sgt$jsp2^zk1j%h zerO{^DCjEJ5iM2oLQzjI;excz94j>2OM7!}5^iQS9(}~?Q%LuS;Gy$jEFRi8V(E5$ z&ZuXipRdwI62BpZNDxd|H8m5C)xJ?AeOUCdpbwiqmh|D!hdbaK#S4fpSG^Z@W3=Kz z*igi4?E(AY>7FloLq^wxXl`zHi%aYFJNe>STHCdpzQDp}AHUw!6QQPSKFvDld+_U``K^tYzR5EE>q4vN<9WvM)zPmm)OS2M zGlp)dioFWu^MmO2uDMy&+~lEhZG%hcQRlan%zIZKoO}K49jDr{oiWLaSD1^9H&PyM zTyB*wFBw&D_)C{(FGQAI%zZprI3S~bnj9(Z`+jS(VcUw8w$zTVEY)=em0hXtj-HTC zZx=mm4$?jNOh?|B{q)|y_eDQ^_wK3O63NUSSIT1lbjL@vRdah3!uW=qy20{X!F|1T z?`HomS6KaZ|Hx`Ft>#8=IiFo+TF`AWbr$%aXx=YBT$w(8tZC%;>R+ZV6u(+6D+S3*RxbylWY5Pt z+PmI_?=2onaV>Jm=LWef6l=n?<;NsHCZ_zkcAet;;|9&mz+B^*u-!xMOR7v8FPEzP z=VPybXjfi-a@?ouZuhfIAs Date: Wed, 8 Apr 2026 09:49:29 +0200 Subject: [PATCH 43/79] Test PHAR --- dist/core.min.phar | Bin 211694 -> 211694 bytes dist/core.phar | Bin 690794 -> 690581 bytes src/domain/autoload/firehub.Handle.php | 2 -- src/firehub.FireHub.php | 2 -- src/public/boot.php | 2 -- src/public/index.php | 2 -- src/shared/constants/firehub.Number.php | 2 -- src/shared/constants/firehub.Path.php | 2 -- .../contracts/firehub.ArrayConvertable.php | 2 -- src/shared/contracts/firehub.Arrayable.php | 2 -- src/shared/contracts/firehub.Countable.php | 2 -- src/shared/contracts/firehub.Iterator.php | 2 -- .../contracts/firehub.IteratorAggregate.php | 2 -- .../contracts/firehub.JsonSerializable.php | 2 -- .../firehub.JsonSerializableConvertable.php | 2 -- src/shared/contracts/firehub.Throwable.php | 2 -- src/shared/contracts/firehub.Traversable.php | 2 -- .../contracts/magic/firehub.Serializable.php | 2 -- .../magic/firehub.SerializableConvertable.php | 2 -- .../contracts/magic/firehub.Stringable.php | 2 -- .../enums/controlflow/firehub.Signal.php | 2 -- src/shared/enums/data/firehub.Category.php | 2 -- .../enums/data/firehub.ResourceType.php | 2 -- src/shared/enums/data/firehub.Type.php | 2 -- src/shared/enums/datetime/firehub.Zone.php | 2 -- .../datetime/format/firehub.Predefined.php | 2 -- .../enums/filesystem/firehub.Permission.php | 2 -- src/shared/enums/firehub.Comparison.php | 2 -- src/shared/enums/firehub.Order.php | 2 -- src/shared/enums/firehub.Side.php | 2 -- src/shared/enums/json/firehub.Flag.php | 2 -- src/shared/enums/json/flag/firehub.Decode.php | 2 -- src/shared/enums/json/flag/firehub.Encode.php | 2 -- src/shared/enums/json/flag/firehub.Error.php | 2 -- .../enums/json/flag/firehub.Validate.php | 2 -- src/shared/enums/number/firehub.LogBase.php | 2 -- src/shared/enums/number/firehub.Round.php | 2 -- .../string/count/firehub.CharacterMode.php | 2 -- .../enums/string/count/firehub.WordFormat.php | 2 -- .../enums/string/firehub.CaseFolding.php | 2 -- src/shared/enums/string/firehub.Compare.php | 2 -- src/shared/enums/string/firehub.Encoding.php | 2 -- src/shared/enums/string/firehub.Sort.php | 2 -- .../systemruntime/firehub.IniAccessLevel.php | 2 -- .../systemruntime/firehub.PhpExtension.php | 2 -- src/shared/firehub.ValueObject.php | 2 -- src/support/autoload/classmap.php | 2 -- src/support/autoload/firehub.Loader.php | 2 -- .../autoload/loader/firehub.Classmap.php | 2 -- .../loader/firehub.CompiledClassmap.php | 2 -- .../autoload/loader/firehub.Resolver.php | 2 -- .../firehub.RegisterAutoloaders.php | 2 -- .../bootloader/firehub.RegisterConstants.php | 2 -- .../bootloader/firehub.RegisterHelpers.php | 2 -- src/support/bootstrap/firehub.Bootloader.php | 2 -- .../bootstrap/firehub.FireHubConfigurator.php | 2 -- .../contracts/firehub.DataStructure.php | 2 -- .../abstract/firehub.ArrayCollection.php | 2 -- .../capability/firehub.Transformable.php | 2 -- .../contracts/firehub.Collection.php | 2 -- .../datastructure/firehub.ArrayCollection.php | 2 -- .../traits/firehub.Convertable.php | 2 -- .../traits/firehub.Enumerable.php | 2 -- .../datastructure/traits/firehub.Shared.php | 2 -- src/support/firehub.Autoload.php | 2 -- src/support/firehub.LowLevel.php | 2 -- src/support/lowlevel/firehub.Arr.php | 2 -- src/support/lowlevel/firehub.CharMB.php | 2 -- src/support/lowlevel/firehub.CharSB.php | 2 -- src/support/lowlevel/firehub.ClsObj.php | 2 -- src/support/lowlevel/firehub.Constant.php | 2 -- src/support/lowlevel/firehub.Data.php | 2 -- src/support/lowlevel/firehub.DataIs.php | 2 -- src/support/lowlevel/firehub.DateAndTime.php | 2 -- src/support/lowlevel/firehub.Declared.php | 2 -- src/support/lowlevel/firehub.FileSystem.php | 2 -- src/support/lowlevel/firehub.Func.php | 2 -- src/support/lowlevel/firehub.Iterator.php | 2 -- src/support/lowlevel/firehub.Json.php | 2 -- src/support/lowlevel/firehub.Math.php | 2 -- src/support/lowlevel/firehub.Random.php | 2 -- src/support/lowlevel/firehub.Regex.php | 2 -- src/support/lowlevel/firehub.RegexMB.php | 2 -- src/support/lowlevel/firehub.Resources.php | 2 -- src/support/lowlevel/firehub.SplAutoload.php | 2 -- src/support/lowlevel/firehub.StrMB.php | 2 -- src/support/lowlevel/firehub.StrSB.php | 2 -- .../lowlevel/firehub.SystemRuntime.php | 2 -- src/testing/firehub.Base.php | 2 -- .../arr/firehub.ChunkLengthTooSmallError.php | 2 -- .../firehub.FailedToSortMultiArrayError.php | 2 -- ...ub.KeysAndValuesDiffNumberOfElemsError.php | 2 -- .../lowlevel/arr/firehub.OutOfRangeError.php | 2 -- .../arr/firehub.SizeInconsistentError.php | 2 -- .../firehub.RegisterAutoloadError.php | 2 -- .../firehub.UnregisterAutoloaderError.php | 2 -- .../clsobj/firehub.ClassDoesntExistError.php | 2 -- .../firehub.FailedToCreateAliasError.php | 2 -- .../constant/firehub.AlreadyExistError.php | 2 -- .../constant/firehub.FailedToDefineError.php | 2 -- .../constant/firehub.NotDefinedError.php | 2 -- .../firehub.ArrayToStringConversionError.php | 2 -- .../data/firehub.CannotSerializeError.php | 2 -- .../data/firehub.FailedToSetTypeError.php | 2 -- .../data/firehub.SetAsResourceError.php | 2 -- .../data/firehub.TypeUnknownError.php | 2 -- .../data/firehub.UnserializeFailedError.php | 2 -- ...ehub.FailedToFormatTimestampAsIntError.php | 2 -- .../datetime/firehub.FailedToGetZoneError.php | 2 -- .../datetime/firehub.FailedToSetZoneError.php | 2 -- .../datetime/firehub.FormatTimestampError.php | 2 -- .../datetime/firehub.ParseFromFormatError.php | 2 -- .../firehub.StringToTimestampError.php | 2 -- .../filesystem/firehub.CannotListError.php | 2 -- .../firehub.ChangeSymlinkGroupError.php | 2 -- .../firehub.ChangeSymlinkOwnerError.php | 2 -- .../filesystem/firehub.CopyPathError.php | 2 -- .../filesystem/firehub.CreateFolderError.php | 2 -- .../filesystem/firehub.CreateLinkError.php | 2 -- .../filesystem/firehub.CreateSymlinkError.php | 2 -- .../filesystem/firehub.DeletePathError.php | 2 -- .../filesystem/firehub.DiskSpaceError.php | 2 -- .../firehub.GetAbsolutePathError.php | 2 -- .../filesystem/firehub.GetContentError.php | 2 -- .../filesystem/firehub.GetGroupError.php | 2 -- .../filesystem/firehub.GetInodeError.php | 2 -- .../firehub.GetLastAccessedError.php | 2 -- .../firehub.GetLastChangedError.php | 2 -- .../firehub.GetLastModifiedError.php | 2 -- .../filesystem/firehub.GetOwnerError.php | 2 -- .../filesystem/firehub.GetPathSizeError.php | 2 -- .../firehub.GetPermissionsError.php | 2 -- .../filesystem/firehub.GetStatisticsError.php | 2 -- .../filesystem/firehub.GetSymlinkError.php | 2 -- .../firehub.MoveUploadedFileError.php | 2 -- .../firehub.ParentLevelTooSmallError.php | 2 -- .../firehub.PathDoesntExistError.php | 2 -- .../filesystem/firehub.PutContentError.php | 2 -- .../filesystem/firehub.ReadFileError.php | 2 -- .../filesystem/firehub.RenameError.php | 2 -- .../filesystem/firehub.SearchError.php | 2 -- .../filesystem/firehub.SetGroupError.php | 2 -- .../firehub.SetLastAccessAndModifyError.php | 2 -- .../filesystem/firehub.SetOwnerError.php | 2 -- .../firehub.SetPermissionsError.php | 2 -- .../func/firehub.RegisterTickFailedError.php | 2 -- .../lowlevel/json/firehub.DecodeError.php | 2 -- .../lowlevel/json/firehub.EncodeError.php | 2 -- .../number/firehub.ArithmeticError.php | 2 -- .../number/firehub.DivideByZeroError.php | 2 -- .../random/firehub.MaxLessThanMinError.php | 2 -- .../firehub.NumberGreaterThanMaxError.php | 2 -- .../random/firehub.NumberLessThanMinError.php | 2 -- .../random/firehub.SecureNumberError.php | 2 -- .../regex/firehub.InvalidPatternError.php | 2 -- .../firehub.ChunkLengthLessThanOneError.php | 2 -- ...irehub.CodepointOutsideValidRangeError.php | 2 -- .../string/firehub.ComparePartError.php | 2 -- .../lowlevel/string/firehub.EmptyPadError.php | 2 -- .../string/firehub.EmptySeparatorError.php | 2 -- .../string/firehub.InvalidEncodingError.php | 2 -- .../firehub.FailedToGetProcessIDError.php | 2 -- .../firehub.FailedToGetServerAPIError.php | 2 -- ...ub.FailedToSetConfigurationOptionError.php | 2 -- ...irehub.InvalidConfigurationOptionError.php | 2 -- ...ehub.InvalidConfigurationQuantityError.php | 2 -- .../firehub.InvalidExtensionError.php | 2 -- .../firehub.SleepTimeInvalidError.php | 2 -- .../firehub.InvalidValueObjectError.php | 2 -- .../firehub.WrongReturnTypeException.php | 2 -- .../firehub.ImplementationException.php | 2 -- .../firehub.InvalidFolderException.php | 2 -- .../firehub.InvalidHandleException.php | 2 -- .../firehub.InvalidNamespaceException.php | 2 -- ...irehub.FailedToLoadBootloaderException.php | 2 -- .../firehub.NotBootloaderException.php | 2 -- src/throwable/firehub.Builder.php | 2 -- src/throwable/firehub.Error.php | 2 -- src/throwable/firehub.ErrorBuilder.php | 2 -- src/throwable/firehub.Exception.php | 2 -- src/throwable/firehub.ExceptionBuilder.php | 2 -- src/throwable/firehub.Throwable.php | 2 -- src/throwable/valueobject/firehub.Code.php | 2 -- 183 files changed, 362 deletions(-) diff --git a/dist/core.min.phar b/dist/core.min.phar index d65b1eff3e724f86a3a656088dcade3dee03d648..23858c6f9bf8709daf9c25491725784caf594221 100644 GIT binary patch delta 2189 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 G{r>}8S{Vue diff --git a/dist/core.phar b/dist/core.phar index 834ab6cb03f024d6f23874d26324ee2e56e225cf..fbe555acd8448783ffad718f475f6a0969e8506e 100644 GIT binary patch delta 3169 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 delta 3148 zcmb7Hc~nzZ8Yl0O@CXSc0TR{_kgy36lvR`n5g{OgEQ%-~OB7@Yf-qI!xKxF@f>*h= zE)_@XUU1Y>6vn0Q!%^CCsEQ-FRK&4j$7!qWh;#3k@toj; z6;0sz5nq(cn@nLhFOot(ZwduhCQd}vx(Icsap_ak%(q3~vobvC1S1w`SP(eKXeoD? zi3e^a;oh5jtsC+9u1LaiI5(P+2x&k!3*gtWsg&Q#LI|0847FyN>nXIFr&IXZJdVN? zek_FsJ}|HGr&7yCFo{Bv05&%ZlBjiG5KqC!0*Y8@5l*dEi!cgzEx^Hn(@`s%(?Obd zNHW~K;kRf|=!jNuwm9bk!=XXWoRXe!5IDdxnpzc>P~dS(8fuF$f$mKg0s{$w(IdPM)`h=zN<*dX{PfnSE>nlo6X8x|u9Vq0lM;$_vR1 zYDGyQ!HrUA{cUL|-IT}x;$;)5wOTeAy46IkQ+4n8P_#+riwCn9fn<%?lp)2=vL#o^ ziI+`jRdW6!I_j~BFzRSqEx7j+(zaIFpHQ!z8oSJ6IDy3&Ae^;@fsNY60MBh2;a$X) zNNlgh?SqU+aMBuhAKF2mFWbTGWbI9|=gHxx1=_11JMR&ZjdTY3N_*h_(H_*_+C%Rm zIW&!@fHSQL>J@OszEX^*#s93BOCj9>T6of70kvElq30Ejnbf-Om`%ag zDUZSiCvX^c0tdbG94P82V`gT|*tZDr9MmY#MT&n{!YBlPAiKnc=Q5jmX1UC#(B%TE za#w%~R~YtHSD2(ynMEnfl*JUjQ_chNHX?H-qkRaCD5LPsQAQ#-ZW3;Fn@4%?OpvXD zl)6=O=%#}^q+4r(`|glJm^$Lmrt2BaICq9qxwCJeV$%gRo%@WoPKitJCaZ?2=L@9B$IP@HAk6)Is z609vChpI%OEtXWVwydgFjJjeb;U+B`XgxJ=NuIvSU!{XD8GQBtE60n9SSysG6Y<4D zm7f^p>gMyr=&UXV$INC!@w+nC0v+G#gtLo<94{XSl(Wx~HdaA6FJdR*@-#-m_`@?A zh_!*;83Lk2J}o+SIvy-!o!@6^ht5s2!EbYg98Sz6=?=CtmgpbTyzr`I)&T{^#k!gt zReq{z#g&Hm>U>p!v3x=C!s^PrCB{m0ewPYsAF(Rbo1TQPSF)#2$_5cWr(?CqR_|_M za`wgUxk7uCq?h6RT%kLv)!SIUmldOC{Zzzj(`-plpw1RIoNHh?G%10@Wv5tMl#w6> zAHj5EUZDzV4Wb2j;&=BM4i7#Mh|r4!CEk(5YG4aRCyvE}qr~cN>-TB81>WYSQ- z8P4w;`Z&S&+qb+&f}NKQ_{&-S2v`YOJ>$& znGM9q{pDA_zFGfk+M5H-AtYsGBy3#Ij`fD>9P~?HHROB z$OL6JISKlJM>P|l*}ag2{dy%e`sAX`U&eJft_=Oj`^IR)QQ?^-^?^GKWy^oaOI1GK z*Jf5%b$oXFz9;Kz5Q z{BO_ab58j`wn&R!-5NbIrMSuSoj5^OxcYg}fKOxe)gIBv)7kEsH(g&1O+agfWe2{B zD=FRRm)r2gWof~oj|Q{9ocWp53=0j*l~sQZFV1f%XNT7qUu6n2658e>U4JJY>NdE3 z9Pp;9)_MD!$K#pn7uBPZ$|s{Qe?*aXKP*19?!xk?Ifsj)^i$qsZjI*6kTIlJ$6&Z|CeIkktseMa5v_KgiIa=rH6>l8&jUVro_7v(<5 Ut^G&TX5_nGM*ca7i%E+47t_WlN&o-= diff --git a/src/domain/autoload/firehub.Handle.php b/src/domain/autoload/firehub.Handle.php index c8fba260..29004310 100644 --- a/src/domain/autoload/firehub.Handle.php +++ b/src/domain/autoload/firehub.Handle.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Domain - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Domain\Autoload; diff --git a/src/firehub.FireHub.php b/src/firehub.FireHub.php index 473d49e2..b3ddd6c4 100644 --- a/src/firehub.FireHub.php +++ b/src/firehub.FireHub.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core; diff --git a/src/public/boot.php b/src/public/boot.php index b4ef3b16..58f7a5a8 100644 --- a/src/public/boot.php +++ b/src/public/boot.php @@ -12,8 +12,6 @@ * * @php-version 7.0 * @package Core\Public - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Public; diff --git a/src/public/index.php b/src/public/index.php index 5bf63e94..24c76c4f 100644 --- a/src/public/index.php +++ b/src/public/index.php @@ -12,8 +12,6 @@ * * @php-version 7.0 * @package Core\Public - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Public; diff --git a/src/shared/constants/firehub.Number.php b/src/shared/constants/firehub.Number.php index f5ee6220..f5f02cdc 100644 --- a/src/shared/constants/firehub.Number.php +++ b/src/shared/constants/firehub.Number.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Constants\Number; diff --git a/src/shared/constants/firehub.Path.php b/src/shared/constants/firehub.Path.php index 4c4b8a50..2402206c 100644 --- a/src/shared/constants/firehub.Path.php +++ b/src/shared/constants/firehub.Path.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Constants\Path; diff --git a/src/shared/contracts/firehub.ArrayConvertable.php b/src/shared/contracts/firehub.ArrayConvertable.php index 0d45580e..32965e8f 100644 --- a/src/shared/contracts/firehub.ArrayConvertable.php +++ b/src/shared/contracts/firehub.ArrayConvertable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.Arrayable.php b/src/shared/contracts/firehub.Arrayable.php index b23e647f..1896b453 100644 --- a/src/shared/contracts/firehub.Arrayable.php +++ b/src/shared/contracts/firehub.Arrayable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.Countable.php b/src/shared/contracts/firehub.Countable.php index 1cd92118..9c4654c7 100644 --- a/src/shared/contracts/firehub.Countable.php +++ b/src/shared/contracts/firehub.Countable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.Iterator.php b/src/shared/contracts/firehub.Iterator.php index 60c94a9e..9a3ee4fd 100644 --- a/src/shared/contracts/firehub.Iterator.php +++ b/src/shared/contracts/firehub.Iterator.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.IteratorAggregate.php b/src/shared/contracts/firehub.IteratorAggregate.php index 36dbbe73..7c4cc33f 100644 --- a/src/shared/contracts/firehub.IteratorAggregate.php +++ b/src/shared/contracts/firehub.IteratorAggregate.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.JsonSerializable.php b/src/shared/contracts/firehub.JsonSerializable.php index f33032ac..facd71e7 100644 --- a/src/shared/contracts/firehub.JsonSerializable.php +++ b/src/shared/contracts/firehub.JsonSerializable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.JsonSerializableConvertable.php b/src/shared/contracts/firehub.JsonSerializableConvertable.php index e25d945d..558d9a88 100644 --- a/src/shared/contracts/firehub.JsonSerializableConvertable.php +++ b/src/shared/contracts/firehub.JsonSerializableConvertable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.Throwable.php b/src/shared/contracts/firehub.Throwable.php index 7b3c6f85..431eb89c 100644 --- a/src/shared/contracts/firehub.Throwable.php +++ b/src/shared/contracts/firehub.Throwable.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/firehub.Traversable.php b/src/shared/contracts/firehub.Traversable.php index 45d17202..e2c417dd 100644 --- a/src/shared/contracts/firehub.Traversable.php +++ b/src/shared/contracts/firehub.Traversable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts; diff --git a/src/shared/contracts/magic/firehub.Serializable.php b/src/shared/contracts/magic/firehub.Serializable.php index 191c59b9..5746ed24 100644 --- a/src/shared/contracts/magic/firehub.Serializable.php +++ b/src/shared/contracts/magic/firehub.Serializable.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts\Magic; diff --git a/src/shared/contracts/magic/firehub.SerializableConvertable.php b/src/shared/contracts/magic/firehub.SerializableConvertable.php index c0107ce4..47399378 100644 --- a/src/shared/contracts/magic/firehub.SerializableConvertable.php +++ b/src/shared/contracts/magic/firehub.SerializableConvertable.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts\Magic; diff --git a/src/shared/contracts/magic/firehub.Stringable.php b/src/shared/contracts/magic/firehub.Stringable.php index 11f0b57a..69f166fc 100644 --- a/src/shared/contracts/magic/firehub.Stringable.php +++ b/src/shared/contracts/magic/firehub.Stringable.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Contracts\Magic; diff --git a/src/shared/enums/controlflow/firehub.Signal.php b/src/shared/enums/controlflow/firehub.Signal.php index 38abceae..70ec6b18 100644 --- a/src/shared/enums/controlflow/firehub.Signal.php +++ b/src/shared/enums/controlflow/firehub.Signal.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\ControlFlow; diff --git a/src/shared/enums/data/firehub.Category.php b/src/shared/enums/data/firehub.Category.php index 54e86e79..bdadab01 100644 --- a/src/shared/enums/data/firehub.Category.php +++ b/src/shared/enums/data/firehub.Category.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Data; diff --git a/src/shared/enums/data/firehub.ResourceType.php b/src/shared/enums/data/firehub.ResourceType.php index cb7492bf..40e2d225 100644 --- a/src/shared/enums/data/firehub.ResourceType.php +++ b/src/shared/enums/data/firehub.ResourceType.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Data; diff --git a/src/shared/enums/data/firehub.Type.php b/src/shared/enums/data/firehub.Type.php index 8d5fbd35..ea83deb4 100644 --- a/src/shared/enums/data/firehub.Type.php +++ b/src/shared/enums/data/firehub.Type.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Data; diff --git a/src/shared/enums/datetime/firehub.Zone.php b/src/shared/enums/datetime/firehub.Zone.php index 5f72399a..3a4efc82 100644 --- a/src/shared/enums/datetime/firehub.Zone.php +++ b/src/shared/enums/datetime/firehub.Zone.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\DateTime; diff --git a/src/shared/enums/datetime/format/firehub.Predefined.php b/src/shared/enums/datetime/format/firehub.Predefined.php index c5967f84..9cf8ada4 100644 --- a/src/shared/enums/datetime/format/firehub.Predefined.php +++ b/src/shared/enums/datetime/format/firehub.Predefined.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\DateTime\Format; diff --git a/src/shared/enums/filesystem/firehub.Permission.php b/src/shared/enums/filesystem/firehub.Permission.php index 2dd3c123..ae7280ee 100644 --- a/src/shared/enums/filesystem/firehub.Permission.php +++ b/src/shared/enums/filesystem/firehub.Permission.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\FileSystem; diff --git a/src/shared/enums/firehub.Comparison.php b/src/shared/enums/firehub.Comparison.php index 9b9829f4..bf8f053a 100644 --- a/src/shared/enums/firehub.Comparison.php +++ b/src/shared/enums/firehub.Comparison.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums; diff --git a/src/shared/enums/firehub.Order.php b/src/shared/enums/firehub.Order.php index f86a5210..eb578043 100644 --- a/src/shared/enums/firehub.Order.php +++ b/src/shared/enums/firehub.Order.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums; diff --git a/src/shared/enums/firehub.Side.php b/src/shared/enums/firehub.Side.php index 90899f8a..69f21baf 100644 --- a/src/shared/enums/firehub.Side.php +++ b/src/shared/enums/firehub.Side.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums; diff --git a/src/shared/enums/json/firehub.Flag.php b/src/shared/enums/json/firehub.Flag.php index ce08ec5f..f71f3d1a 100644 --- a/src/shared/enums/json/firehub.Flag.php +++ b/src/shared/enums/json/firehub.Flag.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Json; diff --git a/src/shared/enums/json/flag/firehub.Decode.php b/src/shared/enums/json/flag/firehub.Decode.php index 368d1851..d541208b 100644 --- a/src/shared/enums/json/flag/firehub.Decode.php +++ b/src/shared/enums/json/flag/firehub.Decode.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Json\Flag; diff --git a/src/shared/enums/json/flag/firehub.Encode.php b/src/shared/enums/json/flag/firehub.Encode.php index 7c4906ee..8da9af21 100644 --- a/src/shared/enums/json/flag/firehub.Encode.php +++ b/src/shared/enums/json/flag/firehub.Encode.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Json\Flag; diff --git a/src/shared/enums/json/flag/firehub.Error.php b/src/shared/enums/json/flag/firehub.Error.php index 388dbbc7..5410fa0f 100644 --- a/src/shared/enums/json/flag/firehub.Error.php +++ b/src/shared/enums/json/flag/firehub.Error.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Json\Flag; diff --git a/src/shared/enums/json/flag/firehub.Validate.php b/src/shared/enums/json/flag/firehub.Validate.php index a9cf5e1e..56a674b2 100644 --- a/src/shared/enums/json/flag/firehub.Validate.php +++ b/src/shared/enums/json/flag/firehub.Validate.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Json\Flag; diff --git a/src/shared/enums/number/firehub.LogBase.php b/src/shared/enums/number/firehub.LogBase.php index 2f019fa4..6e39b1f6 100644 --- a/src/shared/enums/number/firehub.LogBase.php +++ b/src/shared/enums/number/firehub.LogBase.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Number; diff --git a/src/shared/enums/number/firehub.Round.php b/src/shared/enums/number/firehub.Round.php index 3e2cebe8..db641516 100644 --- a/src/shared/enums/number/firehub.Round.php +++ b/src/shared/enums/number/firehub.Round.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\Number; diff --git a/src/shared/enums/string/count/firehub.CharacterMode.php b/src/shared/enums/string/count/firehub.CharacterMode.php index 8acfff47..16ede02f 100644 --- a/src/shared/enums/string/count/firehub.CharacterMode.php +++ b/src/shared/enums/string/count/firehub.CharacterMode.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String\Count; diff --git a/src/shared/enums/string/count/firehub.WordFormat.php b/src/shared/enums/string/count/firehub.WordFormat.php index 237e96d9..1dfc7bd2 100644 --- a/src/shared/enums/string/count/firehub.WordFormat.php +++ b/src/shared/enums/string/count/firehub.WordFormat.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String\Count; diff --git a/src/shared/enums/string/firehub.CaseFolding.php b/src/shared/enums/string/firehub.CaseFolding.php index a82f6808..6d74dc51 100644 --- a/src/shared/enums/string/firehub.CaseFolding.php +++ b/src/shared/enums/string/firehub.CaseFolding.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String; diff --git a/src/shared/enums/string/firehub.Compare.php b/src/shared/enums/string/firehub.Compare.php index b8a82fce..a20703ab 100644 --- a/src/shared/enums/string/firehub.Compare.php +++ b/src/shared/enums/string/firehub.Compare.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String; diff --git a/src/shared/enums/string/firehub.Encoding.php b/src/shared/enums/string/firehub.Encoding.php index 8528ab42..527dab59 100644 --- a/src/shared/enums/string/firehub.Encoding.php +++ b/src/shared/enums/string/firehub.Encoding.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String; diff --git a/src/shared/enums/string/firehub.Sort.php b/src/shared/enums/string/firehub.Sort.php index 266b675e..1d9ad9b1 100644 --- a/src/shared/enums/string/firehub.Sort.php +++ b/src/shared/enums/string/firehub.Sort.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\String; diff --git a/src/shared/enums/systemruntime/firehub.IniAccessLevel.php b/src/shared/enums/systemruntime/firehub.IniAccessLevel.php index 2a297513..9fa76920 100644 --- a/src/shared/enums/systemruntime/firehub.IniAccessLevel.php +++ b/src/shared/enums/systemruntime/firehub.IniAccessLevel.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\SystemRuntime; diff --git a/src/shared/enums/systemruntime/firehub.PhpExtension.php b/src/shared/enums/systemruntime/firehub.PhpExtension.php index 0edff313..e9403946 100644 --- a/src/shared/enums/systemruntime/firehub.PhpExtension.php +++ b/src/shared/enums/systemruntime/firehub.PhpExtension.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared\Enums\SystemRuntime; diff --git a/src/shared/firehub.ValueObject.php b/src/shared/firehub.ValueObject.php index fdf9918a..17a2c802 100644 --- a/src/shared/firehub.ValueObject.php +++ b/src/shared/firehub.ValueObject.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Shared - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Shared; diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index 9e57b7e7..bc6d06af 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -12,8 +12,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Autoload; diff --git a/src/support/autoload/firehub.Loader.php b/src/support/autoload/firehub.Loader.php index d280a8c1..c7acaef1 100644 --- a/src/support/autoload/firehub.Loader.php +++ b/src/support/autoload/firehub.Loader.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Autoload; diff --git a/src/support/autoload/loader/firehub.Classmap.php b/src/support/autoload/loader/firehub.Classmap.php index e89dfe0b..8b282ee2 100644 --- a/src/support/autoload/loader/firehub.Classmap.php +++ b/src/support/autoload/loader/firehub.Classmap.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Autoload\Loader; diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 0418621c..67533ed8 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Autoload\Loader; diff --git a/src/support/autoload/loader/firehub.Resolver.php b/src/support/autoload/loader/firehub.Resolver.php index f6a9a41d..0144108a 100644 --- a/src/support/autoload/loader/firehub.Resolver.php +++ b/src/support/autoload/loader/firehub.Resolver.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Autoload\Loader; diff --git a/src/support/bootstrap/bootloader/firehub.RegisterAutoloaders.php b/src/support/bootstrap/bootloader/firehub.RegisterAutoloaders.php index 1534c1eb..6f5a8550 100644 --- a/src/support/bootstrap/bootloader/firehub.RegisterAutoloaders.php +++ b/src/support/bootstrap/bootloader/firehub.RegisterAutoloaders.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Bootstrap\Bootloader; diff --git a/src/support/bootstrap/bootloader/firehub.RegisterConstants.php b/src/support/bootstrap/bootloader/firehub.RegisterConstants.php index 41dc6647..c2750913 100644 --- a/src/support/bootstrap/bootloader/firehub.RegisterConstants.php +++ b/src/support/bootstrap/bootloader/firehub.RegisterConstants.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Bootstrap\Bootloader; diff --git a/src/support/bootstrap/bootloader/firehub.RegisterHelpers.php b/src/support/bootstrap/bootloader/firehub.RegisterHelpers.php index 1c21e05d..22f6583c 100644 --- a/src/support/bootstrap/bootloader/firehub.RegisterHelpers.php +++ b/src/support/bootstrap/bootloader/firehub.RegisterHelpers.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Bootstrap\Bootloader; diff --git a/src/support/bootstrap/firehub.Bootloader.php b/src/support/bootstrap/firehub.Bootloader.php index 0e8395f4..def47dae 100644 --- a/src/support/bootstrap/firehub.Bootloader.php +++ b/src/support/bootstrap/firehub.Bootloader.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Bootstrap; diff --git a/src/support/bootstrap/firehub.FireHubConfigurator.php b/src/support/bootstrap/firehub.FireHubConfigurator.php index cc69382c..3f842eac 100644 --- a/src/support/bootstrap/firehub.FireHubConfigurator.php +++ b/src/support/bootstrap/firehub.FireHubConfigurator.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Bootstrap; diff --git a/src/support/contracts/firehub.DataStructure.php b/src/support/contracts/firehub.DataStructure.php index 46c88a3c..fe194fae 100644 --- a/src/support/contracts/firehub.DataStructure.php +++ b/src/support/contracts/firehub.DataStructure.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\Contracts; diff --git a/src/support/datastructure/abstract/firehub.ArrayCollection.php b/src/support/datastructure/abstract/firehub.ArrayCollection.php index 5a83bfe4..acd62e7b 100644 --- a/src/support/datastructure/abstract/firehub.ArrayCollection.php +++ b/src/support/datastructure/abstract/firehub.ArrayCollection.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Abstract; diff --git a/src/support/datastructure/contracts/capability/firehub.Transformable.php b/src/support/datastructure/contracts/capability/firehub.Transformable.php index 8fa65fa9..c1977bed 100644 --- a/src/support/datastructure/contracts/capability/firehub.Transformable.php +++ b/src/support/datastructure/contracts/capability/firehub.Transformable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Contracts\Capability; diff --git a/src/support/datastructure/contracts/firehub.Collection.php b/src/support/datastructure/contracts/firehub.Collection.php index 673b68bf..accc17eb 100644 --- a/src/support/datastructure/contracts/firehub.Collection.php +++ b/src/support/datastructure/contracts/firehub.Collection.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Contracts; diff --git a/src/support/datastructure/firehub.ArrayCollection.php b/src/support/datastructure/firehub.ArrayCollection.php index 7e3c752b..f1d8e276 100644 --- a/src/support/datastructure/firehub.ArrayCollection.php +++ b/src/support/datastructure/firehub.ArrayCollection.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure; diff --git a/src/support/datastructure/traits/firehub.Convertable.php b/src/support/datastructure/traits/firehub.Convertable.php index 2fb1f4af..64f3e41c 100644 --- a/src/support/datastructure/traits/firehub.Convertable.php +++ b/src/support/datastructure/traits/firehub.Convertable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Traits; diff --git a/src/support/datastructure/traits/firehub.Enumerable.php b/src/support/datastructure/traits/firehub.Enumerable.php index 94bd4a5a..0bcde9b8 100644 --- a/src/support/datastructure/traits/firehub.Enumerable.php +++ b/src/support/datastructure/traits/firehub.Enumerable.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Traits; diff --git a/src/support/datastructure/traits/firehub.Shared.php b/src/support/datastructure/traits/firehub.Shared.php index 7c340e7f..1c1f8f77 100644 --- a/src/support/datastructure/traits/firehub.Shared.php +++ b/src/support/datastructure/traits/firehub.Shared.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\DataStructure\Traits; diff --git a/src/support/firehub.Autoload.php b/src/support/firehub.Autoload.php index 8c27aaf5..fee8fa9a 100644 --- a/src/support/firehub.Autoload.php +++ b/src/support/firehub.Autoload.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support; diff --git a/src/support/firehub.LowLevel.php b/src/support/firehub.LowLevel.php index f7c59cdc..f6883c5c 100644 --- a/src/support/firehub.LowLevel.php +++ b/src/support/firehub.LowLevel.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support; diff --git a/src/support/lowlevel/firehub.Arr.php b/src/support/lowlevel/firehub.Arr.php index 7cfeec7e..08f2a8a7 100644 --- a/src/support/lowlevel/firehub.Arr.php +++ b/src/support/lowlevel/firehub.Arr.php @@ -9,8 +9,6 @@ * * @php-version 8.5 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.CharMB.php b/src/support/lowlevel/firehub.CharMB.php index c80eafd3..e95bfebf 100644 --- a/src/support/lowlevel/firehub.CharMB.php +++ b/src/support/lowlevel/firehub.CharMB.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.CharSB.php b/src/support/lowlevel/firehub.CharSB.php index cd5a03ca..093b0f61 100644 --- a/src/support/lowlevel/firehub.CharSB.php +++ b/src/support/lowlevel/firehub.CharSB.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.ClsObj.php b/src/support/lowlevel/firehub.ClsObj.php index e72cf70b..4c8a675b 100644 --- a/src/support/lowlevel/firehub.ClsObj.php +++ b/src/support/lowlevel/firehub.ClsObj.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Constant.php b/src/support/lowlevel/firehub.Constant.php index b86edd10..aa0e87c1 100644 --- a/src/support/lowlevel/firehub.Constant.php +++ b/src/support/lowlevel/firehub.Constant.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Data.php b/src/support/lowlevel/firehub.Data.php index d9d08cb3..f3970fed 100644 --- a/src/support/lowlevel/firehub.Data.php +++ b/src/support/lowlevel/firehub.Data.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.DataIs.php b/src/support/lowlevel/firehub.DataIs.php index 8a2b9343..5ccebfe0 100644 --- a/src/support/lowlevel/firehub.DataIs.php +++ b/src/support/lowlevel/firehub.DataIs.php @@ -9,8 +9,6 @@ * * @php-version 7.3 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.DateAndTime.php b/src/support/lowlevel/firehub.DateAndTime.php index 6f9760e9..b6b7748d 100644 --- a/src/support/lowlevel/firehub.DateAndTime.php +++ b/src/support/lowlevel/firehub.DateAndTime.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Declared.php b/src/support/lowlevel/firehub.Declared.php index f94e5db2..37d73e02 100644 --- a/src/support/lowlevel/firehub.Declared.php +++ b/src/support/lowlevel/firehub.Declared.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.FileSystem.php b/src/support/lowlevel/firehub.FileSystem.php index 56225553..818f116d 100644 --- a/src/support/lowlevel/firehub.FileSystem.php +++ b/src/support/lowlevel/firehub.FileSystem.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Func.php b/src/support/lowlevel/firehub.Func.php index 526cd2be..66352a84 100644 --- a/src/support/lowlevel/firehub.Func.php +++ b/src/support/lowlevel/firehub.Func.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Iterator.php b/src/support/lowlevel/firehub.Iterator.php index d81c070a..e9e24f37 100644 --- a/src/support/lowlevel/firehub.Iterator.php +++ b/src/support/lowlevel/firehub.Iterator.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Json.php b/src/support/lowlevel/firehub.Json.php index 5a1001db..5ac607df 100644 --- a/src/support/lowlevel/firehub.Json.php +++ b/src/support/lowlevel/firehub.Json.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Math.php b/src/support/lowlevel/firehub.Math.php index 56efd423..438bad3b 100644 --- a/src/support/lowlevel/firehub.Math.php +++ b/src/support/lowlevel/firehub.Math.php @@ -9,8 +9,6 @@ * * @php-version 8.4 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Random.php b/src/support/lowlevel/firehub.Random.php index 21803e86..4bf9336e 100644 --- a/src/support/lowlevel/firehub.Random.php +++ b/src/support/lowlevel/firehub.Random.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Regex.php b/src/support/lowlevel/firehub.Regex.php index e2c5ee56..0d8a6500 100644 --- a/src/support/lowlevel/firehub.Regex.php +++ b/src/support/lowlevel/firehub.Regex.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.RegexMB.php b/src/support/lowlevel/firehub.RegexMB.php index b125eff4..d2cff8f4 100644 --- a/src/support/lowlevel/firehub.RegexMB.php +++ b/src/support/lowlevel/firehub.RegexMB.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.Resources.php b/src/support/lowlevel/firehub.Resources.php index 30e0684c..dc587f92 100644 --- a/src/support/lowlevel/firehub.Resources.php +++ b/src/support/lowlevel/firehub.Resources.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.SplAutoload.php b/src/support/lowlevel/firehub.SplAutoload.php index b7850bf1..84aa744c 100644 --- a/src/support/lowlevel/firehub.SplAutoload.php +++ b/src/support/lowlevel/firehub.SplAutoload.php @@ -9,8 +9,6 @@ * * @php-version 8.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.StrMB.php b/src/support/lowlevel/firehub.StrMB.php index 228d6249..e4c87ae4 100644 --- a/src/support/lowlevel/firehub.StrMB.php +++ b/src/support/lowlevel/firehub.StrMB.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.StrSB.php b/src/support/lowlevel/firehub.StrSB.php index a75c0ab8..8b0fef4a 100644 --- a/src/support/lowlevel/firehub.StrSB.php +++ b/src/support/lowlevel/firehub.StrSB.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/support/lowlevel/firehub.SystemRuntime.php b/src/support/lowlevel/firehub.SystemRuntime.php index 7a834881..a2205403 100644 --- a/src/support/lowlevel/firehub.SystemRuntime.php +++ b/src/support/lowlevel/firehub.SystemRuntime.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Support\LowLevel; diff --git a/src/testing/firehub.Base.php b/src/testing/firehub.Base.php index 0f119c6a..b9d45e08 100644 --- a/src/testing/firehub.Base.php +++ b/src/testing/firehub.Base.php @@ -9,8 +9,6 @@ * * @php-version 7.0 * @package Core\Support - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Testing; diff --git a/src/throwable/error/lowlevel/arr/firehub.ChunkLengthTooSmallError.php b/src/throwable/error/lowlevel/arr/firehub.ChunkLengthTooSmallError.php index 74ec0802..02cd1efc 100644 --- a/src/throwable/error/lowlevel/arr/firehub.ChunkLengthTooSmallError.php +++ b/src/throwable/error/lowlevel/arr/firehub.ChunkLengthTooSmallError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/arr/firehub.FailedToSortMultiArrayError.php b/src/throwable/error/lowlevel/arr/firehub.FailedToSortMultiArrayError.php index 06fda275..67bef598 100644 --- a/src/throwable/error/lowlevel/arr/firehub.FailedToSortMultiArrayError.php +++ b/src/throwable/error/lowlevel/arr/firehub.FailedToSortMultiArrayError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/arr/firehub.KeysAndValuesDiffNumberOfElemsError.php b/src/throwable/error/lowlevel/arr/firehub.KeysAndValuesDiffNumberOfElemsError.php index 78ebf2f7..9af7c3e8 100644 --- a/src/throwable/error/lowlevel/arr/firehub.KeysAndValuesDiffNumberOfElemsError.php +++ b/src/throwable/error/lowlevel/arr/firehub.KeysAndValuesDiffNumberOfElemsError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/arr/firehub.OutOfRangeError.php b/src/throwable/error/lowlevel/arr/firehub.OutOfRangeError.php index 31eb8849..68f532fe 100644 --- a/src/throwable/error/lowlevel/arr/firehub.OutOfRangeError.php +++ b/src/throwable/error/lowlevel/arr/firehub.OutOfRangeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/arr/firehub.SizeInconsistentError.php b/src/throwable/error/lowlevel/arr/firehub.SizeInconsistentError.php index edb75968..36288a08 100644 --- a/src/throwable/error/lowlevel/arr/firehub.SizeInconsistentError.php +++ b/src/throwable/error/lowlevel/arr/firehub.SizeInconsistentError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/autoload/firehub.RegisterAutoloadError.php b/src/throwable/error/lowlevel/autoload/firehub.RegisterAutoloadError.php index b920d5d9..a9b64fd1 100644 --- a/src/throwable/error/lowlevel/autoload/firehub.RegisterAutoloadError.php +++ b/src/throwable/error/lowlevel/autoload/firehub.RegisterAutoloadError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/autoload/firehub.UnregisterAutoloaderError.php b/src/throwable/error/lowlevel/autoload/firehub.UnregisterAutoloaderError.php index c07153ca..b9eae03d 100644 --- a/src/throwable/error/lowlevel/autoload/firehub.UnregisterAutoloaderError.php +++ b/src/throwable/error/lowlevel/autoload/firehub.UnregisterAutoloaderError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Arr; diff --git a/src/throwable/error/lowlevel/clsobj/firehub.ClassDoesntExistError.php b/src/throwable/error/lowlevel/clsobj/firehub.ClassDoesntExistError.php index 313bf69a..1038f096 100644 --- a/src/throwable/error/lowlevel/clsobj/firehub.ClassDoesntExistError.php +++ b/src/throwable/error/lowlevel/clsobj/firehub.ClassDoesntExistError.php @@ -11,8 +11,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\ClsObj; diff --git a/src/throwable/error/lowlevel/clsobj/firehub.FailedToCreateAliasError.php b/src/throwable/error/lowlevel/clsobj/firehub.FailedToCreateAliasError.php index 09718607..d2d75a56 100644 --- a/src/throwable/error/lowlevel/clsobj/firehub.FailedToCreateAliasError.php +++ b/src/throwable/error/lowlevel/clsobj/firehub.FailedToCreateAliasError.php @@ -11,8 +11,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\ClsObj; diff --git a/src/throwable/error/lowlevel/constant/firehub.AlreadyExistError.php b/src/throwable/error/lowlevel/constant/firehub.AlreadyExistError.php index d3aa17ec..282e48b6 100644 --- a/src/throwable/error/lowlevel/constant/firehub.AlreadyExistError.php +++ b/src/throwable/error/lowlevel/constant/firehub.AlreadyExistError.php @@ -11,8 +11,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Constant; diff --git a/src/throwable/error/lowlevel/constant/firehub.FailedToDefineError.php b/src/throwable/error/lowlevel/constant/firehub.FailedToDefineError.php index d4128756..7f9461d5 100644 --- a/src/throwable/error/lowlevel/constant/firehub.FailedToDefineError.php +++ b/src/throwable/error/lowlevel/constant/firehub.FailedToDefineError.php @@ -11,8 +11,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Constant; diff --git a/src/throwable/error/lowlevel/constant/firehub.NotDefinedError.php b/src/throwable/error/lowlevel/constant/firehub.NotDefinedError.php index a705ab4d..b36b3428 100644 --- a/src/throwable/error/lowlevel/constant/firehub.NotDefinedError.php +++ b/src/throwable/error/lowlevel/constant/firehub.NotDefinedError.php @@ -11,8 +11,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Constant; diff --git a/src/throwable/error/lowlevel/data/firehub.ArrayToStringConversionError.php b/src/throwable/error/lowlevel/data/firehub.ArrayToStringConversionError.php index 15fead3a..a7e826f3 100644 --- a/src/throwable/error/lowlevel/data/firehub.ArrayToStringConversionError.php +++ b/src/throwable/error/lowlevel/data/firehub.ArrayToStringConversionError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/data/firehub.CannotSerializeError.php b/src/throwable/error/lowlevel/data/firehub.CannotSerializeError.php index 0bc69ef1..de2d7c58 100644 --- a/src/throwable/error/lowlevel/data/firehub.CannotSerializeError.php +++ b/src/throwable/error/lowlevel/data/firehub.CannotSerializeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/data/firehub.FailedToSetTypeError.php b/src/throwable/error/lowlevel/data/firehub.FailedToSetTypeError.php index 841444ee..fdcdbff9 100644 --- a/src/throwable/error/lowlevel/data/firehub.FailedToSetTypeError.php +++ b/src/throwable/error/lowlevel/data/firehub.FailedToSetTypeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/data/firehub.SetAsResourceError.php b/src/throwable/error/lowlevel/data/firehub.SetAsResourceError.php index 258a8796..14a057c3 100644 --- a/src/throwable/error/lowlevel/data/firehub.SetAsResourceError.php +++ b/src/throwable/error/lowlevel/data/firehub.SetAsResourceError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/data/firehub.TypeUnknownError.php b/src/throwable/error/lowlevel/data/firehub.TypeUnknownError.php index 17851b22..1f6940e9 100644 --- a/src/throwable/error/lowlevel/data/firehub.TypeUnknownError.php +++ b/src/throwable/error/lowlevel/data/firehub.TypeUnknownError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/data/firehub.UnserializeFailedError.php b/src/throwable/error/lowlevel/data/firehub.UnserializeFailedError.php index 1d033888..73dead3b 100644 --- a/src/throwable/error/lowlevel/data/firehub.UnserializeFailedError.php +++ b/src/throwable/error/lowlevel/data/firehub.UnserializeFailedError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Data; diff --git a/src/throwable/error/lowlevel/datetime/firehub.FailedToFormatTimestampAsIntError.php b/src/throwable/error/lowlevel/datetime/firehub.FailedToFormatTimestampAsIntError.php index 9baf8fc1..2cef5bd4 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.FailedToFormatTimestampAsIntError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.FailedToFormatTimestampAsIntError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/datetime/firehub.FailedToGetZoneError.php b/src/throwable/error/lowlevel/datetime/firehub.FailedToGetZoneError.php index 5fb9a998..4e3e9af8 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.FailedToGetZoneError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.FailedToGetZoneError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/datetime/firehub.FailedToSetZoneError.php b/src/throwable/error/lowlevel/datetime/firehub.FailedToSetZoneError.php index e2202f65..ba506639 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.FailedToSetZoneError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.FailedToSetZoneError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/datetime/firehub.FormatTimestampError.php b/src/throwable/error/lowlevel/datetime/firehub.FormatTimestampError.php index 55504a4f..a89ea2d3 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.FormatTimestampError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.FormatTimestampError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/datetime/firehub.ParseFromFormatError.php b/src/throwable/error/lowlevel/datetime/firehub.ParseFromFormatError.php index b0055b34..3c845876 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.ParseFromFormatError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.ParseFromFormatError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/datetime/firehub.StringToTimestampError.php b/src/throwable/error/lowlevel/datetime/firehub.StringToTimestampError.php index bcf650da..b2039962 100644 --- a/src/throwable/error/lowlevel/datetime/firehub.StringToTimestampError.php +++ b/src/throwable/error/lowlevel/datetime/firehub.StringToTimestampError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\DateTime; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.CannotListError.php b/src/throwable/error/lowlevel/filesystem/firehub.CannotListError.php index bf17d5f9..8f5571dd 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.CannotListError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.CannotListError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkGroupError.php b/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkGroupError.php index 14ac14f0..1366c1aa 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkGroupError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkGroupError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkOwnerError.php b/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkOwnerError.php index bec9bbc9..7633d4da 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkOwnerError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.ChangeSymlinkOwnerError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.CopyPathError.php b/src/throwable/error/lowlevel/filesystem/firehub.CopyPathError.php index ad5466c2..c7931754 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.CopyPathError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.CopyPathError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.CreateFolderError.php b/src/throwable/error/lowlevel/filesystem/firehub.CreateFolderError.php index 923baf11..8ffd5211 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.CreateFolderError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.CreateFolderError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.CreateLinkError.php b/src/throwable/error/lowlevel/filesystem/firehub.CreateLinkError.php index ad67d196..1809baec 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.CreateLinkError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.CreateLinkError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.CreateSymlinkError.php b/src/throwable/error/lowlevel/filesystem/firehub.CreateSymlinkError.php index 5f113844..686c722a 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.CreateSymlinkError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.CreateSymlinkError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.DeletePathError.php b/src/throwable/error/lowlevel/filesystem/firehub.DeletePathError.php index 7fc962c7..003f9cd0 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.DeletePathError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.DeletePathError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.DiskSpaceError.php b/src/throwable/error/lowlevel/filesystem/firehub.DiskSpaceError.php index e8c5e402..2cb4c942 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.DiskSpaceError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.DiskSpaceError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetAbsolutePathError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetAbsolutePathError.php index 8e2ea211..8459883b 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetAbsolutePathError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetAbsolutePathError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetContentError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetContentError.php index c4fdb97e..7571cd1d 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetContentError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetContentError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetGroupError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetGroupError.php index 25b13f21..6d5c40fd 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetGroupError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetGroupError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetInodeError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetInodeError.php index ef2c6bce..1f7d0eb8 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetInodeError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetInodeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetLastAccessedError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetLastAccessedError.php index f39ee27f..0605e19b 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetLastAccessedError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetLastAccessedError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetLastChangedError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetLastChangedError.php index ec752f45..f108db76 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetLastChangedError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetLastChangedError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetLastModifiedError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetLastModifiedError.php index 913e41c3..33906a35 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetLastModifiedError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetLastModifiedError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetOwnerError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetOwnerError.php index 0d65e3ac..841e6fcf 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetOwnerError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetOwnerError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetPathSizeError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetPathSizeError.php index 709b822e..67b23445 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetPathSizeError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetPathSizeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetPermissionsError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetPermissionsError.php index 1029deb7..0a225db9 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetPermissionsError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetPermissionsError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetStatisticsError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetStatisticsError.php index 6b3dffd3..48673608 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetStatisticsError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetStatisticsError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.GetSymlinkError.php b/src/throwable/error/lowlevel/filesystem/firehub.GetSymlinkError.php index 4bc23256..6233be00 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.GetSymlinkError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.GetSymlinkError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.MoveUploadedFileError.php b/src/throwable/error/lowlevel/filesystem/firehub.MoveUploadedFileError.php index 8d3b90f3..e99744ab 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.MoveUploadedFileError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.MoveUploadedFileError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.ParentLevelTooSmallError.php b/src/throwable/error/lowlevel/filesystem/firehub.ParentLevelTooSmallError.php index 1c9aa9fb..3b12567c 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.ParentLevelTooSmallError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.ParentLevelTooSmallError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.PathDoesntExistError.php b/src/throwable/error/lowlevel/filesystem/firehub.PathDoesntExistError.php index 4cf07dad..cfe1958e 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.PathDoesntExistError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.PathDoesntExistError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.PutContentError.php b/src/throwable/error/lowlevel/filesystem/firehub.PutContentError.php index 4a0ede57..ce005fd9 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.PutContentError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.PutContentError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.ReadFileError.php b/src/throwable/error/lowlevel/filesystem/firehub.ReadFileError.php index 1398dc1d..85cf750f 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.ReadFileError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.ReadFileError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.RenameError.php b/src/throwable/error/lowlevel/filesystem/firehub.RenameError.php index 495634be..e33b43f9 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.RenameError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.RenameError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.SearchError.php b/src/throwable/error/lowlevel/filesystem/firehub.SearchError.php index 4948be64..2d6eb41f 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.SearchError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.SearchError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.SetGroupError.php b/src/throwable/error/lowlevel/filesystem/firehub.SetGroupError.php index fa6b1b3f..4ad85a42 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.SetGroupError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.SetGroupError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.SetLastAccessAndModifyError.php b/src/throwable/error/lowlevel/filesystem/firehub.SetLastAccessAndModifyError.php index 76241acc..aba6003a 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.SetLastAccessAndModifyError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.SetLastAccessAndModifyError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.SetOwnerError.php b/src/throwable/error/lowlevel/filesystem/firehub.SetOwnerError.php index 2f06c37a..aa1d0567 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.SetOwnerError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.SetOwnerError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/filesystem/firehub.SetPermissionsError.php b/src/throwable/error/lowlevel/filesystem/firehub.SetPermissionsError.php index 8aabca1a..66c0366a 100644 --- a/src/throwable/error/lowlevel/filesystem/firehub.SetPermissionsError.php +++ b/src/throwable/error/lowlevel/filesystem/firehub.SetPermissionsError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\FileSystem; diff --git a/src/throwable/error/lowlevel/func/firehub.RegisterTickFailedError.php b/src/throwable/error/lowlevel/func/firehub.RegisterTickFailedError.php index 3d5b597d..58feccb6 100644 --- a/src/throwable/error/lowlevel/func/firehub.RegisterTickFailedError.php +++ b/src/throwable/error/lowlevel/func/firehub.RegisterTickFailedError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Func; diff --git a/src/throwable/error/lowlevel/json/firehub.DecodeError.php b/src/throwable/error/lowlevel/json/firehub.DecodeError.php index 6f371535..6c0f9d8d 100644 --- a/src/throwable/error/lowlevel/json/firehub.DecodeError.php +++ b/src/throwable/error/lowlevel/json/firehub.DecodeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Json; diff --git a/src/throwable/error/lowlevel/json/firehub.EncodeError.php b/src/throwable/error/lowlevel/json/firehub.EncodeError.php index 79693233..fb1afb05 100644 --- a/src/throwable/error/lowlevel/json/firehub.EncodeError.php +++ b/src/throwable/error/lowlevel/json/firehub.EncodeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Json; diff --git a/src/throwable/error/lowlevel/number/firehub.ArithmeticError.php b/src/throwable/error/lowlevel/number/firehub.ArithmeticError.php index d8c87c43..6edb6adf 100644 --- a/src/throwable/error/lowlevel/number/firehub.ArithmeticError.php +++ b/src/throwable/error/lowlevel/number/firehub.ArithmeticError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Number; diff --git a/src/throwable/error/lowlevel/number/firehub.DivideByZeroError.php b/src/throwable/error/lowlevel/number/firehub.DivideByZeroError.php index 132105b2..55a199a8 100644 --- a/src/throwable/error/lowlevel/number/firehub.DivideByZeroError.php +++ b/src/throwable/error/lowlevel/number/firehub.DivideByZeroError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Number; diff --git a/src/throwable/error/lowlevel/random/firehub.MaxLessThanMinError.php b/src/throwable/error/lowlevel/random/firehub.MaxLessThanMinError.php index 9538d90f..3f3070c0 100644 --- a/src/throwable/error/lowlevel/random/firehub.MaxLessThanMinError.php +++ b/src/throwable/error/lowlevel/random/firehub.MaxLessThanMinError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Random; diff --git a/src/throwable/error/lowlevel/random/firehub.NumberGreaterThanMaxError.php b/src/throwable/error/lowlevel/random/firehub.NumberGreaterThanMaxError.php index cbe7c63a..b40c0bfb 100644 --- a/src/throwable/error/lowlevel/random/firehub.NumberGreaterThanMaxError.php +++ b/src/throwable/error/lowlevel/random/firehub.NumberGreaterThanMaxError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Random; diff --git a/src/throwable/error/lowlevel/random/firehub.NumberLessThanMinError.php b/src/throwable/error/lowlevel/random/firehub.NumberLessThanMinError.php index 27544272..5eb0e0eb 100644 --- a/src/throwable/error/lowlevel/random/firehub.NumberLessThanMinError.php +++ b/src/throwable/error/lowlevel/random/firehub.NumberLessThanMinError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Random; diff --git a/src/throwable/error/lowlevel/random/firehub.SecureNumberError.php b/src/throwable/error/lowlevel/random/firehub.SecureNumberError.php index e8602001..ad3d8b6c 100644 --- a/src/throwable/error/lowlevel/random/firehub.SecureNumberError.php +++ b/src/throwable/error/lowlevel/random/firehub.SecureNumberError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Random; diff --git a/src/throwable/error/lowlevel/regex/firehub.InvalidPatternError.php b/src/throwable/error/lowlevel/regex/firehub.InvalidPatternError.php index 7c21f50d..8fa6b340 100644 --- a/src/throwable/error/lowlevel/regex/firehub.InvalidPatternError.php +++ b/src/throwable/error/lowlevel/regex/firehub.InvalidPatternError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\Regex; diff --git a/src/throwable/error/lowlevel/string/firehub.ChunkLengthLessThanOneError.php b/src/throwable/error/lowlevel/string/firehub.ChunkLengthLessThanOneError.php index db97a6ba..b0a06aa5 100644 --- a/src/throwable/error/lowlevel/string/firehub.ChunkLengthLessThanOneError.php +++ b/src/throwable/error/lowlevel/string/firehub.ChunkLengthLessThanOneError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/string/firehub.CodepointOutsideValidRangeError.php b/src/throwable/error/lowlevel/string/firehub.CodepointOutsideValidRangeError.php index 4067c5e3..99492b6a 100644 --- a/src/throwable/error/lowlevel/string/firehub.CodepointOutsideValidRangeError.php +++ b/src/throwable/error/lowlevel/string/firehub.CodepointOutsideValidRangeError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/string/firehub.ComparePartError.php b/src/throwable/error/lowlevel/string/firehub.ComparePartError.php index 8fd81587..dd86a030 100644 --- a/src/throwable/error/lowlevel/string/firehub.ComparePartError.php +++ b/src/throwable/error/lowlevel/string/firehub.ComparePartError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/string/firehub.EmptyPadError.php b/src/throwable/error/lowlevel/string/firehub.EmptyPadError.php index 56ed87cf..6ecbc17f 100644 --- a/src/throwable/error/lowlevel/string/firehub.EmptyPadError.php +++ b/src/throwable/error/lowlevel/string/firehub.EmptyPadError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/string/firehub.EmptySeparatorError.php b/src/throwable/error/lowlevel/string/firehub.EmptySeparatorError.php index 5c0ee43a..a4dc17b5 100644 --- a/src/throwable/error/lowlevel/string/firehub.EmptySeparatorError.php +++ b/src/throwable/error/lowlevel/string/firehub.EmptySeparatorError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/string/firehub.InvalidEncodingError.php b/src/throwable/error/lowlevel/string/firehub.InvalidEncodingError.php index 230869f1..40ebfb70 100644 --- a/src/throwable/error/lowlevel/string/firehub.InvalidEncodingError.php +++ b/src/throwable/error/lowlevel/string/firehub.InvalidEncodingError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\String; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetProcessIDError.php b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetProcessIDError.php index 8869e55d..570b5e5f 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetProcessIDError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetProcessIDError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetServerAPIError.php b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetServerAPIError.php index e9ce721e..4d2cf44e 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetServerAPIError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToGetServerAPIError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToSetConfigurationOptionError.php b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToSetConfigurationOptionError.php index 5538e8b1..34041550 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.FailedToSetConfigurationOptionError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.FailedToSetConfigurationOptionError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationOptionError.php b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationOptionError.php index bf4be423..2e99a090 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationOptionError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationOptionError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationQuantityError.php b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationQuantityError.php index c7f0edd3..9c19e4a3 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationQuantityError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationQuantityError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidExtensionError.php b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidExtensionError.php index f6365494..e82840ed 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.InvalidExtensionError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.InvalidExtensionError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php b/src/throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php index eada61c8..27a91e13 100644 --- a/src/throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php +++ b/src/throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel\SystemRuntime; diff --git a/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php b/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php index e15e7a94..cb864a74 100644 --- a/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php +++ b/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Error\LowLevel; diff --git a/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php b/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php index 71b12566..ef5e9470 100644 --- a/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php +++ b/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\DataStructure; diff --git a/src/throwable/exception/domain/autoload/firehub.ImplementationException.php b/src/throwable/exception/domain/autoload/firehub.ImplementationException.php index b69c03cc..136ebed2 100644 --- a/src/throwable/exception/domain/autoload/firehub.ImplementationException.php +++ b/src/throwable/exception/domain/autoload/firehub.ImplementationException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Domain\Autoload; diff --git a/src/throwable/exception/domain/autoload/firehub.InvalidFolderException.php b/src/throwable/exception/domain/autoload/firehub.InvalidFolderException.php index 53448d5f..a7b7ddd6 100644 --- a/src/throwable/exception/domain/autoload/firehub.InvalidFolderException.php +++ b/src/throwable/exception/domain/autoload/firehub.InvalidFolderException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Domain\Autoload; diff --git a/src/throwable/exception/domain/autoload/firehub.InvalidHandleException.php b/src/throwable/exception/domain/autoload/firehub.InvalidHandleException.php index 5da7387e..782ef76b 100644 --- a/src/throwable/exception/domain/autoload/firehub.InvalidHandleException.php +++ b/src/throwable/exception/domain/autoload/firehub.InvalidHandleException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Domain\Autoload; diff --git a/src/throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php b/src/throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php index d7f67d90..ea7a0af1 100644 --- a/src/throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php +++ b/src/throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Domain\Autoload; diff --git a/src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php b/src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php index 0e6f88d4..41a681c6 100644 --- a/src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php +++ b/src/throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Support\Bootstrap; diff --git a/src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php b/src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php index 411e401a..1575030f 100644 --- a/src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php +++ b/src/throwable/exception/support/bootstrap/firehub.NotBootloaderException.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\Exception\Support\Bootstrap; diff --git a/src/throwable/firehub.Builder.php b/src/throwable/firehub.Builder.php index 476a43fb..c8af92d9 100644 --- a/src/throwable/firehub.Builder.php +++ b/src/throwable/firehub.Builder.php @@ -9,8 +9,6 @@ * * @php-version 8.1 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/firehub.Error.php b/src/throwable/firehub.Error.php index 91b65550..b39a0c92 100644 --- a/src/throwable/firehub.Error.php +++ b/src/throwable/firehub.Error.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/firehub.ErrorBuilder.php b/src/throwable/firehub.ErrorBuilder.php index 28986ba5..bdcb039d 100644 --- a/src/throwable/firehub.ErrorBuilder.php +++ b/src/throwable/firehub.ErrorBuilder.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/firehub.Exception.php b/src/throwable/firehub.Exception.php index c00c6be6..6f4c4161 100644 --- a/src/throwable/firehub.Exception.php +++ b/src/throwable/firehub.Exception.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/firehub.ExceptionBuilder.php b/src/throwable/firehub.ExceptionBuilder.php index 835f33a9..334c5bdd 100644 --- a/src/throwable/firehub.ExceptionBuilder.php +++ b/src/throwable/firehub.ExceptionBuilder.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/firehub.Throwable.php b/src/throwable/firehub.Throwable.php index 0517d89f..ab38477f 100644 --- a/src/throwable/firehub.Throwable.php +++ b/src/throwable/firehub.Throwable.php @@ -9,8 +9,6 @@ * * @php-version 8.3 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable; diff --git a/src/throwable/valueobject/firehub.Code.php b/src/throwable/valueobject/firehub.Code.php index 1c8dd98d..b87e4818 100644 --- a/src/throwable/valueobject/firehub.Code.php +++ b/src/throwable/valueobject/firehub.Code.php @@ -9,8 +9,6 @@ * * @php-version 8.2 * @package Core\Throwable - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Core\Throwable\ValueObject; From ac1f060a22ed26556aa503cb04af1831152c22e4 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 8 Apr 2026 09:58:55 +0200 Subject: [PATCH 44/79] Test PHAR --- tests/dataproviders/firehub.ArrDataProvider.php | 2 -- tests/dataproviders/firehub.ClsObjDataProvider.php | 2 -- tests/dataproviders/firehub.ConstantDataProvider.php | 2 -- tests/dataproviders/firehub.DataDataProvider.php | 2 -- tests/dataproviders/firehub.DataStructureDataProvider.php | 2 -- tests/dataproviders/firehub.DateTimeDataProvider.php | 2 -- tests/dataproviders/firehub.NumDataProvider.php | 2 -- tests/dataproviders/firehub.ResourceDataProvider.php | 2 -- tests/dataproviders/firehub.StrDataProvider.php | 2 -- tests/unit/FireHubTest.php | 2 -- tests/unit/domain/autoload/HandleTest.php | 2 -- tests/unit/shared/enums/OrderTest.php | 2 -- tests/unit/shared/enums/data/TypeTest.php | 2 -- tests/unit/shared/enums/number/LogBaseTest.php | 2 -- tests/unit/shared/enums/number/RoundTest.php | 2 -- tests/unit/support/AutoloadTest.php | 2 -- tests/unit/support/autoload/loader/ClassmapTest.php | 2 -- tests/unit/support/autoload/loader/ResolverTest.php | 2 -- tests/unit/support/bootstrap/FireHubConfiguratorTest.php | 2 -- .../support/bootstrap/bootloader/RegisterAutoloadersTest.php | 2 -- .../unit/support/bootstrap/bootloader/RegisterConstantsTest.php | 2 -- tests/unit/support/bootstrap/bootloader/RegisterHelpersTest.php | 2 -- tests/unit/support/datastructure/ArrayCollectionTest.php | 2 -- tests/unit/support/lowlevel/ArrTest.php | 2 -- tests/unit/support/lowlevel/CharMBTest.php | 2 -- tests/unit/support/lowlevel/CharSBTest.php | 2 -- tests/unit/support/lowlevel/ClsObjTest.php | 2 -- tests/unit/support/lowlevel/ConstantTest.php | 2 -- tests/unit/support/lowlevel/DataTest.php | 2 -- tests/unit/support/lowlevel/DateAndTimeTest.php | 2 -- tests/unit/support/lowlevel/DeclaredTest.php | 2 -- tests/unit/support/lowlevel/FuncTest.php | 2 -- tests/unit/support/lowlevel/IteratorTest.php | 2 -- tests/unit/support/lowlevel/JsonTest.php | 2 -- tests/unit/support/lowlevel/MathTest.php | 2 -- tests/unit/support/lowlevel/RandomTest.php | 2 -- tests/unit/support/lowlevel/RegexMBTest.php | 2 -- tests/unit/support/lowlevel/RegexTest.php | 2 -- tests/unit/support/lowlevel/ResourcesTest.php | 2 -- tests/unit/support/lowlevel/SplAutoloadTest.php | 2 -- tests/unit/support/lowlevel/StrMBTest.php | 2 -- tests/unit/support/lowlevel/StrSBTest.php | 2 -- tests/unit/support/lowlevel/SystemRuntimeTest.php | 2 -- 43 files changed, 86 deletions(-) diff --git a/tests/dataproviders/firehub.ArrDataProvider.php b/tests/dataproviders/firehub.ArrDataProvider.php index a668e52a..bc91cbd5 100644 --- a/tests/dataproviders/firehub.ArrDataProvider.php +++ b/tests/dataproviders/firehub.ArrDataProvider.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\DataProviders; diff --git a/tests/dataproviders/firehub.ClsObjDataProvider.php b/tests/dataproviders/firehub.ClsObjDataProvider.php index 48412915..946fddcd 100644 --- a/tests/dataproviders/firehub.ClsObjDataProvider.php +++ b/tests/dataproviders/firehub.ClsObjDataProvider.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\DataProviders; diff --git a/tests/dataproviders/firehub.ConstantDataProvider.php b/tests/dataproviders/firehub.ConstantDataProvider.php index 2b5fbfa9..2221d18c 100644 --- a/tests/dataproviders/firehub.ConstantDataProvider.php +++ b/tests/dataproviders/firehub.ConstantDataProvider.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\DataProviders; diff --git a/tests/dataproviders/firehub.DataDataProvider.php b/tests/dataproviders/firehub.DataDataProvider.php index 77388652..4ccc39fc 100644 --- a/tests/dataproviders/firehub.DataDataProvider.php +++ b/tests/dataproviders/firehub.DataDataProvider.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\DataProviders; diff --git a/tests/dataproviders/firehub.DataStructureDataProvider.php b/tests/dataproviders/firehub.DataStructureDataProvider.php index 03f95f74..8674f07b 100644 --- a/tests/dataproviders/firehub.DataStructureDataProvider.php +++ b/tests/dataproviders/firehub.DataStructureDataProvider.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\DataProviders; diff --git a/tests/dataproviders/firehub.DateTimeDataProvider.php b/tests/dataproviders/firehub.DateTimeDataProvider.php index d1e57d1e..a386357d 100644 --- a/tests/dataproviders/firehub.DateTimeDataProvider.php +++ b/tests/dataproviders/firehub.DateTimeDataProvider.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\DataProviders; diff --git a/tests/dataproviders/firehub.NumDataProvider.php b/tests/dataproviders/firehub.NumDataProvider.php index fafe68df..74e1a000 100644 --- a/tests/dataproviders/firehub.NumDataProvider.php +++ b/tests/dataproviders/firehub.NumDataProvider.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\DataProviders; diff --git a/tests/dataproviders/firehub.ResourceDataProvider.php b/tests/dataproviders/firehub.ResourceDataProvider.php index 74cc3d73..0e972d3c 100644 --- a/tests/dataproviders/firehub.ResourceDataProvider.php +++ b/tests/dataproviders/firehub.ResourceDataProvider.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\DataProviders; diff --git a/tests/dataproviders/firehub.StrDataProvider.php b/tests/dataproviders/firehub.StrDataProvider.php index f0a065c1..caf813ec 100644 --- a/tests/dataproviders/firehub.StrDataProvider.php +++ b/tests/dataproviders/firehub.StrDataProvider.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\DataProviders; diff --git a/tests/unit/FireHubTest.php b/tests/unit/FireHubTest.php index 44a17aad..6669170e 100644 --- a/tests/unit/FireHubTest.php +++ b/tests/unit/FireHubTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit; diff --git a/tests/unit/domain/autoload/HandleTest.php b/tests/unit/domain/autoload/HandleTest.php index 952ea4bd..3e0f2dc1 100644 --- a/tests/unit/domain/autoload/HandleTest.php +++ b/tests/unit/domain/autoload/HandleTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Domain\Autoload; diff --git a/tests/unit/shared/enums/OrderTest.php b/tests/unit/shared/enums/OrderTest.php index 0a503337..2d5e782e 100644 --- a/tests/unit/shared/enums/OrderTest.php +++ b/tests/unit/shared/enums/OrderTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Shared\Enums; diff --git a/tests/unit/shared/enums/data/TypeTest.php b/tests/unit/shared/enums/data/TypeTest.php index 54747f3d..213875bc 100644 --- a/tests/unit/shared/enums/data/TypeTest.php +++ b/tests/unit/shared/enums/data/TypeTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Shared\Enums\Data; diff --git a/tests/unit/shared/enums/number/LogBaseTest.php b/tests/unit/shared/enums/number/LogBaseTest.php index 876d6441..70d96e5f 100644 --- a/tests/unit/shared/enums/number/LogBaseTest.php +++ b/tests/unit/shared/enums/number/LogBaseTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Shared\Enums\Number; diff --git a/tests/unit/shared/enums/number/RoundTest.php b/tests/unit/shared/enums/number/RoundTest.php index fe2f51cd..fc67e9d5 100644 --- a/tests/unit/shared/enums/number/RoundTest.php +++ b/tests/unit/shared/enums/number/RoundTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Shared\Enums\Number; diff --git a/tests/unit/support/AutoloadTest.php b/tests/unit/support/AutoloadTest.php index 78c864fe..a42797a9 100644 --- a/tests/unit/support/AutoloadTest.php +++ b/tests/unit/support/AutoloadTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support; diff --git a/tests/unit/support/autoload/loader/ClassmapTest.php b/tests/unit/support/autoload/loader/ClassmapTest.php index 662d9a6d..17ae1f1c 100644 --- a/tests/unit/support/autoload/loader/ClassmapTest.php +++ b/tests/unit/support/autoload/loader/ClassmapTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\Autoload\Loader; diff --git a/tests/unit/support/autoload/loader/ResolverTest.php b/tests/unit/support/autoload/loader/ResolverTest.php index a8e642f2..4fa2ca37 100644 --- a/tests/unit/support/autoload/loader/ResolverTest.php +++ b/tests/unit/support/autoload/loader/ResolverTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\Autoload\Loader; diff --git a/tests/unit/support/bootstrap/FireHubConfiguratorTest.php b/tests/unit/support/bootstrap/FireHubConfiguratorTest.php index 92c6b38f..119d1f18 100644 --- a/tests/unit/support/bootstrap/FireHubConfiguratorTest.php +++ b/tests/unit/support/bootstrap/FireHubConfiguratorTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\Bootstrap; diff --git a/tests/unit/support/bootstrap/bootloader/RegisterAutoloadersTest.php b/tests/unit/support/bootstrap/bootloader/RegisterAutoloadersTest.php index cde7ff35..1f4283ed 100644 --- a/tests/unit/support/bootstrap/bootloader/RegisterAutoloadersTest.php +++ b/tests/unit/support/bootstrap/bootloader/RegisterAutoloadersTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\Bootstrap\Bootloader; diff --git a/tests/unit/support/bootstrap/bootloader/RegisterConstantsTest.php b/tests/unit/support/bootstrap/bootloader/RegisterConstantsTest.php index 888f2264..514f42b4 100644 --- a/tests/unit/support/bootstrap/bootloader/RegisterConstantsTest.php +++ b/tests/unit/support/bootstrap/bootloader/RegisterConstantsTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\Bootstrap\Bootloader; diff --git a/tests/unit/support/bootstrap/bootloader/RegisterHelpersTest.php b/tests/unit/support/bootstrap/bootloader/RegisterHelpersTest.php index 89285c7e..91ac8dbc 100644 --- a/tests/unit/support/bootstrap/bootloader/RegisterHelpersTest.php +++ b/tests/unit/support/bootstrap/bootloader/RegisterHelpersTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\Bootstrap\Bootloader; diff --git a/tests/unit/support/datastructure/ArrayCollectionTest.php b/tests/unit/support/datastructure/ArrayCollectionTest.php index 6042b204..16d05897 100644 --- a/tests/unit/support/datastructure/ArrayCollectionTest.php +++ b/tests/unit/support/datastructure/ArrayCollectionTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\DataStructure; diff --git a/tests/unit/support/lowlevel/ArrTest.php b/tests/unit/support/lowlevel/ArrTest.php index 8d784ad1..4b964a8e 100644 --- a/tests/unit/support/lowlevel/ArrTest.php +++ b/tests/unit/support/lowlevel/ArrTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/CharMBTest.php b/tests/unit/support/lowlevel/CharMBTest.php index efebc8ff..011f8302 100644 --- a/tests/unit/support/lowlevel/CharMBTest.php +++ b/tests/unit/support/lowlevel/CharMBTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/CharSBTest.php b/tests/unit/support/lowlevel/CharSBTest.php index e5d2a939..0d3958dd 100644 --- a/tests/unit/support/lowlevel/CharSBTest.php +++ b/tests/unit/support/lowlevel/CharSBTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/ClsObjTest.php b/tests/unit/support/lowlevel/ClsObjTest.php index 05459fca..421bdb50 100644 --- a/tests/unit/support/lowlevel/ClsObjTest.php +++ b/tests/unit/support/lowlevel/ClsObjTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/ConstantTest.php b/tests/unit/support/lowlevel/ConstantTest.php index 4462bd11..f18a292f 100644 --- a/tests/unit/support/lowlevel/ConstantTest.php +++ b/tests/unit/support/lowlevel/ConstantTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/DataTest.php b/tests/unit/support/lowlevel/DataTest.php index 06cf9160..c3ad38c3 100644 --- a/tests/unit/support/lowlevel/DataTest.php +++ b/tests/unit/support/lowlevel/DataTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/DateAndTimeTest.php b/tests/unit/support/lowlevel/DateAndTimeTest.php index 57295bef..d8a254eb 100644 --- a/tests/unit/support/lowlevel/DateAndTimeTest.php +++ b/tests/unit/support/lowlevel/DateAndTimeTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/DeclaredTest.php b/tests/unit/support/lowlevel/DeclaredTest.php index 3510beb3..cc9b2b03 100644 --- a/tests/unit/support/lowlevel/DeclaredTest.php +++ b/tests/unit/support/lowlevel/DeclaredTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/FuncTest.php b/tests/unit/support/lowlevel/FuncTest.php index 2ba1ca47..d71d11df 100644 --- a/tests/unit/support/lowlevel/FuncTest.php +++ b/tests/unit/support/lowlevel/FuncTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/IteratorTest.php b/tests/unit/support/lowlevel/IteratorTest.php index 827853ca..fd25ad57 100644 --- a/tests/unit/support/lowlevel/IteratorTest.php +++ b/tests/unit/support/lowlevel/IteratorTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/JsonTest.php b/tests/unit/support/lowlevel/JsonTest.php index 40721e69..48cf009e 100644 --- a/tests/unit/support/lowlevel/JsonTest.php +++ b/tests/unit/support/lowlevel/JsonTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/MathTest.php b/tests/unit/support/lowlevel/MathTest.php index 3ddaa0de..542f2956 100644 --- a/tests/unit/support/lowlevel/MathTest.php +++ b/tests/unit/support/lowlevel/MathTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/RandomTest.php b/tests/unit/support/lowlevel/RandomTest.php index 9f258ecb..f9ee31ae 100644 --- a/tests/unit/support/lowlevel/RandomTest.php +++ b/tests/unit/support/lowlevel/RandomTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/RegexMBTest.php b/tests/unit/support/lowlevel/RegexMBTest.php index 50191a9a..60c1eada 100644 --- a/tests/unit/support/lowlevel/RegexMBTest.php +++ b/tests/unit/support/lowlevel/RegexMBTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/RegexTest.php b/tests/unit/support/lowlevel/RegexTest.php index daf3d8df..c8f8e332 100644 --- a/tests/unit/support/lowlevel/RegexTest.php +++ b/tests/unit/support/lowlevel/RegexTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/ResourcesTest.php b/tests/unit/support/lowlevel/ResourcesTest.php index dda095e6..52022857 100644 --- a/tests/unit/support/lowlevel/ResourcesTest.php +++ b/tests/unit/support/lowlevel/ResourcesTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/SplAutoloadTest.php b/tests/unit/support/lowlevel/SplAutoloadTest.php index 07f2b0f9..7f257de9 100644 --- a/tests/unit/support/lowlevel/SplAutoloadTest.php +++ b/tests/unit/support/lowlevel/SplAutoloadTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/StrMBTest.php b/tests/unit/support/lowlevel/StrMBTest.php index 5e3ae2af..82178078 100644 --- a/tests/unit/support/lowlevel/StrMBTest.php +++ b/tests/unit/support/lowlevel/StrMBTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/StrSBTest.php b/tests/unit/support/lowlevel/StrSBTest.php index 75cfa2c7..3f47d516 100644 --- a/tests/unit/support/lowlevel/StrSBTest.php +++ b/tests/unit/support/lowlevel/StrSBTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; diff --git a/tests/unit/support/lowlevel/SystemRuntimeTest.php b/tests/unit/support/lowlevel/SystemRuntimeTest.php index 47e83e71..e3113139 100644 --- a/tests/unit/support/lowlevel/SystemRuntimeTest.php +++ b/tests/unit/support/lowlevel/SystemRuntimeTest.php @@ -8,8 +8,6 @@ * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 * * @package Core\Test - * - * @version GIT: $Id$ Blob checksum. */ namespace FireHub\Tests\Unit\Support\LowLevel; From 5922510c2bf721d3c4e0284f6dfd0baf811bf617 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 8 Apr 2026 10:37:03 +0200 Subject: [PATCH 45/79] refactor: update PHPStan rule includes for consistency --- phpstan.neon | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index 4d42bccb..1486efd6 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,8 +1,8 @@ includes: - phar://phpstan.phar/conf/bleedingEdge.neon - vendor/phpstan/phpstan-strict-rules/rules.neon - - vendor/firehub/phpstan-rules/src/rule.neon - - vendor/firehub/phpstan-rules/src/type.neon + - vendor/firehub/phpstan-rules/rule.neon + - vendor/firehub/phpstan-rules/type.neon parameters: level: max From 66864255c1610faf13e3921ab138895e440a5caf Mon Sep 17 00:00:00 2001 From: Riddick Date: Thu, 9 Apr 2026 13:55:14 +0200 Subject: [PATCH 46/79] Refactored and restructured core FireHub data structures and behaviors. **Detailed Description:** 1. **Removal of Legacy Classes and Traits:** - Deleted redundant or outdated classes (`ArrayCollection`, `Transformable`, `Collection`, etc.) and traits (`Convertable`, `Enumerable`, `Shared`), previously used for array-backed and enumerable data structures. - Removed unit tests (`ArrayCollectionTest.php`) tied to removed functionality. 2. **Improved Contract Hierarchy:** - Introduced new core principles to enforce modularity and extensibility: - `Behavior\Countable`: Abstracted and decoupled element counting into a specific contract. - `Behavior\Enumerable`: Redesigned for higher-level traversal operations and composability. - Added `Storage` as a universal base for managing data persistence/access with flexible memory models. - Defined `Linear` as a foundational interface for sequential-access structures and standardized traversal patterns. 3. **New Linear `Sequence` Module:** - Created `linear\firehub\Sequence`, isolating linear-sequential structures post refactor. - Emphasized predictable access while aligning with modern scalability goals. 4. **Better Autoloading Support in Enterprise Environment:** - Enhanced `Core-Enterprise/src/public/index.php` autoloader: - Added `classmap` and `compiled classmap` integration for optimized, layered dependency resolution. - Introduced handlers for namespace isolation and dependency-deduplication efficiency. **Key User Benefits:** - Simplified, composable behaviors for all FireHub data structures (`Countable`, `Enumerable`, etc.). - Unified and cleaner contract hierarchy streamlining developer onboarding. - Modular, future-proof linear processing APIs catering to high-demand applications. --- dist/core.min.phar | Bin 211694 -> 208577 bytes dist/core.phar | Bin 690581 -> 675048 bytes src/support/autoload/classmap.php | 13 +- .../loader/firehub.CompiledClassmap.php | 28 ++- .../contracts/firehub.DataStructure.php | 34 +--- .../abstract/firehub.ArrayCollection.php | 191 ------------------ .../behavior/firehub.Countable.php | 25 +++ .../behavior/firehub.Enumerable.php | 30 +++ .../capability/firehub.Transformable.php | 54 ----- .../contracts/firehub.Collection.php | 33 --- .../datastructure/firehub.ArrayCollection.php | 80 -------- src/support/datastructure/firehub.Linear.php | 30 +++ src/support/datastructure/firehub.Storage.php | 32 +++ .../datastructure/linear/firehub.Sequence.php | 87 ++++++++ .../storage/firehub.ArrStorage.php | 72 +++++++ .../traits/firehub.Convertable.php | 169 ---------------- .../traits/firehub.Enumerable.php | 31 --- .../datastructure/traits/firehub.Shared.php | 148 -------------- .../datastructure/ArrayCollectionTest.php | 183 ----------------- 19 files changed, 296 insertions(+), 944 deletions(-) delete mode 100644 src/support/datastructure/abstract/firehub.ArrayCollection.php create mode 100644 src/support/datastructure/behavior/firehub.Countable.php create mode 100644 src/support/datastructure/behavior/firehub.Enumerable.php delete mode 100644 src/support/datastructure/contracts/capability/firehub.Transformable.php delete mode 100644 src/support/datastructure/contracts/firehub.Collection.php delete mode 100644 src/support/datastructure/firehub.ArrayCollection.php create mode 100644 src/support/datastructure/firehub.Linear.php create mode 100644 src/support/datastructure/firehub.Storage.php create mode 100644 src/support/datastructure/linear/firehub.Sequence.php create mode 100644 src/support/datastructure/storage/firehub.ArrStorage.php delete mode 100644 src/support/datastructure/traits/firehub.Convertable.php delete mode 100644 src/support/datastructure/traits/firehub.Enumerable.php delete mode 100644 src/support/datastructure/traits/firehub.Shared.php delete mode 100644 tests/unit/support/datastructure/ArrayCollectionTest.php diff --git a/dist/core.min.phar b/dist/core.min.phar index 23858c6f9bf8709daf9c25491725784caf594221..5fa2819e47ad93f85d0e4863f6c2fddab50a5786 100644 GIT binary patch delta 3978 zcma)8d010d7S9ck1PCD^Bq3}*mLO3D}G~jsI6NaXQ)t6bhOpZym#+Q&|1H5^3U(P_x#Q|zjNNX_on9s z|8GC=YbV(Bs#vV%^;wIo=4`mVzH=B2&=&Y33Cz27~bLW z5#b3B3kbB0Me7P%Tymo=P6+H$(SDj8=GEC@-fcTvn45hxvgg>RBRph}{eH8@!ov7L zXup^rBHWyZnxv;OHA;-g6A)k!aSLC?}hq&e=T;q!U zx?HiJ#%&6!chj)ha3Bgw0C zfQ;LXHEbYqkar$|g|`w@&|2<=3tPb8J+DbK!#u^!m!ixbHd7|Rt{*bN2l_;5eG zUgwAH|MJ6aNF1Dt64P~!QulmIRf-ZTxj!?Jfj^d*>z{{8Y4O)0^itx8)kA&xcGvk?&G*^4|)MQeR6&^49I-$=n&QP5;0a1K*W8( zTR42OJ$W&wUAl zw?fJgFJ;6mgv}#L5Gq1(4_7hR9g5?O4#PuyAPkR@LpWZSG1w7afc(Qp&P1K#Qk@gr zdh-GXhRWc&a9cQSq$`;l4qP{=aErOBaO4oH3Pm_qg%5JGN`=H|{P`-{{OzZ|*dOCDBq`H-!XfI#+8_H#_ zb~9OO*`SP0j4^lM2{7{nt{;CUV12)$DgHTG@P~rQj#!{1WAgwP$+8qj*B(ah&H@rk z@#LT^kYpjy)sxB?FbI)w)#L*mP>{qpz@vjnnaz&vz=!UI;Qd~Z!BN0(AhYz(8$x#M z#oioT_xoN_^RAgC`k*`SI|$?-Z4u5iu3vaOAshJTN%f^BongARP)8(cP1;P8p|a3a zX(01E*=ln4Ng(AiLqT>l00~^2CGlxt6!F?xN&j1&)u#+7@Qudfk^GxRw^9RHZBi>1}@ZIE0V+nI+OC|5P3^d35=^KDM z8QTT~A}R@%F^s^GHWjd?sBZoLC8W}*BPJNMb94qH-GC^faJJTHB+TcE(3h0Y)|Kc= zO-4(e4-~?2V`Z={T1dYA8gNC74jtjkj0Bl+fO?y9E&!>-*Ho-G2E;IifS5vbHw=oB z!hlRi@~ajgAQ!a&IeE*O9f#^O&tXM?m4u8v4R?AqKTZT1Hz?LoXAL|)}N_?Wr8`Gdpob`Xz8Y z{Sv#btV-3o?WO?1sPo8XO+qRPXz$s!wqLZS4v1y-C3}r!$Mr zj(+uYT7zHLvk{YiLP!=FFp(Br(r-+yt$ZDG;TnH%d9?Y0Z6^5!c-ICIBbjk!9< zYhG-6iN}?I?s;{~INQs|8(m53uHgNxZI^33r)$2RSiUu`B|y-auwci-IL+vulA6dx zx1aWuiK%jjjaAPcw(rPmG+bwoN#0xJqC42ItZ8Awd6&w(Qyz(PE0y1E6|Q@f zAzka?{pfY*#=Hv+0iTFBwFHXhk#?JoXFrL!6K;6Xckx(%QAu(~*6EvHhS*4!URd>y zNVmCngZuZYUdl_h{q&a`HPaL3&O5kZ?=-`f-MnjRnI=omy)RBXV--|YJwN)hBhmNv zjeRB_EUw%+Hv96Gw0_O3q=>bulCJr6R<&C?6GJ6!7gyV|de<6y&ZktJBF0Zr&zTpO zdb4OnP~eE$FIS!ZHF@7T%}z%NTr=zFYNFkzaU1W& o*^cg?V(YhfeOWQ)VQ4^I$ofOVC59iXS=96BM7^0Q@oDk@1Cm@7wg3PC delta 5632 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 diff --git a/dist/core.phar b/dist/core.phar index fbe555acd8448783ffad718f475f6a0969e8506e..d19793a49b646ec401a3215ee779429892f99adc 100644 GIT binary patch delta 5898 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 delta 13956 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 diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index bc6d06af..dd311fcd 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -78,13 +78,12 @@ \FireHub\Core\Support\Bootstrap\Bootloader\RegisterHelpers::class => __DIR__.'/../../support/bootstrap/bootloader/firehub.RegisterHelpers.php', \FireHub\Core\Support\Bootstrap\FireHubConfigurator::class => __DIR__.'/../../support/bootstrap/firehub.FireHubConfigurator.php', \FireHub\Core\Support\Contracts\DataStructure::class => __DIR__.'/../../support/contracts/firehub.DataStructure.php', - \FireHub\Core\Support\DataStructure\Abstract\ArrayCollection::class => __DIR__.'/../../support/datastructure/abstract/firehub.ArrayCollection.php', - \FireHub\Core\Support\DataStructure\ArrayCollection::class => __DIR__.'/../../support/datastructure/firehub.ArrayCollection.php', - \FireHub\Core\Support\DataStructure\Contracts\Capability\Transformable::class => __DIR__.'/../../support/datastructure/contracts/capability/firehub.Transformable.php', - \FireHub\Core\Support\DataStructure\Contracts\Collection::class => __DIR__.'/../../support/datastructure/contracts/firehub.Collection.php', - \FireHub\Core\Support\DataStructure\Traits\Convertable::class => __DIR__.'/../../support/datastructure/traits/firehub.Convertable.php', - \FireHub\Core\Support\DataStructure\Traits\Enumerable::class => __DIR__.'/../../support/datastructure/traits/firehub.Enumerable.php', - \FireHub\Core\Support\DataStructure\Traits\Shared::class => __DIR__.'/../../support/datastructure/traits/firehub.Shared.php', + \FireHub\Core\Support\DataStructure\Behavior\Countable::class => __DIR__.'/../../support/datastructure/behavior/firehub.Countable.php', + \FireHub\Core\Support\DataStructure\Behavior\Enumerable::class => __DIR__.'/../../support/datastructure/behavior/firehub.Enumerable.php', + \FireHub\Core\Support\DataStructure\Linear::class => __DIR__.'/../../support/datastructure/firehub.Linear.php', + \FireHub\Core\Support\DataStructure\Linear\Sequence::class => __DIR__.'/../../support/datastructure/linear/firehub.Sequence.php', + \FireHub\Core\Support\DataStructure\Storage::class => __DIR__.'/../../support/datastructure/firehub.Storage.php', + \FireHub\Core\Support\DataStructure\Storage\ArrStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrStorage.php', \FireHub\Core\Support\LowLevel::class => __DIR__.'/../../support/firehub.LowLevel.php', \FireHub\Core\Support\LowLevel\Arr::class => __DIR__.'/../../support/lowlevel/firehub.Arr.php', \FireHub\Core\Support\LowLevel\CharMB::class => __DIR__.'/../../support/lowlevel/firehub.CharMB.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 67533ed8..2c5e3f86 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -244,32 +244,28 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/contracts/firehub.DataStructure.php'; return; - case \FireHub\Core\Support\DataStructure\Abstract\ArrayCollection::class: - require __DIR__.'/../../../support/datastructure/abstract/firehub.ArrayCollection.php'; + case \FireHub\Core\Support\DataStructure\Behavior\Countable::class: + require __DIR__.'/../../../support/datastructure/behavior/firehub.Countable.php'; return; - case \FireHub\Core\Support\DataStructure\ArrayCollection::class: - require __DIR__.'/../../../support/datastructure/firehub.ArrayCollection.php'; + case \FireHub\Core\Support\DataStructure\Behavior\Enumerable::class: + require __DIR__.'/../../../support/datastructure/behavior/firehub.Enumerable.php'; return; - case \FireHub\Core\Support\DataStructure\Contracts\Capability\Transformable::class: - require __DIR__.'/../../../support/datastructure/contracts/capability/firehub.Transformable.php'; + case \FireHub\Core\Support\DataStructure\Linear::class: + require __DIR__.'/../../../support/datastructure/firehub.Linear.php'; return; - case \FireHub\Core\Support\DataStructure\Contracts\Collection::class: - require __DIR__.'/../../../support/datastructure/contracts/firehub.Collection.php'; + case \FireHub\Core\Support\DataStructure\Linear\Sequence::class: + require __DIR__.'/../../../support/datastructure/linear/firehub.Sequence.php'; return; - case \FireHub\Core\Support\DataStructure\Traits\Convertable::class: - require __DIR__.'/../../../support/datastructure/traits/firehub.Convertable.php'; + case \FireHub\Core\Support\DataStructure\Storage::class: + require __DIR__.'/../../../support/datastructure/firehub.Storage.php'; return; - case \FireHub\Core\Support\DataStructure\Traits\Enumerable::class: - require __DIR__.'/../../../support/datastructure/traits/firehub.Enumerable.php'; - return; - - case \FireHub\Core\Support\DataStructure\Traits\Shared::class: - require __DIR__.'/../../../support/datastructure/traits/firehub.Shared.php'; + case \FireHub\Core\Support\DataStructure\Storage\ArrStorage::class: + require __DIR__.'/../../../support/datastructure/storage/firehub.ArrStorage.php'; return; case \FireHub\Core\Support\LowLevel::class: diff --git a/src/support/contracts/firehub.DataStructure.php b/src/support/contracts/firehub.DataStructure.php index fe194fae..8a43c8f8 100644 --- a/src/support/contracts/firehub.DataStructure.php +++ b/src/support/contracts/firehub.DataStructure.php @@ -13,14 +13,8 @@ namespace FireHub\Core\Support\Contracts; -use FireHub\Core\Shared\Contracts\ { - Countable, IteratorAggregate -}; - -use const FireHub\Core\Shared\Constants\Number\MAX; - /** - * ### Data structures Contract + * ### Data structure Contract * * Defines a generic, type-safe contract for all high-level data structures in FireHub.
* Supports iteration, array conversion, serialization, and common utility operations, ensuring consistency across @@ -29,29 +23,5 @@ * * @template TKey * @template TValue - * - * @extends \FireHub\Core\Shared\Contracts\IteratorAggregate */ -interface DataStructure extends Countable, IteratorAggregate { - - /** - * ### Call a user-generated function on each item in the data structure - * @since 1.0.0 - * - * @uses \FireHub\Core\Shared\Constants\Number\MAX As default limit. - * @uses \FireHub\Core\Shared\Enums\ControlFlow\Signal::BREAK As signal. - * - * @param callable(TValue, TKey):(\FireHub\Core\Shared\Enums\ControlFlow\Signal::BREAK|\FireHub\Core\Shared\Enums\ControlFlow\Signal::CONTINUE) $callback

- * Function to call on each item in a data structure.
- * Return `Signal::BREAK` to stop iteration early. - * Return `Signal::CONTINUE` to continue iteration. - *

- * @param positive-int $limit [optional]

- * Maximum number of elements that is allowed to be iterated. - *

- * - * @return static This data structure. - */ - public function each (callable $callback, int $limit = MAX):static; - -} \ No newline at end of file +interface DataStructure {} \ No newline at end of file diff --git a/src/support/datastructure/abstract/firehub.ArrayCollection.php b/src/support/datastructure/abstract/firehub.ArrayCollection.php deleted file mode 100644 index acd62e7b..00000000 --- a/src/support/datastructure/abstract/firehub.ArrayCollection.php +++ /dev/null @@ -1,191 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 8.4 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Abstract; - -use FireHub\Core\Support\DataStructure\Contracts\Collection; -use FireHub\Core\Support\DataStructure\Contracts\Capability\Transformable; -use FireHub\Core\Shared\Contracts\ { - Magic\SerializableConvertable, ArrayConvertable, JsonSerializableConvertable -}; -use FireHub\Core\Support\DataStructure\Traits\ { - Convertable, Enumerable, Shared -}; -use Traversable; - -/** - * ### Abstract Array-Backed Collection Base - * - * Provides a base implementation for collections backed by a native array storage. It defines the core behavior for - * iteration, internal storage handling, and shared collection operations, while leaving concrete instantiation - * details to child classes. - * - * This abstract class serves as the foundational layer for array-based data structures within the FireHub ecosystem, - * enabling consistent behavior across derived implementations such as lists, maps, and specialized collections. - * @since 1.0.0 - * - * @template TKey of array-key - * @template TValue - * - * @implements \FireHub\Core\Support\DataStructure\Contracts\Collection - * @implements \FireHub\Core\Shared\Contracts\ArrayConvertable - * @implements \FireHub\Core\Shared\Contracts\JsonSerializableConvertable - * @implements \FireHub\Core\Shared\Contracts\Magic\SerializableConvertable - * @implements \FireHub\Core\Support\DataStructure\Contracts\Capability\Transformable - * - * @phpstan-consistent-constructor - */ -abstract class ArrayCollection implements Collection, ArrayConvertable, JsonSerializableConvertable, - SerializableConvertable, Transformable { - - /** - * ### Shared Operations for All Data Structures - * @since 1.0.0 - * - * @use \FireHub\Core\Support\DataStructure\Traits\Shared - */ - use Shared; - - /** - * ### Enumerable – Shared Iteration and Transformation Behavior - * @since 1.0.0 - * - * @use \FireHub\Core\Support\DataStructure\Traits\Enumerable - */ - use Enumerable; - - /** - * ### Convertable Trait - * @since 1.0.0 - * - * @use \FireHub\Core\Support\DataStructure\Traits\Convertable - */ - use Convertable; - - /** - * ### Constructor - * @since 1.0.0 - * - * @param array $storage [optional]

- * Underlying storage data. - *

- * - * @retrun void - */ - public function __construct ( - protected(set) array $storage = [] - ) {} - - /** - * {@inheritDoc} - * - * @since 1.0.0 - * - * @template TArray of array - * - * @param TArray $array

- * Input data for creating the object. - *

- * - * @return static, value-of> A new instance of the implementing class. - */ - abstract public static function fromArray (array $array):static; - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructures\ArrayCollection; - * - * $collection = new ArrayCollection(['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]); - * - * $collection->toArray(); - * - * // ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] - * - * - * @since 1.0.0 - */ - public function toArray ():array { - - return $this->storage; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function map (callable $callback):static { - - $storage = []; - - foreach ($this->storage as $key => $value) $storage[$key] = $callback($value, $key); - - return new static($storage); - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function jsonSerialize ():array { - - return $this->storage; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function getIterator ():Traversable { - - yield from $this->storage; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @return array An associative array of key/value pairs that represent the serialized form - * of the object. - */ - public function __serialize ():array { - - return $this->storage; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @param array $data

- * Serialized data. - *

- */ - public function __unserialize (array $data):void { - - $this->storage = $data; - - } - -} \ No newline at end of file diff --git a/src/support/datastructure/behavior/firehub.Countable.php b/src/support/datastructure/behavior/firehub.Countable.php new file mode 100644 index 00000000..7f3447f5 --- /dev/null +++ b/src/support/datastructure/behavior/firehub.Countable.php @@ -0,0 +1,25 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Behavior; + +use FireHub\Core\Shared\Contracts\Countable as CountableContract; + +/** + * ### Countable Behavior Contract + * + * Defines the ability to determine the number of elements within a structure. Ensures that the structure can provide + * a consistent and reliable size or element count at any given time. + * @since 1.0.0 + */ +interface Countable extends CountableContract {} \ No newline at end of file diff --git a/src/support/datastructure/behavior/firehub.Enumerable.php b/src/support/datastructure/behavior/firehub.Enumerable.php new file mode 100644 index 00000000..a04c7bcc --- /dev/null +++ b/src/support/datastructure/behavior/firehub.Enumerable.php @@ -0,0 +1,30 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Behavior; + +use FireHub\Core\Shared\Contracts\IteratorAggregate; + +/** + * ### Enumerable Behavior Contract + * + * Defines the ability to iterate over all elements in a structure. Provides higher-level traversal operations such + * as mapping, filtering, and transformation, typically built on top of a traversal mechanism. + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @extends \FireHub\Core\Shared\Contracts\IteratorAggregate + */ +interface Enumerable extends IteratorAggregate {} \ No newline at end of file diff --git a/src/support/datastructure/contracts/capability/firehub.Transformable.php b/src/support/datastructure/contracts/capability/firehub.Transformable.php deleted file mode 100644 index c1977bed..00000000 --- a/src/support/datastructure/contracts/capability/firehub.Transformable.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Contracts\Capability; - -/** - * ### Transformable Data Structure Capability - * - * Provides a functional transformation contract for data structures, enabling value-level operations such as mapping - * and reduction without altering the underlying structural semantics.
- * This capability focuses on immutable-style transformations, where operations produce derived results or new - * instances rather than mutating the original structure. It is designed to be composable across different - * data structure types, including collections, graphs, and other iterable forms, as long as a deterministic - * traversal can be established.
- * Transformable represents the foundational layer of data processing within the FireHub ecosystem, serving as the basis - * for higher-level operations such as filtering, partitioning, and pipeline composition. - * @since 1.0.0 - * - * @template TKey - * @template TValue - */ -interface Transformable { - - /** - * ### Map Values Transformation - * - * Transforms each element of the data structure by applying the given callback and returns a new instance - * containing the transformed values. The original structure remains unchanged.
- * This operation preserves the structural shape (e.g., order and keys, where applicable) while modifying only the - * values. It represents a fundamental, immutable transformation used as the basis for higher-level data processing - * operations. - * @since 1.0.0 - * - * @template TReturnValue - * - * @param callable(TValue, TKey):TReturnValue $callback

- * A callback function that takes the value and key of each element and returns a transformed value. - *

- * - * @return static A new instance of the same type containing the mapped values. - */ - public function map (callable $callback):static; - -} \ No newline at end of file diff --git a/src/support/datastructure/contracts/firehub.Collection.php b/src/support/datastructure/contracts/firehub.Collection.php deleted file mode 100644 index accc17eb..00000000 --- a/src/support/datastructure/contracts/firehub.Collection.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Contracts; - -use FireHub\Core\Support\Contracts\DataStructure; - -/** - * ### Collection Contract - * - * Represents the core contract for all linear, iterable data structures in FireHub.
- * This interface defines the minimal operations that all Collections should implement, serving as the foundation for - * feature-rich Professional and Enterprise collections. - * @since 1.0.0 - * - * @template TKey - * @template TValue - * - * @extends \FireHub\Core\Support\Contracts\DataStructure - */ -interface Collection extends DataStructure { - -} \ No newline at end of file diff --git a/src/support/datastructure/firehub.ArrayCollection.php b/src/support/datastructure/firehub.ArrayCollection.php deleted file mode 100644 index f1d8e276..00000000 --- a/src/support/datastructure/firehub.ArrayCollection.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 8.4 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure; - -use FireHub\Core\Support\DataStructure\Abstract\ArrayCollection as AbstractArrayCollection; - -/** - * ### Concrete Array-Based Collection Implementation - * - * Represents a concrete collection implementation backed by a native array, providing a general-purpose, ready-to-use - * data structure with full support for collection operations. - * - * It extends the abstract array-backed base and exposes a complete, consistent API for working with ordered or - * key-based data, making it the default implementation for most use cases within the FireHub framework. - * @since 1.0.0 - * - * @template TKey of array-key - * @template TValue - * - * @extends \FireHub\Core\Support\DataStructure\Abstract\ArrayCollection - */ -class ArrayCollection extends AbstractArrayCollection { - - /** - * ### Constructor - * @since 1.0.0 - * - * @param array $storage [optional]

- * Underlying storage data. - *

- * - * @retrun void - */ - final public function __construct ( - array $storage = [] - ) { - - parent::__construct($storage); - - } - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructures\ArrayCollection; - * - * $collection = ArrayCollection::fromArray(['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]); - * - * // ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] - * - * - * @since 1.0.0 - * - * @template TArray of array - * - * @param TArray $array

- * Input data for creating the object. - *

- * - * @return static, value-of> A new instance of the implementing class. - */ - public static function fromArray (array $array):static { - - return new static($array); - - } - -} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Linear.php b/src/support/datastructure/firehub.Linear.php new file mode 100644 index 00000000..1aea6985 --- /dev/null +++ b/src/support/datastructure/firehub.Linear.php @@ -0,0 +1,30 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure; + +use FireHub\Core\Support\Contracts\DataStructure; + +/** + * ### Linear Data Structure + * + * Defines data structures where elements are arranged in a strict linear sequence. Each element has a clear + * predecessor and successor (except boundaries), enabling predictable traversal, ordered processing, and sequential + * access patterns. + * @since 1.0.0 + * + * @template TValue + * + * @extends \FireHub\Core\Support\Contracts\DataStructure + */ +interface Linear extends DataStructure {} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Storage.php b/src/support/datastructure/firehub.Storage.php new file mode 100644 index 00000000..ec481cde --- /dev/null +++ b/src/support/datastructure/firehub.Storage.php @@ -0,0 +1,32 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure; + +use FireHub\Core\Support\DataStructure\Behavior\ { + Countable, Enumerable +}; + +/** + * ### Storage Abstraction Layer + * + * Root contract for all storage implementations in the system. Defines the base rules for how data is persisted, + * accessed, and managed regardless of the underlying memory model (array, linked, generator, or external source). + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Behavior\Enumerable + */ +interface Storage extends Countable, Enumerable {} \ No newline at end of file diff --git a/src/support/datastructure/linear/firehub.Sequence.php b/src/support/datastructure/linear/firehub.Sequence.php new file mode 100644 index 00000000..08ed920b --- /dev/null +++ b/src/support/datastructure/linear/firehub.Sequence.php @@ -0,0 +1,87 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Linear; + +use FireHub\Core\Support\DataStructure\ { + Linear, Storage +}; +use FireHub\Core\Support\DataStructure\Behavior\ { + Countable, Enumerable +}; +use Traversable; + +/** + * ### Sequence Data Structure + * + * A fundamental linear structure that maintains a strict ordering of elements. Provides predictable iteration, stable + * indexing (depending on storage), and serves as a base abstraction for other linear collections. + * @since 1.0.0 + * + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Linear + * @implements \FireHub\Core\Support\DataStructure\Behavior\Enumerable + */ +class Sequence implements Linear, Countable, Enumerable { + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage As parameter. + * + * @param \FireHub\Core\Support\DataStructure\Storage $storage

+ * Underlying storage data. + *

+ * + * @return void + */ + public function __construct ( + protected Storage $storage + ) {} + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructure\Linear\Sequence; + * use FireHub\Core\Support\DataStructure\Storage\ArrStorage; + * + * $collection = new Sequence(new ArrStorage(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'])); + * + * // ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] + * + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage::count() To count the number of elements in the sequence. + */ + public function count ():int { + + return $this->storage->count(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function getIterator ():Traversable { + + return $this->storage; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.ArrStorage.php b/src/support/datastructure/storage/firehub.ArrStorage.php new file mode 100644 index 00000000..033bb168 --- /dev/null +++ b/src/support/datastructure/storage/firehub.ArrStorage.php @@ -0,0 +1,72 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage; + +use FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Support\LowLevel\Arr; +use Traversable; + +/** + * ### Array-Based Storage + * + * In-memory storage implementation based on contiguous array structures. Provides fast sequential and random access + * with predictable performance characteristics. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Storage + */ +class ArrStorage implements Storage { + + /** + * ### Constructor + * @since 1.0.0 + * + * @param array $data

+ * Initial data to store. + *

+ * + * @return void + */ + public function __construct ( + protected array $data = [] + ) {} + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::count() To count the number of elements in the array. + */ + public function count ():int { + + return Arr::count($this->data); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function getIterator ():Traversable { + + yield from $this->data; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/traits/firehub.Convertable.php b/src/support/datastructure/traits/firehub.Convertable.php deleted file mode 100644 index 64f3e41c..00000000 --- a/src/support/datastructure/traits/firehub.Convertable.php +++ /dev/null @@ -1,169 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Traits; - -use FireHub\Core\Shared\Enums\Json\ { - Flag, Flag\Encode, Flag\Decode -}; -use FireHub\Core\Throwable\Error\LowLevel\Data\UnserializeFailedError; -use FireHub\Core\Support\LowLevel\ { - Data, DataIs, Json -}; - -/** - * ### Convertable Trait - * - * A reusable trait that enables bidirectional conversion of data structures to and from array, JSON, and serialized - * formats.
- * It acts as a bridge between high-level data structures and low-level serialization mechanisms, ensuring consistent - * encoding/decoding behavior across the system. - * @since 1.0.0 - * - * @template TKey - * @template TValue - */ -trait Convertable { - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - abstract public static function fromArray (array $array):static; - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructures\Collection; - * - * $collection = Collection::fromJson('["John","Jane","Jane","Jane","Richard","Richard"]'); - * - * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] - * - * - * @since 1.0.0 - * - * @uses static::fromArray To create a data structure from an array. - * @uses \FireHub\Core\Support\LowLevel\DataIs::array To check if decoded JSON data is an array. - * @uses \FireHub\Core\Support\LowLevel\JSON::decode() To decode $json data. - * - * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\DecodeError If JSON decoding throws an error. - * - * @return static - * - * @note Method already includes Flag::JSON_THROW_ON_ERROR. - */ - public static function fromJson (string $json, int $depth = 512, Flag|Decode ...$flags):static { - - /** @var static */ - return static::fromArray( - DataIs::array($data = JSON::decode($json, true, $depth, ...$flags)) - ? $data : [] - ); - - } - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructures\Collection; - * - * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $collection->toJson(); - * - * // '["John","Jane","Jane","Jane","Richard","Richard"]' - * - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Json::encode() As JSON representation of an object. - * - * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\EncodeError If JSON encoding throws an error. - * - * @note Method already includes Flag::JSON_THROW_ON_ERROR. - */ - public function toJson (int $depth = 512, Flag|Encode ...$flags):string { - - return Json::encode($this, $depth, ...$flags); - - } - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructures\Collection; - * - * $collection = new Collection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $collection->serialize(); - * - * // serialized collection class - * - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Data::serialize() To generate a storable representation of an object. - * - * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\CannotSerializeError If try to serialize an anonymous class, - * function, or resource. - * - * @note This is a binary string that may include null bytes and needs to be stored and handled as such. - * For example, Data::serialize() output should generally be stored in a BLOB field in a database, rather than - * a CHAR or TEXT field. - */ - public function serialize ():string { - - return Data::serialize($this); - - } - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructures\Collection; - * - * Collection::unserialize( //serialized collection class); - * - * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] - * - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Data::unserialize() To create an object from a stored representation. - * - * @throws \FireHub\Core\Shared\Contracts\Throwable - * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\UnserializeFailedError If couldn't unserialize data, $data is - * already false, $data is NULL, or $data is not from this class. - * - * @return static - */ - public static function unserialize (string $data, int $max_depth = 4096):static { - - /** @var static */ - return ($data = Data::unserialize($data, true, $max_depth)) instanceof static - ? $data : throw UnserializeFailedError::builder() - ->withContext([ - 'excepted_class' => static::class, - 'data' => $data - ]) - ->build(); - - } - -} \ No newline at end of file diff --git a/src/support/datastructure/traits/firehub.Enumerable.php b/src/support/datastructure/traits/firehub.Enumerable.php deleted file mode 100644 index 0bcde9b8..00000000 --- a/src/support/datastructure/traits/firehub.Enumerable.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Traits; - -/** - * ### Enumerable – Shared Iteration and Transformation Behavior - * - * Provides a reusable implementation of common iteration and transformation methods for data structures. - * This trait includes high-level operations, allowing consistent element-wise processing across different - * implementations.
- * It is designed to be used by data structures that expose sequential access to their elements (e.g., Collection, - * LazyCollection), reducing duplication and ensuring a uniform API without enforcing a strict contract. - * @since 1.0.0 - * - * @template TKey - * @template TValue - */ -trait Enumerable { - -} \ No newline at end of file diff --git a/src/support/datastructure/traits/firehub.Shared.php b/src/support/datastructure/traits/firehub.Shared.php deleted file mode 100644 index 1c1f8f77..00000000 --- a/src/support/datastructure/traits/firehub.Shared.php +++ /dev/null @@ -1,148 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Traits; - -use FireHub\Core\Support\LowLevel\Iterator; -use FireHub\Core\Shared\Enums\ControlFlow\Signal; -use FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException; - -use const FireHub\Core\Shared\Constants\Number\MAX; - -/** - * ### Shared Operations for All Data Structures - * - * A reusable trait providing common methods for all data structures, including element counting, emptiness checks, - * key/value access, iteration, and conversion from other data structures. Designed to standardize shared behavior - * across both linear and non-linear collections while minimizing code duplication. - * @since 1.0.0 - * - * @template TKey - * @template TValue - */ -trait Shared { - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructures\Collection; - * - * $collection = new ArrayCollection(['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]); - * - * $collection->count(); - * - * // 4 - * - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Iterator::count() To count storage items. - */ - public function count ():int { - - return Iterator::count($this); - - } - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructures\ArrayCollection; - * - * $collection = new ArrayCollection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $called = []; - * $collection->each( - * function ($value, $key):Signal { - * $called[] = $value; - * return Signal::CONTINUE; - * }); - * - * print $called; - * - * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] - * - * - * You can limit the number of elements: - * - * use FireHub\Core\Support\DataStructures\ArrayCollection; - * - * $collection = new ArrayCollection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $called = []; - * $collection->each( - * function ($value, $key):Signal { - * $called[] = $value; - * return Signal::CONTINUE; - * }, limit: 2); - * - * print $called; - * - * // ['John', 'Jane'] - * - * - * You can also stop at any time with returning Signal::BREAK: - * - * use FireHub\Core\Support\DataStructures\ArrayCollection; - * use FireHub\Core\Shared\Enums\ControlFlow\Signal; - * - * $collection = new ArrayCollection(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $called = []; - * $collection->each( - * function ($value, $key):Signal { - * if ($value === 'Richard') return Signal::BREAK; - * echo $value.','; - * return Signal::CONTINUE; - * }); - * - * print $called; - * - * // ['John', 'Jane', 'Jane', 'Jane'] - * - * - * @throws \FireHub\Core\Shared\Contracts\Throwable - * @throws \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException If the callback returns - * an invalid signal. - * - * @since 1.0.0 - */ - public function each (callable $callback, int $limit = MAX):static { - - $counter = 0; - - foreach ($this as $key => $value) { - - if ($counter >= $limit) break; - - $signal = $callback($value, $key); - - $counter++; - - if ($signal === Signal::BREAK) break; - if ($signal === Signal::CONTINUE) continue; - throw WrongReturnTypeException::builder() - ->withContext([ - 'type' => $signal - ]) - ->build(); - - } - - return $this; - - } - -} \ No newline at end of file diff --git a/tests/unit/support/datastructure/ArrayCollectionTest.php b/tests/unit/support/datastructure/ArrayCollectionTest.php deleted file mode 100644 index 16d05897..00000000 --- a/tests/unit/support/datastructure/ArrayCollectionTest.php +++ /dev/null @@ -1,183 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @package Core\Test - */ - -namespace FireHub\Tests\Unit\Support\DataStructure; - -use FireHub\Core\Testing\Base; -use FireHub\Core\Support\DataStructure\ArrayCollection; -use FireHub\Core\Shared\Enums\ControlFlow\Signal; -use FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException; -use PHPUnit\Framework\Attributes\ { - CoversClass, Group, Small, TestWith -}; - -/** - * ### Test High-level, Eager Array-based Data Structure - * @since 1.0.0 - */ -#[Small] -#[Group('support')] -#[CoversClass(ArrayCollection::class)] -final class ArrayCollectionTest extends Base { - - /** - * @since 1.0.0 - * - * @param array $array - * - * @return void - */ - #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] - public function testFromArray (array $array):void { - - self::assertEquals(new ArrayCollection($array), ArrayCollection::fromArray($array)); - - } - - /** - * @since 1.0.0 - * - * @param int $expected - * @param array $array - * - * @return void - */ - #[TestWith([4, ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] - public function testCount (int $expected, array $array):void { - - self::assertSame($expected, new ArrayCollection($array)->count()); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @return void - */ - #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] - public function testToArray (array $array):void { - - self::assertSame($array, new ArrayCollection($array)->toArray()); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @throws \FireHub\Core\Shared\Contracts\Throwable - * @throws \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException - * - * @return void - */ - #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testEach (array $array):void { - - $collection = new ArrayCollection($array); - - $called = []; - $collection->each(function ($value, $key) use (&$called):Signal { - $called[] = $value; - return Signal::CONTINUE; - }); - - self::assertSame(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'], $called); - - $called = []; - $collection->each(function ($value, $key) use (&$called):Signal { - if ($value === 'Richard') return Signal::BREAK; - $called[] = $value; - return Signal::CONTINUE; - }, limit: 2); - - self::assertSame(['John', 'Jane'], $called); - - $called = []; - $collection->each(function ($value, $key) use (&$called):Signal { - if ($value === 'Richard') return Signal::BREAK; - $called[] = $value; - return Signal::CONTINUE; - }); - - self::assertSame(['John', 'Jane', 'Jane', 'Jane'], $called); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @throws \FireHub\Core\Shared\Contracts\Throwable - * - * @return void - */ - #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testEachFillOutOfRangeWithNegativeNumber (array $array):void { - - $this->expectException(WrongReturnTypeException::class); - - $called = []; - new ArrayCollection($array)->each(function ($value, $key) use (&$called) { - if ($value === 'Richard') return false; - $called[] = $value; - return Signal::CONTINUE; - }); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\EncodeError - * @throws \FireHub\Core\Throwable\Error\LowLevel\Json\DecodeError - * - * @return void - */ - #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] - public function testJson (array $array):void { - - $collection = new ArrayCollection($array); - - $json = $collection->toJson(); - - self::assertSame('{"firstname":"John","lastname":"Doe","age":25,"10":2}', $json); - self::assertEquals($collection, ArrayCollection::fromJson($json)); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @throws \FireHub\Core\Shared\Contracts\Throwable - * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\UnserializeFailedError - * @throws \FireHub\Core\Throwable\Error\LowLevel\Data\CannotSerializeError - * - * @return void - */ - #[TestWith([['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2]])] - public function testSerialize (array $array):void { - - $collection = new ArrayCollection($array); - - self::assertEquals($collection, $collection::unserialize($collection->serialize())); - - } - -} \ No newline at end of file From c352f4609dac8c2bfa6ac644bdd367cf2eff6755 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 14 Apr 2026 13:35:12 +0200 Subject: [PATCH 47/79] Introduce `GeneratorStorage` and enhance data structure hierarchy. **Detailed Description:** 1. **New `GeneratorStorage` Implementation:** - Added `GeneratorStorage` class to facilitate lazy, generator-based data storage, ideal for streaming large or infinite datasets. - Implemented key methods: `entries()`, `keys()`, `values()` for efficient data access via generators. - Integrated into the `Storage` abstraction layer and relevant autoload classmaps. 2. **Updates to `Storage` Interface:** - Refactored the `Storage` contract to directly define `entries()`, `keys()`, and `values()` methods, removing legacy behavior dependencies (`Countable`, `Enumerable`). - Enhanced overall modularity and data access capabilities. 3. **Enhancements to Sequential `Sequence` Class:** - Updated `Sequence` to leverage the improved `Storage` abstraction and the new `Iterator` utilities for counting and traversing elements. - Refactored to ensure compatibility with generator-based storages for sequential data. 4. **Unit Tests for Coverage:** - Created unit test files for `GeneratorStorage` and `ArrStorage` to validate their functionality: - Tests for `entries()`, `keys()`, `values()`. - Integration with `Sequence` verified through `SequenceTest`. - Ensured accurate test coverage with parameterized data across edge cases. 5. **Autoload and Classmap Updates:** - Registered `GeneratorStorage` in the `classmap` and `compiled classmap` for optimized dependency loading. **Key Benefits:** - Establishes new lazy storage options via `GeneratorStorage` for scalable, memory-efficient operations. - Strengthens the FireHub ecosystem's modularity and extensibility for data persistence structures. - Backward-compatible with existing abstractions while enabling advanced usage scenarios. --- dist/core.min.phar | Bin 208577 -> 209693 bytes dist/core.phar | Bin 675048 -> 678813 bytes src/support/autoload/classmap.php | 1 + .../loader/firehub.CompiledClassmap.php | 4 + src/support/datastructure/firehub.Linear.php | 2 +- src/support/datastructure/firehub.Storage.php | 34 ++++-- .../datastructure/linear/firehub.Sequence.php | 16 ++- .../storage/firehub.ArrStorage.php | 24 +++- .../storage/firehub.GeneratorStorage.php | 103 ++++++++++++++++++ .../datastructure/linear/SequenceTest.php | 46 ++++++++ .../datastructure/storage/ArrStorageTest.php | 80 ++++++++++++++ .../storage/GeneratorStorageTest.php | 90 +++++++++++++++ 12 files changed, 380 insertions(+), 20 deletions(-) create mode 100644 src/support/datastructure/storage/firehub.GeneratorStorage.php create mode 100644 tests/unit/support/datastructure/linear/SequenceTest.php create mode 100644 tests/unit/support/datastructure/storage/ArrStorageTest.php create mode 100644 tests/unit/support/datastructure/storage/GeneratorStorageTest.php diff --git a/dist/core.min.phar b/dist/core.min.phar index 5fa2819e47ad93f85d0e4863f6c2fddab50a5786..8744f43d787a0a44ac552b5eb55bf3a5958f8b88 100644 GIT binary patch delta 3362 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 delta 2875 zcmZWqYgAKL7AE&5Bw$_;-XSD_F#*Fs9X6nUHu zM+L2-ZPB($ts14{DB6x%m#x?qd<{fftF>y>sWXm_IyYytR%fmGao3l<&$svf_CEXG z?63sg-4@ijg!3rQ!Qn_(eiPl$J=S$iV+Z8KQWK0~1raP|%_8_7E1uvDRw6+^YA&DQ zSNw(T;BcpH?OoKxk)Q{(E6z!z1l&;C!NHzwAC*AZ_o#Hju4C9Y3eTTFERGC6I!yU; zH{rxz0D2o3oq>?C66vF8!&XD=rBj6IiN5+{{l8wdDbaZ-pacAQC2=Lr5z$1Gw` zIHnT};zB^b@oQhJPEqO;}gOi9ta3^ znnUbWPSENhCn(5r&LIA5XW+f-47@RCXiPd~HaRbxq9ge66o`8<1%yTO!-;>y2w~Kxg`mVy zG@qO=7J<_3qHJQ{6M?ds;@RSExX=naK5j0mKyBh^@%c%o9h066WTT4=^CS;s*zt%& ze+ESe+)${CMqKI$2X_1+W#&nA%0)x!*j%Css$8`M%UoxX(RaEq0hfkjP?c+tU~zJ2 z?TXqK0m*@Gx{p)$RI+-&xt}MX-V^q*-!pz2J$izeBlMxljEI7?0w#Pf;^v6f-8Lr2%hsPBB++W zK{9{LWH#mQtwa-^%AS>!ntO`wP6_7+lrV0=G_b3u zEhW8nGWp{dr7uOD5lXZ`<%z@1OuxO8RRdHIwLt~dCsa@+UR_L7^r{U6U#lT&Nf4Y5 z1^t%Yd}eA6N(!-Omta8)CE~VCX0HrhLZXL*L9@^Fa$;|o4)(R_P+hBmG3{mIiut2m z=#eH8`@BtwkX6Gb5qC83PRE5n#*Prka5n_>q=bUry`gZ!?=zXw8@KkMS5uWJJPiID z3d3N5FmpKLbpLH~iDC^c!XK$VZit2W+p#gk_KS-mm>UN#Gm48N_SbRn(u=iVXKIQ4R=c*fUCXkx zYpEao@SF^qXK~4=uA1TJ`K#0~A8@KG))>o?&Fo_tX{L{|aJGxH3li&j*w#wNTUs{K zi&@>hGHlJI)act*SCrE$P%f@F)ftu>6~;C7#+vfgiWE~rO}$}Rl~JQet7)h<*4cks zPOhbUSUsbZBW`b{ccJV1d@a9gqpMh!*tcmO%aZXYnx>KqRc}_*t*);zR2x-_*$E2O zeA9{=l}4eeGW@SM)nv3gnWBUh8Ld%7gxmR%ML4^iF2JTd$_szqPA8(Qt)3{Xg^#

gWQmWGP_PSb~!}L@nA76!-*wyFpBFE;o%P28=2+^xszOrLF$~t!n>O2 zMR@QXnuo1h>3D4IqNlPORvQ(h8P{%ljKYuHokQ`i>s$^VYNx~SsgrC+6tG_Yn*=$g zIUG_M2V+`_6^Cf?|5u;RE;rO0>}40SkTu?|Rnbo~51V;7%;U&BT;}0f6#Y)CEar-{ zZ@KdC_y;=6Ivze-=-rdGJ2L8Mz-V{ztkEK=Be|@a2D`_egqpqOr7^ zmzvu9Ytx(BLw`GXGgiI(UAcVQ_=EB4Ef;moX~ma?C63n@Zt7e<7$2UZFHXG`)uH{D z|Jk!GIRh>m8=mGB9(d)OXI;~G`gQ@;9BfWqYkIQ%mhaP%%>IhdowmyO{@PCtmTq3Y zdH#LxFw>yV#+SE+R~s|w?~i;|EcBR`a#(1ir?rUxbENURYZK!yGIn}D8@aDDUmhD9 z4cL?_imkn0CTR*2$>a7cUwLM2{lVsjiOnx6b8;W2?Kr&Ug70nPhGS9s?>26GUUtQ^f1Y$5t7Ji7 z1xO;#oIln-6}rm7>O_Its;f~LpM zofP}msB@k;?|hxVhNEvfY8^LcUK&mo{`pzxI+;1GS&_S7*(Vy?wS6|_jf8&pJ=`Vw zV?kDJH+AkGm0wCVo5p9f57i~U^OO6Iz^vI>&*wziUS@}^Um~76T%miSOEdo4_{|CT zW4fPy-E}`DC;dU;qdnb6_gWfuZY(MXrBFohN cnB}{yD}A9@94GLTJ20OeR|n=Zn4F#bUn>fNc>n+a diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index dd311fcd..42fe8c10 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -84,6 +84,7 @@ \FireHub\Core\Support\DataStructure\Linear\Sequence::class => __DIR__.'/../../support/datastructure/linear/firehub.Sequence.php', \FireHub\Core\Support\DataStructure\Storage::class => __DIR__.'/../../support/datastructure/firehub.Storage.php', \FireHub\Core\Support\DataStructure\Storage\ArrStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrStorage.php', + \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.GeneratorStorage.php', \FireHub\Core\Support\LowLevel::class => __DIR__.'/../../support/firehub.LowLevel.php', \FireHub\Core\Support\LowLevel\Arr::class => __DIR__.'/../../support/lowlevel/firehub.Arr.php', \FireHub\Core\Support\LowLevel\CharMB::class => __DIR__.'/../../support/lowlevel/firehub.CharMB.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 2c5e3f86..24034d53 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -268,6 +268,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/storage/firehub.ArrStorage.php'; return; + case \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::class: + require __DIR__.'/../../../support/datastructure/storage/firehub.GeneratorStorage.php'; + return; + case \FireHub\Core\Support\LowLevel::class: require __DIR__.'/../../../support/firehub.LowLevel.php'; return; diff --git a/src/support/datastructure/firehub.Linear.php b/src/support/datastructure/firehub.Linear.php index 1aea6985..0978db7c 100644 --- a/src/support/datastructure/firehub.Linear.php +++ b/src/support/datastructure/firehub.Linear.php @@ -25,6 +25,6 @@ * * @template TValue * - * @extends \FireHub\Core\Support\Contracts\DataStructure + * @extends \FireHub\Core\Support\Contracts\DataStructure */ interface Linear extends DataStructure {} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Storage.php b/src/support/datastructure/firehub.Storage.php index ec481cde..c33d9b35 100644 --- a/src/support/datastructure/firehub.Storage.php +++ b/src/support/datastructure/firehub.Storage.php @@ -13,10 +13,6 @@ namespace FireHub\Core\Support\DataStructure; -use FireHub\Core\Support\DataStructure\Behavior\ { - Countable, Enumerable -}; - /** * ### Storage Abstraction Layer * @@ -26,7 +22,31 @@ * * @template TKey * @template TValue - * - * @extends \FireHub\Core\Support\DataStructure\Behavior\Enumerable */ -interface Storage extends Countable, Enumerable {} \ No newline at end of file +interface Storage { + + /** + * ### Get all entries from the storage + * @since 1.0.0 + * + * @return iterable + */ + public function entries ():iterable; + + /** + * ### Get all keys from the storage + * @since 1.0.0 + * + * @return iterable + */ + public function keys ():iterable; + + /** + * ### Get all values from the storage + * @since 1.0.0 + * + * @return iterable + */ + public function values ():iterable; + +} \ No newline at end of file diff --git a/src/support/datastructure/linear/firehub.Sequence.php b/src/support/datastructure/linear/firehub.Sequence.php index 08ed920b..879950ea 100644 --- a/src/support/datastructure/linear/firehub.Sequence.php +++ b/src/support/datastructure/linear/firehub.Sequence.php @@ -19,6 +19,7 @@ use FireHub\Core\Support\DataStructure\Behavior\ { Countable, Enumerable }; +use FireHub\Core\Support\LowLevel\Iterator; use Traversable; /** @@ -31,7 +32,7 @@ * @template TValue * * @implements \FireHub\Core\Support\DataStructure\Linear - * @implements \FireHub\Core\Support\DataStructure\Behavior\Enumerable + * @implements \FireHub\Core\Support\DataStructure\Behavior\Enumerable */ class Sequence implements Linear, Countable, Enumerable { @@ -41,7 +42,7 @@ class Sequence implements Linear, Countable, Enumerable { * * @uses \FireHub\Core\Support\DataStructure\Storage As parameter. * - * @param \FireHub\Core\Support\DataStructure\Storage $storage

+ * @param \FireHub\Core\Support\DataStructure\Storage $storage

* Underlying storage data. *

* @@ -60,16 +61,17 @@ public function __construct ( * * $collection = new Sequence(new ArrStorage(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'])); * - * // ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] + * // 6 * * * @since 1.0.0 * - * @uses \FireHub\Core\Support\DataStructure\Storage::count() To count the number of elements in the sequence. + * @uses \FireHub\Core\Support\LowLevel\Iterator::count() To count the number of elements in the sequence. + * @uses \FireHub\Core\Support\DataStructure\Storage::entries() To get the entries of the storage for counting. */ public function count ():int { - return $this->storage->count(); + return Iterator::count($this->storage->entries()); } @@ -77,10 +79,12 @@ public function count ():int { * @inheritDoc * * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage::values() To get the values of the storage for iteration. */ public function getIterator ():Traversable { - return $this->storage; + yield from $this->storage->values(); } diff --git a/src/support/datastructure/storage/firehub.ArrStorage.php b/src/support/datastructure/storage/firehub.ArrStorage.php index 033bb168..e0049da3 100644 --- a/src/support/datastructure/storage/firehub.ArrStorage.php +++ b/src/support/datastructure/storage/firehub.ArrStorage.php @@ -15,7 +15,6 @@ use FireHub\Core\Support\DataStructure\Storage; use FireHub\Core\Support\LowLevel\Arr; -use Traversable; /** * ### Array-Based Storage @@ -49,12 +48,23 @@ public function __construct ( * @inheritDoc * * @since 1.0.0 + */ + public function entries ():iterable { + + return $this->data; + + } + + /** + * @inheritDoc * - * @uses \FireHub\Core\Support\LowLevel\Arr::count() To count the number of elements in the array. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::keys() For efficient key retrieval. */ - public function count ():int { + public function keys ():iterable { - return Arr::count($this->data); + return Arr::keys($this->data); } @@ -62,10 +72,12 @@ public function count ():int { * @inheritDoc * * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::values() For efficient value retrieval. */ - public function getIterator ():Traversable { + public function values ():iterable { - yield from $this->data; + return Arr::values($this->data); } diff --git a/src/support/datastructure/storage/firehub.GeneratorStorage.php b/src/support/datastructure/storage/firehub.GeneratorStorage.php new file mode 100644 index 00000000..59422d65 --- /dev/null +++ b/src/support/datastructure/storage/firehub.GeneratorStorage.php @@ -0,0 +1,103 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage; + +use FireHub\Core\Support\DataStructure\Storage; +use Closure, Generator; + +/** + * ### Generator-Based Storage + * + * Lazy, streaming-oriented storage implementation that produces elements on demand. Ideal for large or infinite + * datasets where full materialization is not possible or desired. + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Storage + */ +class GeneratorStorage implements Storage { + + /** + * ### Constructor + * @since 1.0.0 + * + * @param Closure():Generator $callable

+ * The callable that produces the generator. + *

+ * + * @return void + */ + public function __construct ( + protected Closure $callable + ) {} + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::create() To produce the generator for + * entries. + */ + public function entries ():iterable { + + return $this->create(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::create() To produce the generator for + * values. + */ + public function keys ():iterable { + + foreach ($this->create() as $key => $value) + yield $key; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::create() To produce the generator for + * keys. + */ + public function values ():iterable { + + foreach ($this->create() as $value) + yield $value; + + } + + /** + * ### Creates the generator + * @since 1.0.0 + * + * @return Generator The generator produced by the callable. + */ + private function create ():Generator { + + yield from ($this->callable)(); + + } + +} \ No newline at end of file diff --git a/tests/unit/support/datastructure/linear/SequenceTest.php b/tests/unit/support/datastructure/linear/SequenceTest.php new file mode 100644 index 00000000..df4a90cb --- /dev/null +++ b/tests/unit/support/datastructure/linear/SequenceTest.php @@ -0,0 +1,46 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @package Core\Test + */ + +namespace FireHub\Tests\Unit\Support\DataStructure\Linear; + +use FireHub\Core\Testing\Base; +use FireHub\Core\Support\DataStructure\Linear\Sequence; +use FireHub\Core\Support\DataStructure\Storage\ArrStorage; +use PHPUnit\Framework\Attributes\ { + CoversClass, Group, Small, TestWith +}; + +/** + * ### Test Sequence Data Structure + * @since 1.0.0 + */ +#[Small] +#[Group('support')] +#[CoversClass(Sequence::class)] +final class SequenceTest extends Base { + + /** + * @since 1.0.0 + * + * @param int $expected + * @param array $array + * + * @return void + */ + #[TestWith([6, ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testCount (int $expected, array $array):void { + + self::assertSame($expected, new Sequence(new ArrStorage($array))->count()); + + } + +} \ No newline at end of file diff --git a/tests/unit/support/datastructure/storage/ArrStorageTest.php b/tests/unit/support/datastructure/storage/ArrStorageTest.php new file mode 100644 index 00000000..264d2c97 --- /dev/null +++ b/tests/unit/support/datastructure/storage/ArrStorageTest.php @@ -0,0 +1,80 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @package Core\Test + */ + +namespace FireHub\Tests\Unit\Support\DataStructure\Storage; + +use FireHub\Core\Testing\Base; +use FireHub\Core\Support\DataStructure\Storage\ArrStorage; +use PHPUnit\Framework\Attributes\ { + CoversClass, Group, Small, TestWith +}; + +/** + * ### Test Array-Based Storage + * @since 1.0.0 + */ +#[Small] +#[Group('support')] +#[CoversClass(ArrStorage::class)] +final class ArrStorageTest extends Base { + + /** + * @since 1.0.0 + * + * @param array $array + * + * @return void + */ + #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testEntries (array $array):void { + + self::assertSame($array, new ArrStorage($array)->entries()); + + } + + /** + * @since 1.0.0 + * + * @param array $expected + * @param array $array + * + * @return void + */ + #[TestWith([ + ['firstname', 'lastname', 'age', 10], + ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] + ])] + public function testKeys (array $expected, array $array):void { + + self::assertSame($expected, new ArrStorage($array)->keys()); + + } + + /** + * @since 1.0.0 + * + * @param array $expected + * @param array $array + * + * @return void + */ + #[TestWith([ + ['John', 'Doe', 25, 2], + ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] + ])] + public function testValues (array $expected, array $array):void { + + self::assertSame($expected, new ArrStorage($array)->values()); + + } + +} \ No newline at end of file diff --git a/tests/unit/support/datastructure/storage/GeneratorStorageTest.php b/tests/unit/support/datastructure/storage/GeneratorStorageTest.php new file mode 100644 index 00000000..a88e0309 --- /dev/null +++ b/tests/unit/support/datastructure/storage/GeneratorStorageTest.php @@ -0,0 +1,90 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @package Core\Test + */ + +namespace FireHub\Tests\Unit\Support\DataStructure\Storage; + +use FireHub\Core\Testing\Base; +use FireHub\Core\Support\DataStructure\Storage\GeneratorStorage; +use FireHub\Core\Support\LowLevel\Iterator; +use PHPUnit\Framework\Attributes\ { + CoversClass, Group, Small, TestWith +}; + +/** + * ### Test Generator-Based Storage + * @since 1.0.0 + */ +#[Small] +#[Group('support')] +#[CoversClass(GeneratorStorage::class)] +final class GeneratorStorageTest extends Base { + + /** + * @since 1.0.0 + * + * @param array $array + * + * @return void + */ + #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testEntries (array $array):void { + + self::assertSame( + $array, + Iterator::toArray(new GeneratorStorage(static fn() => yield from $array)->entries()) + ); + + } + + /** + * @since 1.0.0 + * + * @param array $expected + * @param array $array + * + * @return void + */ + #[TestWith([ + ['firstname', 'lastname', 'age', 10], + ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] + ])] + public function testKeys (array $expected, array $array):void { + + self::assertSame( + $expected, + Iterator::toArray(new GeneratorStorage(static fn() => yield from $array)->keys()) + ); + + } + + /** + * @since 1.0.0 + * + * @param array $expected + * @param array $array + * + * @return void + */ + #[TestWith([ + ['John', 'Doe', 25, 2], + ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] + ])] + public function testValues (array $expected, array $array):void { + + self::assertSame( + $expected, + Iterator::toArray(new GeneratorStorage(static fn() => yield from $array)->values()) + ); + + } + +} \ No newline at end of file From 94c3ff7cebf5fb72fe4fc40f26a122be55efe56a Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 15 Apr 2026 14:52:22 +0200 Subject: [PATCH 48/79] Restructure core data structure architecture with modular enhancements **Detailed Description:** 1. **Refactored Architecture:** - Removed outdated classes (`firehub.Linear.php`, `firehub.Sequence.php`, etc.) in favor of a modular and extensible structure. - Introduced a new hierarchy for Data Structures: - `Capability`: Introduced concepts like `StreamingAccess`, `SequentialAccess`, and `Countable` behavior for precise feature modularization. - `Abstraction`: Added higher-level abstractions like `Collection`, `Stream`, and `Enumerable` for defining standardized structural behavior. - `Type`: Implemented the `Linear` interface to define sequentially organized data. 2. **Addition of Core Components:** - Created `DS` as the new entry point for managing FireHub's data structure constructs: - Integrated `SequenceBuilder` for flexible and efficient sequence creation. - Provided factory APIs for improved abstraction and usability. - Added new `Sequence` implementation under `Collection\Linear`: - Designed for ordered collections supporting sequential iteration and manipulation. - Uses redesigned storage mechanisms for enhanced compatibility and performance. 3. **Enhanced Storage Layer:** - Updated `Storage`: - Added `count()` method as part of `Countable` contract. - Dropped redundant methods like `keys()` and `values()`. - Enhanced compatibility with new `GeneratorStorage` and `ArrStorage` as backends: - Both storages now implement `SequentialAccess` or `StreamingAccess` capabilities based on their traits. - Refactored `GeneratorStorage` for lazy evaluation with reduced memory overhead. 4. **Revised Testing Suite:** - Replaced legacy tests (`SequenceTest.php`, `StorageTest.php`) with dedicated unit tests: - Verified integration with modular capabilities via separate tests for storage options. - Ensured alignment of domain logic and expected behaviors for each abstraction. 5. **Autoload Updates:** - Updated classmap with new abstractions (`Abstraction`, `Capability`, `Collection`, etc.) to ensure continuous and efficient module discovery in enterprise environments. **Key Benefits:** - Introduces a modular and standardized approach to FireHub data structures, improving scalability and maintainability. - Enhances memory efficiency and flexibility of data operations via improved storage integration. - Simplifies developer experience with extensible and reusable abstractions. --- dist/core.min.phar | Bin 209693 -> 215010 bytes dist/core.phar | Bin 678813 -> 690535 bytes src/support/autoload/classmap.php | 15 ++- .../loader/firehub.CompiledClassmap.php | 44 ++++++-- .../abstraction/firehub.Collection.php | 32 ++++++ .../firehub.Enumerable.php | 10 +- .../abstraction/firehub.Stream.php | 32 ++++++ .../builder/firehub.SequenceBuilder.php | 99 ++++++++++++++++++ .../access/firehub.RandomAccess.php | 23 ++++ .../access/firehub.SequentialAccess.php | 23 ++++ .../access/firehub.StreamingAccess.php | 23 ++++ .../behavior/firehub.Countable.php | 2 +- .../collection/linear/firehub.Sequence.php | 89 ++++++++++++++++ src/support/datastructure/firehub.DS.php | 46 ++++++++ src/support/datastructure/firehub.Linear.php | 30 ------ src/support/datastructure/firehub.Storage.php | 20 +--- .../datastructure/linear/firehub.Sequence.php | 91 ---------------- .../storage/firehub.ArrStorage.php | 29 ++--- .../storage/firehub.GeneratorStorage.php | 41 +++----- .../datastructure/type/firehub.Linear.php | 25 +++++ .../{ => collection}/linear/SequenceTest.php | 11 +- .../datastructure/storage/ArrStorageTest.php | 43 +------- .../storage/GeneratorStorageTest.php | 50 +-------- 23 files changed, 488 insertions(+), 290 deletions(-) create mode 100644 src/support/datastructure/abstraction/firehub.Collection.php rename src/support/datastructure/{behavior => abstraction}/firehub.Enumerable.php (73%) create mode 100644 src/support/datastructure/abstraction/firehub.Stream.php create mode 100644 src/support/datastructure/builder/firehub.SequenceBuilder.php create mode 100644 src/support/datastructure/capability/access/firehub.RandomAccess.php create mode 100644 src/support/datastructure/capability/access/firehub.SequentialAccess.php create mode 100644 src/support/datastructure/capability/access/firehub.StreamingAccess.php rename src/support/datastructure/{ => capability}/behavior/firehub.Countable.php (91%) create mode 100644 src/support/datastructure/collection/linear/firehub.Sequence.php create mode 100644 src/support/datastructure/firehub.DS.php delete mode 100644 src/support/datastructure/firehub.Linear.php delete mode 100644 src/support/datastructure/linear/firehub.Sequence.php create mode 100644 src/support/datastructure/type/firehub.Linear.php rename tests/unit/support/datastructure/{ => collection}/linear/SequenceTest.php (69%) diff --git a/dist/core.min.phar b/dist/core.min.phar index 8744f43d787a0a44ac552b5eb55bf3a5958f8b88..b608a42eefc3d99312c26ff7f1f9706719dcb70d 100644 GIT binary patch delta 6436 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 delta 3820 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 WvDC&ZKjd(jFFx~=l#`N>mhfNpCU=Ga diff --git a/dist/core.phar b/dist/core.phar index 927884ecc97b62d233a6d715563269308e4ce11c..6593d081bc65e74a0244fbaccd01a808b5d43501 100644 GIT binary patch delta 10448 zcmbta33wD$woX?i>Co9a`<_(D)(M@Eu!bZOLJ$Oj5JJL|uvEG$NlABg(+dz0+PJZa z0wvxc2s{SI1q8&wD4XJ_11bU|%P2YqeF%u)*YGci5d|G=z`Wf7wYV;c-stsvUAiINjq;kI5>2mNUmuQm)wula) z&D~s7ZL?Se@(M#K6oQM_iWu%U z(W|J=qc`ufc8 zRRN>0fNB$O=bJ@~=xQIxn@ob!=@m7Vm&`V66?uu}98eMmk3alwcf?o;ql88aRw#SM*aK2bT%IMrCh9(Gb3W@o+d%EMJVKxx>ZKtmb2A`P&jh-+vlIb0;&Fes7MY+5Jo`o%ea{NTT9sL_ok+ zQ{^#vcWe&YJ%VOBgXV4LHqrtWz9Jw1VrO$oH% zZBHm6n>v>;i)eff0{=ymzCb>moP+j$%Y@0+#4IvHP87)aQzFg(nxyIE`T3+KGKM72 zBjfz!S!6txJe!P$lo>?wE|6@i-*J!pSwhZ}^BIG7AH|y7ozg%ij!2zL#!acy$%5a( z_ohdRD&@6VIcT87gv-Tgsboe?8ZAlBrqPmgJ#8j=KQq0JjBlkk5(#@i!om8zm*o@b zBhlIgj9&YaqVxWYMl$oS%2>fsV>ffu*e7A0X>P`8ISSk`g=IP9Vb}=mUS;{LOuE;@ znbh?7{?vP$;roD~r+$=6QpmDcS)UbzmMnrZ4NC<0%OCWonvGdAhy}~Ds2eY4Q46ZF z>HE#uRP;ZUadHm*zB`AyJ3N;@TXP%8Ue|*BvZ>=5aoI?Zv(iE;@$o_` z;YuO3r@DyRyQ7Fk_!*Ei?!L~=^3T~ha`8X|5z;u20tms!!EbKAM1rU{vXN+K9-EGODL+oD51c=dk`I89%Li)at6;QqdeG3BJdu_&9ayW z$@U@T=zhc`$@7NLU9}FO-hFQfm7F`2B7MbB3Zt);=Sjop`#r;&iR9Sf_mHt;I9-2f z_%QOEUOI$~^`$hK<zRt))Ms=LC6wBrsF_R_+EUL%B=x0) zOhO%Vnf~bNayBxC(iv~4F}*>>Q<+>WAu{16BnVwKF&sLzij7aN_R^dtN*$W~>5b2r zTpwY$6(2$!k1<2Je#0WKhRi-R^rS&P1^Ks7&})rXzRo8fwbe6Y zdU2)+Iwj!1gVFa5OqI@;0+=PCg`=5xf&)lZpCxF@IVJ?ZQT3!D&v{0Rw#;A($hWS; z)0v4HlG7}t7V2nVMzBD1(5nqh2^uw?4e0`iOkdIiI|@Mel(D7g+C?UW04TXH04XyE zj$o@voO*z?{47)78>ES7?^$L_4{ZukH7A*hn=4W#@fVnJH-{?!7E_A$p1}JDyr$d) zuLRY5-eRhWJAVzcUbAv;9&|sDqob#pyNJ7Q2eMw_w?b4;V((LM8;JGFH{9HK>RFZS z`^5VLw)G4%yBA2kPDF1JH48{v1}CA7FLoSAp=oCy~5K>r<_tBrTTN1H={6_S~=@)8_# zcy)^?i7tV23NFsp!U-0^DtIK9vxpn-BKqtO+d|O{Q$d(hbh-q|W#k-!T>u5m7J-As z4jwnXM6T0qx7!>pJlkr8cf<^vU76zKoNiMa$Aez883Kg`SwTGfMs#7zV7DI0*5z1L9l-kFohT^@fsqUGcN#fCg0SI9Ae17L;GHItAGR&xd;t>6ZWr&6 zTD^E~5iQ_t9JrW zsCZgY<_m&dl;mwkf@8hntv0h@;Y=2Rmr${l%?VS#5I4@-&ZK#&u}y-{BFx%JafOmf zeL!k8c18hL?*x;0i4zt>@x&WZTMW@^$Hf*ZG}$n%&}#W~de2IZr#EVC$B~VTsDQF)dLSwOT%??=HaASeMJs}!{eUIYxQI}d@z7;;P3}- zzR(VpMS?BDY3qv&K80H0&>?>-K(#j3fV!*MY_#oyHfYpB90jK#pPOcbaz&;P2Z<6? zF-0z}2z?2}`q1h9Y>XP^bo9ob1Jg9&Xzv$nTmmEt6gONMiACzRTny#0 zsHiBL3h#ycJ5|ZQA#jQyzsPmXOVLfypl!?8sl`nyF|dGA(5$R1j&=$hZI02_ zZA=_tCmvd@)Ds!lfg03il1B81g+HxfuaJTdYz@D}chrU67cS8%5X!(?EVe~X@OA+N zTq<<>l24%kfCQDc0&C^+)I(OGrTEltbJ*OiZ6pRhngXRgNv?TF7v|UUIJ;hNXP?vz z{`K8ckK-Ep>mGoO5{@pKfPwq$CwvuHrX+BD3lIW0BWzGW9YzZOW}#J-Btj5uzz@t` zKJLeGi3mW3LUzCy;7iqBnuYldrtV4%l!F8pYTnT-!XhACcAJwV6mV>XonXhwwy7y- z%62AP@7pMiH1*J++whQjeQ>)Df~_iy56^CayvwDzDXgx@4!j(CMg(BWHU;|T0@@FfRQBpWTr?F79xt*Zh zDL@rc_@xsQ0)m=I%DO;=zgzqo&90G)*#tJq*9a(=j|hmqu}AAbr=V-w;RYV_s8D=w zsLbv`u*&?Lu5vA^UAgA+9qC4Hw9v-G794Oz=ayV3V+ETM;@(m47a(Xcr9#|7sRR!j40o9Zq4E?4#L1_=HU%TS4EfVsk^4V+q@UrmtqVM%_Rc(D$p^ zC4#T_jA`BAnstS1bN`Y zVQBqhY#fSwn$<=+DfRR&fb%f}?VSSzu5vD0AeXL-L`NTIvzf-(U3`kJh7@2sxfmKj zZ+&{)VM2?0LnW?;rk=wsAH;+9d}!kX&^A7|jS2I#xFs`BNT!AJyY?c~8ft5AGOeCf zW1(u_geb(gK+bRbMT}kaHMLzRLk$0|?z0Z~~}v@C!_bKXJn^kg!B=n+Sca!_+34 zKmwudsN2oP&2n+g3i^#iFz4i31Q&Fz_<8|zHdw<;tpaJrmH2Qy**NeLlf&ku2M?yT z)C=CuEHwhUM9^xo;0_pWgf2eIB+sG661XzqHUh3l1Ze8W(Z&Ijo@N?c+TwWo9`F&p zi%<><5T!ava8iP4x3gMwM};ne+)@@OntFqTn+7(kI&cHcOTe#_(6*OYeF{BM=M3&`#%L3eAK{BN>r?0K6?v|eE7lSF8KkdDB)@^s%9>SjvQixQN%;6{Bpz6 z85-2RgDIjp4CSy4b+3bL!L_f{Pq0!b)Jo@nOhaqwJxA#@bZR-I749#)pugOp;fxAF zp`ZI$00EmJ>-Tdg^a=K_KDLMstYM3TY0k=-OF3UQXCO8xh-5t~Kv06XeXQP>$WLxy ztGcQYdmc8Y?&jC8HF14M_E=pM+PensuVXf{uV|uh7A)l~t^zl~qs-Ky*HE;9eh zUUh+{ky!xHv2)Q$2UFnK{`?7cUz<0M7F`*(m=Q+ zh5ASuZ74KeaQQAbY4K34gN%ay3l}_6@8Aj(Y5~4)%=BJ3LeU@^p)?8(OFJ%qq^!v$ z4;g~U(T3KI(q+HQ?d-3SyUSvibK6bdqE|wnp^eKi^39p%`YEVaNvWl z`_)*olcEa3`gs=Jw{k*J^|VlSUipziJuUy!8*AANb1@126k-aop%hqyG!5WaXIv delta 4770 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 ax~`^9zW?08ZUXdK*bV(lAu(n|%>MzC0lc^X diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index 42fe8c10..2584df3e 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -78,13 +78,20 @@ \FireHub\Core\Support\Bootstrap\Bootloader\RegisterHelpers::class => __DIR__.'/../../support/bootstrap/bootloader/firehub.RegisterHelpers.php', \FireHub\Core\Support\Bootstrap\FireHubConfigurator::class => __DIR__.'/../../support/bootstrap/firehub.FireHubConfigurator.php', \FireHub\Core\Support\Contracts\DataStructure::class => __DIR__.'/../../support/contracts/firehub.DataStructure.php', - \FireHub\Core\Support\DataStructure\Behavior\Countable::class => __DIR__.'/../../support/datastructure/behavior/firehub.Countable.php', - \FireHub\Core\Support\DataStructure\Behavior\Enumerable::class => __DIR__.'/../../support/datastructure/behavior/firehub.Enumerable.php', - \FireHub\Core\Support\DataStructure\Linear::class => __DIR__.'/../../support/datastructure/firehub.Linear.php', - \FireHub\Core\Support\DataStructure\Linear\Sequence::class => __DIR__.'/../../support/datastructure/linear/firehub.Sequence.php', + \FireHub\Core\Support\DataStructure\Abstraction\Collection::class => __DIR__.'/../../support/datastructure/abstraction/firehub.Collection.php', + \FireHub\Core\Support\DataStructure\Abstraction\Enumerable::class => __DIR__.'/../../support/datastructure/abstraction/firehub.Enumerable.php', + \FireHub\Core\Support\DataStructure\Abstraction\Stream::class => __DIR__.'/../../support/datastructure/abstraction/firehub.Stream.php', + \FireHub\Core\Support\DataStructure\Builder\SequenceBuilder::class => __DIR__.'/../../support/datastructure/builder/firehub.SequenceBuilder.php', + \FireHub\Core\Support\DataStructure\Capability\Access\RandomAccess::class => __DIR__.'/../../support/datastructure/capability/access/firehub.RandomAccess.php', + \FireHub\Core\Support\DataStructure\Capability\Access\SequentialAccess::class => __DIR__.'/../../support/datastructure/capability/access/firehub.SequentialAccess.php', + \FireHub\Core\Support\DataStructure\Capability\Access\StreamingAccess::class => __DIR__.'/../../support/datastructure/capability/access/firehub.StreamingAccess.php', + \FireHub\Core\Support\DataStructure\Capability\Behavior\Countable::class => __DIR__.'/../../support/datastructure/capability/behavior/firehub.Countable.php', + \FireHub\Core\Support\DataStructure\Collection\Linear\Sequence::class => __DIR__.'/../../support/datastructure/collection/linear/firehub.Sequence.php', + \FireHub\Core\Support\DataStructure\DS::class => __DIR__.'/../../support/datastructure/firehub.DS.php', \FireHub\Core\Support\DataStructure\Storage::class => __DIR__.'/../../support/datastructure/firehub.Storage.php', \FireHub\Core\Support\DataStructure\Storage\ArrStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrStorage.php', \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.GeneratorStorage.php', + \FireHub\Core\Support\DataStructure\Type\Linear::class => __DIR__.'/../../support/datastructure/type/firehub.Linear.php', \FireHub\Core\Support\LowLevel::class => __DIR__.'/../../support/firehub.LowLevel.php', \FireHub\Core\Support\LowLevel\Arr::class => __DIR__.'/../../support/lowlevel/firehub.Arr.php', \FireHub\Core\Support\LowLevel\CharMB::class => __DIR__.'/../../support/lowlevel/firehub.CharMB.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 24034d53..520c43e1 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -244,20 +244,44 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/contracts/firehub.DataStructure.php'; return; - case \FireHub\Core\Support\DataStructure\Behavior\Countable::class: - require __DIR__.'/../../../support/datastructure/behavior/firehub.Countable.php'; + case \FireHub\Core\Support\DataStructure\Abstraction\Collection::class: + require __DIR__.'/../../../support/datastructure/abstraction/firehub.Collection.php'; return; - case \FireHub\Core\Support\DataStructure\Behavior\Enumerable::class: - require __DIR__.'/../../../support/datastructure/behavior/firehub.Enumerable.php'; + case \FireHub\Core\Support\DataStructure\Abstraction\Enumerable::class: + require __DIR__.'/../../../support/datastructure/abstraction/firehub.Enumerable.php'; return; - case \FireHub\Core\Support\DataStructure\Linear::class: - require __DIR__.'/../../../support/datastructure/firehub.Linear.php'; + case \FireHub\Core\Support\DataStructure\Abstraction\Stream::class: + require __DIR__.'/../../../support/datastructure/abstraction/firehub.Stream.php'; return; - case \FireHub\Core\Support\DataStructure\Linear\Sequence::class: - require __DIR__.'/../../../support/datastructure/linear/firehub.Sequence.php'; + case \FireHub\Core\Support\DataStructure\Builder\SequenceBuilder::class: + require __DIR__.'/../../../support/datastructure/builder/firehub.SequenceBuilder.php'; + return; + + case \FireHub\Core\Support\DataStructure\Capability\Access\RandomAccess::class: + require __DIR__.'/../../../support/datastructure/capability/access/firehub.RandomAccess.php'; + return; + + case \FireHub\Core\Support\DataStructure\Capability\Access\SequentialAccess::class: + require __DIR__.'/../../../support/datastructure/capability/access/firehub.SequentialAccess.php'; + return; + + case \FireHub\Core\Support\DataStructure\Capability\Access\StreamingAccess::class: + require __DIR__.'/../../../support/datastructure/capability/access/firehub.StreamingAccess.php'; + return; + + case \FireHub\Core\Support\DataStructure\Capability\Behavior\Countable::class: + require __DIR__.'/../../../support/datastructure/capability/behavior/firehub.Countable.php'; + return; + + case \FireHub\Core\Support\DataStructure\Collection\Linear\Sequence::class: + require __DIR__.'/../../../support/datastructure/collection/linear/firehub.Sequence.php'; + return; + + case \FireHub\Core\Support\DataStructure\DS::class: + require __DIR__.'/../../../support/datastructure/firehub.DS.php'; return; case \FireHub\Core\Support\DataStructure\Storage::class: @@ -272,6 +296,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/storage/firehub.GeneratorStorage.php'; return; + case \FireHub\Core\Support\DataStructure\Type\Linear::class: + require __DIR__.'/../../../support/datastructure/type/firehub.Linear.php'; + return; + case \FireHub\Core\Support\LowLevel::class: require __DIR__.'/../../../support/firehub.LowLevel.php'; return; diff --git a/src/support/datastructure/abstraction/firehub.Collection.php b/src/support/datastructure/abstraction/firehub.Collection.php new file mode 100644 index 00000000..274dcd4b --- /dev/null +++ b/src/support/datastructure/abstraction/firehub.Collection.php @@ -0,0 +1,32 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Abstraction; + +/** + * ### Collection Contract + * + * A Collection is a structured, stateful data container that stores and manages a finite set of elements. It + * provides consistent, repeatable iteration and supports common data operations such as adding, removing, + * and transforming items while preserving internal state and order guarantees depending on its specific type + * (e.g., linear, associative, or set-based). + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Abstraction\Enumerable + */ +interface Collection extends Enumerable { + +} \ No newline at end of file diff --git a/src/support/datastructure/behavior/firehub.Enumerable.php b/src/support/datastructure/abstraction/firehub.Enumerable.php similarity index 73% rename from src/support/datastructure/behavior/firehub.Enumerable.php rename to src/support/datastructure/abstraction/firehub.Enumerable.php index a04c7bcc..50b354df 100644 --- a/src/support/datastructure/behavior/firehub.Enumerable.php +++ b/src/support/datastructure/abstraction/firehub.Enumerable.php @@ -11,12 +11,13 @@ * @package Core\Support */ -namespace FireHub\Core\Support\DataStructure\Behavior; +namespace FireHub\Core\Support\DataStructure\Abstraction; +use FireHub\Core\Support\Contracts\DataStructure; use FireHub\Core\Shared\Contracts\IteratorAggregate; /** - * ### Enumerable Behavior Contract + * ### Enumerable Contract * * Defines the ability to iterate over all elements in a structure. Provides higher-level traversal operations such * as mapping, filtering, and transformation, typically built on top of a traversal mechanism. @@ -25,6 +26,9 @@ * @template TKey * @template TValue * + * @extends \FireHub\Core\Support\Contracts\DataStructure * @extends \FireHub\Core\Shared\Contracts\IteratorAggregate */ -interface Enumerable extends IteratorAggregate {} \ No newline at end of file +interface Enumerable extends DataStructure, IteratorAggregate { + +} \ No newline at end of file diff --git a/src/support/datastructure/abstraction/firehub.Stream.php b/src/support/datastructure/abstraction/firehub.Stream.php new file mode 100644 index 00000000..19fa007a --- /dev/null +++ b/src/support/datastructure/abstraction/firehub.Stream.php @@ -0,0 +1,32 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Abstraction; + +/** + * ### Stream Contract + * + * A Stream is a lazy, single-pass data structure that produces elements on demand during iteration. It does not + * store data in memory as a collection but instead computes or retrieves each element as it is traversed. + * Streams are ideal for processing large or infinite datasets, enabling transformations and operations like mapping + * and filtering without materializing the entire dataset. + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Abstraction\Enumerable + */ +interface Stream extends Enumerable { + +} \ No newline at end of file diff --git a/src/support/datastructure/builder/firehub.SequenceBuilder.php b/src/support/datastructure/builder/firehub.SequenceBuilder.php new file mode 100644 index 00000000..8ccf7a4f --- /dev/null +++ b/src/support/datastructure/builder/firehub.SequenceBuilder.php @@ -0,0 +1,99 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Builder; + +use FireHub\Core\Support\DataStructure\Collection\Linear\Sequence; +use FireHub\Core\Support\DataStructure\Capability\Access\SequentialAccess; +use FireHub\Core\Support\DataStructure\ { + Storage, Storage\ArrStorage +}; +use FireHub\Core\Support\LowLevel\Arr; + +/** + * ### Sequence Builder + * + * Provides a scoped construction API for creating Sequence data structures.
+ * Handles normalization and storage selection while keeping the Sequence model clean. + * @since 1.0.0 + */ +final class SequenceBuilder { + + /** + * ### Create Sequence from storage + * + * Uses an existing storage implementation that supports sequential access. + * @since 1.0.0 + * + * @template TValue + * + * @param \FireHub\Core\Support\DataStructure\Storage&\FireHub\Core\Support\DataStructure\Capability\Access\SequentialAccess $storage

+ * Storage instance that provides sequential access to the data. + *

+ * + * @return Sequence New Sequence instance. + */ + public function fromStorage (Storage&SequentialAccess $storage):Sequence { + + return new Sequence($storage); + + } + + + /** + * ### Create Sequence from an array + * Normalizes array keys into a sequential integer index. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::values() To reindex the input array with sequential integer keys. + * + * @template TValue + * + * @param array $array

+ * The array to convert into a Sequence. + *

+ * + * @return Sequence New Sequence instance. + */ + public function fromArray (array $array):Sequence { + + return new Sequence( + new ArrStorage(Arr::values($array)) + ); + + } + + /** + * ### Create Sequence from values + * Builds a Sequence directly from given values without additional normalization. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::values() To reindex the input values with sequential integer keys. + * + * @template TValue + * + * @param TValue ...$values

+ * Variadic list of values to include in the Sequence. + *

+ * + * @return Sequence New Sequence instance. + */ + public function of (mixed ...$values):Sequence { + + return new Sequence( + new ArrStorage(Arr::values($values)) + ); + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/capability/access/firehub.RandomAccess.php b/src/support/datastructure/capability/access/firehub.RandomAccess.php new file mode 100644 index 00000000..e6fc9e13 --- /dev/null +++ b/src/support/datastructure/capability/access/firehub.RandomAccess.php @@ -0,0 +1,23 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability\Access; + +/** + * ### Random Access + * + * Defines the ability to access elements directly by key or index in constant or near-constant time. It allows + * non-sequential retrieval of elements without iterating through the structure. + * @since 1.0.0 + */ +interface RandomAccess {} \ No newline at end of file diff --git a/src/support/datastructure/capability/access/firehub.SequentialAccess.php b/src/support/datastructure/capability/access/firehub.SequentialAccess.php new file mode 100644 index 00000000..d97e93e8 --- /dev/null +++ b/src/support/datastructure/capability/access/firehub.SequentialAccess.php @@ -0,0 +1,23 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability\Access; + +/** + * ### Sequential Access + * + * Defines the ability to access elements in a strict sequential order, one after another, from beginning to end. It + * guarantees ordered traversal but does not provide direct access to arbitrary positions without iteration. + * @since 1.0.0 + */ +interface SequentialAccess {} \ No newline at end of file diff --git a/src/support/datastructure/capability/access/firehub.StreamingAccess.php b/src/support/datastructure/capability/access/firehub.StreamingAccess.php new file mode 100644 index 00000000..e498fe13 --- /dev/null +++ b/src/support/datastructure/capability/access/firehub.StreamingAccess.php @@ -0,0 +1,23 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability\Access; + +/** + * ### Streaming Access + * + * Defines the ability to access elements in a single-pass, forward-only manner where each element is produced or + * consumed once. It does not support revisiting or random retrieval of previously seen elements. + * @since 1.0.0 + */ +interface StreamingAccess {} \ No newline at end of file diff --git a/src/support/datastructure/behavior/firehub.Countable.php b/src/support/datastructure/capability/behavior/firehub.Countable.php similarity index 91% rename from src/support/datastructure/behavior/firehub.Countable.php rename to src/support/datastructure/capability/behavior/firehub.Countable.php index 7f3447f5..10cb7d8d 100644 --- a/src/support/datastructure/behavior/firehub.Countable.php +++ b/src/support/datastructure/capability/behavior/firehub.Countable.php @@ -11,7 +11,7 @@ * @package Core\Support */ -namespace FireHub\Core\Support\DataStructure\Behavior; +namespace FireHub\Core\Support\DataStructure\Capability\Behavior; use FireHub\Core\Shared\Contracts\Countable as CountableContract; diff --git a/src/support/datastructure/collection/linear/firehub.Sequence.php b/src/support/datastructure/collection/linear/firehub.Sequence.php new file mode 100644 index 00000000..55dee9b6 --- /dev/null +++ b/src/support/datastructure/collection/linear/firehub.Sequence.php @@ -0,0 +1,89 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Collection\Linear; + +use FireHub\Core\Support\DataStructure\Abstraction\Collection; +use FireHub\Core\Support\DataStructure\Type\Linear; +use FireHub\Core\Support\DataStructure\Capability\ { + Access\SequentialAccess, Behavior\Countable +}; +use FireHub\Core\Support\DataStructure\Storage; +use Traversable; + +/** + * ### Sequence Data Structure + * + * A fundamental linear structure that maintains a strict ordering of elements. Provides predictable iteration, stable + * indexing (depending on storage), and serves as a base abstraction for other linear collections. + * @since 1.0.0 + * + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Abstraction\Collection + * + * @phpstan-type StorageType = (\FireHub\Core\Support\DataStructure\Storage&\FireHub\Core\Support\DataStructure\Capability\Access\SequentialAccess) + */ +class Sequence implements Collection, Linear, Countable { + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage As parameter. + * + * @param StorageType $storage

+ * Underlying storage data. + *

+ * + * @return void + */ + public function __construct ( + protected Storage&SequentialAccess $storage + ) {} + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructure\DS; + * + * $ds = DS::sequence()->fromArray(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $ds->count(); + * + * // 6 + * + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage::count() To count the number of elements in the sequence. + */ + public function count ():int { + + return $this->storage->count(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function getIterator ():Traversable { + + yield from []; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/firehub.DS.php b/src/support/datastructure/firehub.DS.php new file mode 100644 index 00000000..133a1156 --- /dev/null +++ b/src/support/datastructure/firehub.DS.php @@ -0,0 +1,46 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure; + +use FireHub\Core\Support\DataStructure\Builder\SequenceBuilder; + +/** + * ### Core Data Structure Abstraction Layer + * + * Defines the fundamental abstraction for all data structures in the FireHub ecosystem. It provides a unified + * foundation for representing and working with different structural types such as collections, records, streams, and + * hierarchical models, ensuring consistent behavior, type safety, and interchangeable storage implementations across + * the system. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +final class DS { + + /** + * ### Sequence Builder + * + * Creates a builder for constructing linear sequence structures. + * @since 1.0.0 + * + * @return \FireHub\Core\Support\DataStructure\Builder\SequenceBuilder The builder instance. + */ + public static function sequence ():SequenceBuilder { + + return new SequenceBuilder(); + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Linear.php b/src/support/datastructure/firehub.Linear.php deleted file mode 100644 index 0978db7c..00000000 --- a/src/support/datastructure/firehub.Linear.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure; - -use FireHub\Core\Support\Contracts\DataStructure; - -/** - * ### Linear Data Structure - * - * Defines data structures where elements are arranged in a strict linear sequence. Each element has a clear - * predecessor and successor (except boundaries), enabling predictable traversal, ordered processing, and sequential - * access patterns. - * @since 1.0.0 - * - * @template TValue - * - * @extends \FireHub\Core\Support\Contracts\DataStructure - */ -interface Linear extends DataStructure {} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Storage.php b/src/support/datastructure/firehub.Storage.php index c33d9b35..01acae3a 100644 --- a/src/support/datastructure/firehub.Storage.php +++ b/src/support/datastructure/firehub.Storage.php @@ -13,6 +13,8 @@ namespace FireHub\Core\Support\DataStructure; +use FireHub\Core\Support\DataStructure\Capability\Behavior\Countable; + /** * ### Storage Abstraction Layer * @@ -23,7 +25,7 @@ * @template TKey * @template TValue */ -interface Storage { +interface Storage extends Countable { /** * ### Get all entries from the storage @@ -33,20 +35,4 @@ interface Storage { */ public function entries ():iterable; - /** - * ### Get all keys from the storage - * @since 1.0.0 - * - * @return iterable - */ - public function keys ():iterable; - - /** - * ### Get all values from the storage - * @since 1.0.0 - * - * @return iterable - */ - public function values ():iterable; - } \ No newline at end of file diff --git a/src/support/datastructure/linear/firehub.Sequence.php b/src/support/datastructure/linear/firehub.Sequence.php deleted file mode 100644 index 879950ea..00000000 --- a/src/support/datastructure/linear/firehub.Sequence.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Linear; - -use FireHub\Core\Support\DataStructure\ { - Linear, Storage -}; -use FireHub\Core\Support\DataStructure\Behavior\ { - Countable, Enumerable -}; -use FireHub\Core\Support\LowLevel\Iterator; -use Traversable; - -/** - * ### Sequence Data Structure - * - * A fundamental linear structure that maintains a strict ordering of elements. Provides predictable iteration, stable - * indexing (depending on storage), and serves as a base abstraction for other linear collections. - * @since 1.0.0 - * - * @template TValue - * - * @implements \FireHub\Core\Support\DataStructure\Linear - * @implements \FireHub\Core\Support\DataStructure\Behavior\Enumerable - */ -class Sequence implements Linear, Countable, Enumerable { - - /** - * ### Constructor - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage As parameter. - * - * @param \FireHub\Core\Support\DataStructure\Storage $storage

- * Underlying storage data. - *

- * - * @return void - */ - public function __construct ( - protected Storage $storage - ) {} - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructure\Linear\Sequence; - * use FireHub\Core\Support\DataStructure\Storage\ArrStorage; - * - * $collection = new Sequence(new ArrStorage(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'])); - * - * // 6 - * - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Iterator::count() To count the number of elements in the sequence. - * @uses \FireHub\Core\Support\DataStructure\Storage::entries() To get the entries of the storage for counting. - */ - public function count ():int { - - return Iterator::count($this->storage->entries()); - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage::values() To get the values of the storage for iteration. - */ - public function getIterator ():Traversable { - - yield from $this->storage->values(); - - } - -} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.ArrStorage.php b/src/support/datastructure/storage/firehub.ArrStorage.php index e0049da3..68895ed9 100644 --- a/src/support/datastructure/storage/firehub.ArrStorage.php +++ b/src/support/datastructure/storage/firehub.ArrStorage.php @@ -14,6 +14,9 @@ namespace FireHub\Core\Support\DataStructure\Storage; use FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Support\DataStructure\Capability\Access\ { + RandomAccess, SequentialAccess +}; use FireHub\Core\Support\LowLevel\Arr; /** @@ -28,7 +31,7 @@ * * @implements \FireHub\Core\Support\DataStructure\Storage */ -class ArrStorage implements Storage { +class ArrStorage implements Storage, RandomAccess, SequentialAccess { /** * ### Constructor @@ -44,27 +47,16 @@ public function __construct ( protected array $data = [] ) {} - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function entries ():iterable { - - return $this->data; - - } - /** * @inheritDoc * * @since 1.0.0 * - * @uses \FireHub\Core\Support\LowLevel\Arr::keys() For efficient key retrieval. + * @uses \FireHub\Core\Support\LowLevel\Arr::count() To count the number of elements in the storage. */ - public function keys ():iterable { + public function count ():int { - return Arr::keys($this->data); + return Arr::count($this->data); } @@ -72,13 +64,12 @@ public function keys ():iterable { * @inheritDoc * * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Arr::values() For efficient value retrieval. */ - public function values ():iterable { + public function entries ():iterable { - return Arr::values($this->data); + return $this->data; } + } \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.GeneratorStorage.php b/src/support/datastructure/storage/firehub.GeneratorStorage.php index 59422d65..bcfaec0b 100644 --- a/src/support/datastructure/storage/firehub.GeneratorStorage.php +++ b/src/support/datastructure/storage/firehub.GeneratorStorage.php @@ -14,6 +14,8 @@ namespace FireHub\Core\Support\DataStructure\Storage; use FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Support\DataStructure\Capability\Access\StreamingAccess; +use FireHub\Core\Support\LowLevel\Iterator; use Closure, Generator; /** @@ -28,7 +30,7 @@ * * @implements \FireHub\Core\Support\DataStructure\Storage */ -class GeneratorStorage implements Storage { +class GeneratorStorage implements Storage, StreamingAccess { /** * ### Constructor @@ -49,27 +51,23 @@ public function __construct ( * * @since 1.0.0 * - * @uses \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::create() To produce the generator for - * entries. + * @uses \FireHub\Core\Support\LowLevel\Iterator::count() To count the number of elements in the storage. */ - public function entries ():iterable { + public function count ():int { - return $this->create(); + return Iterator::count($this->create()); } /** - * @inheritDoc - * + * ### Creates the generator * @since 1.0.0 * - * @uses \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::create() To produce the generator for - * values. + * @return Generator The generator produced by the callable. */ - public function keys ():iterable { + private function create ():Generator { - foreach ($this->create() as $key => $value) - yield $key; + yield from ($this->callable)(); } @@ -79,24 +77,11 @@ public function keys ():iterable { * @since 1.0.0 * * @uses \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::create() To produce the generator for - * keys. - */ - public function values ():iterable { - - foreach ($this->create() as $value) - yield $value; - - } - - /** - * ### Creates the generator - * @since 1.0.0 - * - * @return Generator The generator produced by the callable. + * entries. */ - private function create ():Generator { + public function entries ():iterable { - yield from ($this->callable)(); + return $this->create(); } diff --git a/src/support/datastructure/type/firehub.Linear.php b/src/support/datastructure/type/firehub.Linear.php new file mode 100644 index 00000000..0eeb5d62 --- /dev/null +++ b/src/support/datastructure/type/firehub.Linear.php @@ -0,0 +1,25 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Type; + +/** + * ### Linear Data Structure + * + * A Linear data structure type defines a sequential organization of elements where each item has a clear position in + * a single-ordered sequence. It guarantees predictable traversal from one element to the next, typically supporting + * operations such as head/tail access, sequential iteration, and ordered insertion or removal depending on the + * underlying collection. + * @since 1.0.0 + */ +interface Linear {} \ No newline at end of file diff --git a/tests/unit/support/datastructure/linear/SequenceTest.php b/tests/unit/support/datastructure/collection/linear/SequenceTest.php similarity index 69% rename from tests/unit/support/datastructure/linear/SequenceTest.php rename to tests/unit/support/datastructure/collection/linear/SequenceTest.php index df4a90cb..81dbce24 100644 --- a/tests/unit/support/datastructure/linear/SequenceTest.php +++ b/tests/unit/support/datastructure/collection/linear/SequenceTest.php @@ -10,11 +10,12 @@ * @package Core\Test */ -namespace FireHub\Tests\Unit\Support\DataStructure\Linear; +namespace FireHub\Tests\Unit\Support\DataStructure\Collection\Linear; use FireHub\Core\Testing\Base; -use FireHub\Core\Support\DataStructure\Linear\Sequence; -use FireHub\Core\Support\DataStructure\Storage\ArrStorage; +use FireHub\Core\Support\DataStructure\DS; +use FireHub\Core\Support\DataStructure\Builder\SequenceBuilder; +use FireHub\Core\Support\DataStructure\Collection\Linear\Sequence; use PHPUnit\Framework\Attributes\ { CoversClass, Group, Small, TestWith }; @@ -25,6 +26,8 @@ */ #[Small] #[Group('support')] +#[CoversClass(DS::class)] +#[CoversClass(SequenceBuilder::class)] #[CoversClass(Sequence::class)] final class SequenceTest extends Base { @@ -39,7 +42,7 @@ final class SequenceTest extends Base { #[TestWith([6, ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] public function testCount (int $expected, array $array):void { - self::assertSame($expected, new Sequence(new ArrStorage($array))->count()); + self::assertSame($expected, DS::sequence()->fromArray($array)->count()); } diff --git a/tests/unit/support/datastructure/storage/ArrStorageTest.php b/tests/unit/support/datastructure/storage/ArrStorageTest.php index 264d2c97..78df0422 100644 --- a/tests/unit/support/datastructure/storage/ArrStorageTest.php +++ b/tests/unit/support/datastructure/storage/ArrStorageTest.php @@ -30,50 +30,15 @@ final class ArrStorageTest extends Base { /** * @since 1.0.0 * + * @param int $expected * @param array $array * * @return void */ - #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testEntries (array $array):void { + #[TestWith([6, ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testCount (int $expected, array $array):void { - self::assertSame($array, new ArrStorage($array)->entries()); - - } - - /** - * @since 1.0.0 - * - * @param array $expected - * @param array $array - * - * @return void - */ - #[TestWith([ - ['firstname', 'lastname', 'age', 10], - ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] - ])] - public function testKeys (array $expected, array $array):void { - - self::assertSame($expected, new ArrStorage($array)->keys()); - - } - - /** - * @since 1.0.0 - * - * @param array $expected - * @param array $array - * - * @return void - */ - #[TestWith([ - ['John', 'Doe', 25, 2], - ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] - ])] - public function testValues (array $expected, array $array):void { - - self::assertSame($expected, new ArrStorage($array)->values()); + self::assertSame($expected, new ArrStorage($array)->count()); } diff --git a/tests/unit/support/datastructure/storage/GeneratorStorageTest.php b/tests/unit/support/datastructure/storage/GeneratorStorageTest.php index a88e0309..e4fc52ee 100644 --- a/tests/unit/support/datastructure/storage/GeneratorStorageTest.php +++ b/tests/unit/support/datastructure/storage/GeneratorStorageTest.php @@ -14,7 +14,6 @@ use FireHub\Core\Testing\Base; use FireHub\Core\Support\DataStructure\Storage\GeneratorStorage; -use FireHub\Core\Support\LowLevel\Iterator; use PHPUnit\Framework\Attributes\ { CoversClass, Group, Small, TestWith }; @@ -31,58 +30,17 @@ final class GeneratorStorageTest extends Base { /** * @since 1.0.0 * + * @param int $expected * @param array $array * * @return void */ - #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testEntries (array $array):void { - - self::assertSame( - $array, - Iterator::toArray(new GeneratorStorage(static fn() => yield from $array)->entries()) - ); - - } - - /** - * @since 1.0.0 - * - * @param array $expected - * @param array $array - * - * @return void - */ - #[TestWith([ - ['firstname', 'lastname', 'age', 10], - ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] - ])] - public function testKeys (array $expected, array $array):void { - - self::assertSame( - $expected, - Iterator::toArray(new GeneratorStorage(static fn() => yield from $array)->keys()) - ); - - } - - /** - * @since 1.0.0 - * - * @param array $expected - * @param array $array - * - * @return void - */ - #[TestWith([ - ['John', 'Doe', 25, 2], - ['firstname' => 'John', 'lastname' => 'Doe', 'age' => 25, 10 => 2] - ])] - public function testValues (array $expected, array $array):void { + #[TestWith([6, ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testCount (int $expected, array $array):void { self::assertSame( $expected, - Iterator::toArray(new GeneratorStorage(static fn() => yield from $array)->values()) + new GeneratorStorage(static fn() => yield from $array)->count() ); } From fb4880c0ec6ae37321ab3c16f1b6b4014585f6cb Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 15 Apr 2026 15:34:20 +0200 Subject: [PATCH 49/79] feat: introduce `EnumerableBehavior` trait and enhance `Sequence` functionality with new traversal methods **Detailed Description:** 1. **New `EnumerableBehavior` Trait:** - Added `EnumerableBehavior`, encapsulating reusable iteration logic for data structures. - Introduced `tap()` for executing side-effect callbacks on each element. - Introduced `each()` for controlled traversal with behavior signals (`Signal::BREAK` and `Signal::CONTINUE`). - Includes validations to ensure proper return types, throwing `WrongReturnTypeException` for invalid signals. 2. **Enhanced `Sequence` Class:** - Integrated the `EnumerableBehavior` trait to streamline traversal operations. - Updated `getIterator()` to utilize `entries()` from the storage, enabling seamless iteration. 3. **Core Interface Updates:** - Enhanced the `Enumerable` contract to include `tap()` and `each()` methods. - Simplifies compliance for all enumerable structures, fostering consistency across implementations. 4. **Refactored Testing Suite:** - Added dedicated tests in `SequenceTest` for `tap()` and `each()`: - Validating traversal behavior, including `Signal` handling and early termination. - Ensured exceptions are thrown for improper callback return types. - Validated storage functionality by testing `entries()` in `ArrStorageTest` and `GeneratorStorageTest`. 5. **Autoload and Classmap Enhancements:** - Registered `EnumerableBehavior` in both classmap and compiled classmap for efficient autoloading. **Key Benefits:** - Reusable iteration logic empowers extensibility, reducing code duplication across data structures. - New traversal methods (`tap()`, `each()`) enable more expressive and streamlined operations. - Comprehensive tests ensure robust and predictable behavior across enumerable implementations. --- dist/core.min.phar | Bin 215010 -> 216284 bytes dist/core.phar | Bin 690535 -> 696225 bytes src/support/autoload/classmap.php | 1 + .../loader/firehub.CompiledClassmap.php | 4 + .../abstraction/firehub.Collection.php | 4 +- .../abstraction/firehub.Enumerable.php | 29 ++++ .../abstraction/firehub.Stream.php | 4 +- .../collection/linear/firehub.Sequence.php | 13 +- .../trait/firehub.EnumerableBehavior.php | 126 ++++++++++++++++++ .../collection/linear/SequenceTest.php | 80 +++++++++++ .../datastructure/storage/ArrStorageTest.php | 14 ++ .../storage/GeneratorStorageTest.php | 18 +++ 12 files changed, 286 insertions(+), 7 deletions(-) create mode 100644 src/support/datastructure/trait/firehub.EnumerableBehavior.php diff --git a/dist/core.min.phar b/dist/core.min.phar index b608a42eefc3d99312c26ff7f1f9706719dcb70d..cb9bd4b7c0a6adeb2c708cf7c98c30f24aa04147 100644 GIT binary patch delta 3245 zcmai0c~nzp7SCe|5JD0N0TQ+s2}mem-%JQgWT`SBLMVv97~mn1B?v*F6p*^iSeFrA z^`TSuIxeH)99zIv>!=9M^eE^V9T!j;MM1}iQg9ue_uZiO^w^pFk>9!Bz4v#2_kQ=i z(ZC7pB~V!JuPIEue0)1?XI35rGnW zEW#1Iu>cyS*!bF|5mma$$`3i{{tV=K!?~1u` zS_pSC1ta7b$DT|T+LAGExJ)G*uA$Qb*5sK3Y=puQJrrcEBOD%eG%_=o492LtEt|v~ zJgIgJv*c~DGcqHrzn`o_HAQKf@7P6vUU@5k`Xpn`uLPDM^B>dnCn<8|Z4^_wL&3Jk7b~mY! zc~aZhm@Q?n!T8L3^f8^<=e7Vb1iAz5Y9kE0!%{18SZWf7b$ogaOJiD#JdA~b)#W+vI}W%RBUU?Sd= zDKEk?8BstEc|}kGD`~mI;33y~K*M7m8mK-=pB8WA$I-n-P(DtWEpx~icR&IYvGSY; zaVXn8_%e^y5p#8TldbV#j6hLu z*Y`zNPtSyENJHF23R3DVMDvRC&V4s8yGQ@%KtAf#dQ8BZm{NgI-qSb)w1->X z)8*?T0vc(hVkBxsNd(eaHAjPzbkn3f?F9~FoHU_k-mbT zx1GE9WIVK8>-oOzRNqX*u+KMxhE^H+CNpJlc34Ir%h3<43O|t4=Lf^~^@lfagAvaA zXF&a1w9ciC_xHg1MaeJ;^Dcctb2J9PnqCb6x$;0*tF}NOejEscPYQzDJ`@B+1;MbD zWx?q{e1oP*7^!E`@;%AHAZ}}jGm_>S0@JDsfv0B32(v;fknj7@QUublas->g@)7*U z2%2z^b1WR52e$~Q+#CVcZ6n0bC_oAOXOtjtltX&GJRDiy$U_l4ki!p~R51ftg$nrX z{FBid0_%uJWXcHvde`Rs@*PVCj(bw61jcdu-|u1yv%nn5m`R5t6)zi0KFmcuZos^# z?F%r6|3}tRhWV1~pK{2Gmv)_RiZImzvNw}ws@GId3rb8J$kTaFW`w4o7+E6n(kGEr z#aT?yxxN=Wz@)DDo7zxI`!RtqNBzN`bd^-tc`Vtnx{APm*{`lrL5h`PYS(#eucJg? ztgVtoRq1t=nuUZciYV7tYKbZ;wjXQgJlltPFiq(KRP1F;K&1wouqnfA%#Ld1nYd9r zCB~w*2AZ-dq8$^86gZ6U1LerY8T@yRsjBoEy|w_a$BT58s6pHtG~k*lTv9^R;mRmn zvP4r_O-OM`fu^)HUsF)xZ9MUX2!iEQ8VYHsAr{Q#M?>n0$sUYTV74jb11IV)!^i- za3_+fa-N1y*Vk1L)1k4cLb+007L{MEEiLqxD)0ts@o6k>Y8lLaXSjrQ8ZMcP=$h6o zFUgM!dS!j8j6eDL@eRd4j;9r$YP!85);?=?oqcZ0+3mX*E#A`fD7&5Ub?8FLcux5W zrOWgEe;nNSxKKTyk(-A6mBso#a=>p*pe!~}U$G}}^X{2-=>dLm!iymhHj(MAG3pY9 zWnIT-<#=0X`Rwc$T{GJXPWJr%+o;TSn`@eO-)pJ4KJ7k!DV}>GtiLyj4CsDc6p(x| zMSSkFD(CBlk>Z7*axr@-ua?S~t9*RHQ*j>J{p9bKj0N?n=D>rYG#SUyzbn6+{s zXVJqu-HqBq&Ed9ZcZ?@ydYtNhIBJ-<#8sN)Oz!;my$jRE)g2zL(Hyadjmz_;eJL^5 zG)>>81Q2J2i*i>)QJBP+f#KAnHxC!Js{{`9LSDg*x~ z|LeV!xJY#M;NCCq*&VD6Fq_z%7256spl$*GXhTQz7^Zp83PUz9^V|_d?V(Bmm7I!k{r&xV;;7*b{RLSE5Uh8 zH!GlYV%EnNsfY52Q(L~fF?T!nWtnLC#F6@>!S?pXEWS6{^LN5A>w-A?e8Th_wdD!9 ZAF2I$&%WC8j6wgiq5r@z5>?5n{{n)!&&~h< delta 2438 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 __DIR__.'/../../support/datastructure/firehub.Storage.php', \FireHub\Core\Support\DataStructure\Storage\ArrStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrStorage.php', \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.GeneratorStorage.php', + \FireHub\Core\Support\DataStructure\Trait\EnumerableBehavior::class => __DIR__.'/../../support/datastructure/trait/firehub.EnumerableBehavior.php', \FireHub\Core\Support\DataStructure\Type\Linear::class => __DIR__.'/../../support/datastructure/type/firehub.Linear.php', \FireHub\Core\Support\LowLevel::class => __DIR__.'/../../support/firehub.LowLevel.php', \FireHub\Core\Support\LowLevel\Arr::class => __DIR__.'/../../support/lowlevel/firehub.Arr.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 520c43e1..0dd0f978 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -296,6 +296,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/storage/firehub.GeneratorStorage.php'; return; + case \FireHub\Core\Support\DataStructure\Trait\EnumerableBehavior::class: + require __DIR__.'/../../../support/datastructure/trait/firehub.EnumerableBehavior.php'; + return; + case \FireHub\Core\Support\DataStructure\Type\Linear::class: require __DIR__.'/../../../support/datastructure/type/firehub.Linear.php'; return; diff --git a/src/support/datastructure/abstraction/firehub.Collection.php b/src/support/datastructure/abstraction/firehub.Collection.php index 274dcd4b..db55bda6 100644 --- a/src/support/datastructure/abstraction/firehub.Collection.php +++ b/src/support/datastructure/abstraction/firehub.Collection.php @@ -27,6 +27,4 @@ * * @extends \FireHub\Core\Support\DataStructure\Abstraction\Enumerable */ -interface Collection extends Enumerable { - -} \ No newline at end of file +interface Collection extends Enumerable {} \ No newline at end of file diff --git a/src/support/datastructure/abstraction/firehub.Enumerable.php b/src/support/datastructure/abstraction/firehub.Enumerable.php index 50b354df..48e2ee9d 100644 --- a/src/support/datastructure/abstraction/firehub.Enumerable.php +++ b/src/support/datastructure/abstraction/firehub.Enumerable.php @@ -31,4 +31,33 @@ */ interface Enumerable extends DataStructure, IteratorAggregate { + /** + * ### Tap into the enumerable for side effects + * @since 1.0.0 + * + * @param callable(TValue, TKey):void $callback

+ * Function to call on each item in a data structure. + *

+ * + * @return $this + */ + public function tap (callable $callback):static; + + /** + * ### Call a user-generated function on each item in the data structure + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\ControlFlow\Signal::BREAK As signal. + * @uses \FireHub\Core\Shared\Enums\ControlFlow\Signal::CONTINUE As signal. + * + * @param callable(TValue, TKey):(\FireHub\Core\Shared\Enums\ControlFlow\Signal::BREAK|\FireHub\Core\Shared\Enums\ControlFlow\Signal::CONTINUE) $callback

+ * Function to call on each item in a data structure.
+ * Return `Signal::BREAK` to stop iteration early.
+ * Return `Signal::CONTINUE` to continue iteration. + *

+ * + * @return void + */ + public function each (callable $callback):void; + } \ No newline at end of file diff --git a/src/support/datastructure/abstraction/firehub.Stream.php b/src/support/datastructure/abstraction/firehub.Stream.php index 19fa007a..30e55e02 100644 --- a/src/support/datastructure/abstraction/firehub.Stream.php +++ b/src/support/datastructure/abstraction/firehub.Stream.php @@ -27,6 +27,4 @@ * * @extends \FireHub\Core\Support\DataStructure\Abstraction\Enumerable */ -interface Stream extends Enumerable { - -} \ No newline at end of file +interface Stream extends Enumerable {} \ No newline at end of file diff --git a/src/support/datastructure/collection/linear/firehub.Sequence.php b/src/support/datastructure/collection/linear/firehub.Sequence.php index 55dee9b6..09997390 100644 --- a/src/support/datastructure/collection/linear/firehub.Sequence.php +++ b/src/support/datastructure/collection/linear/firehub.Sequence.php @@ -19,6 +19,7 @@ Access\SequentialAccess, Behavior\Countable }; use FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Support\DataStructure\Trait\EnumerableBehavior; use Traversable; /** @@ -36,6 +37,14 @@ */ class Sequence implements Collection, Linear, Countable { + /** + * ### Enumerable Behavior Trait + * @since 1.0.0 + * + * @use \FireHub\Core\Support\DataStructure\Trait\EnumerableBehavior + */ + use EnumerableBehavior; + /** * ### Constructor * @since 1.0.0 @@ -79,10 +88,12 @@ public function count ():int { * @inheritDoc * * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage::entries() To get the entries of the storage for iteration. */ public function getIterator ():Traversable { - yield from []; + yield from $this->storage->entries(); } diff --git a/src/support/datastructure/trait/firehub.EnumerableBehavior.php b/src/support/datastructure/trait/firehub.EnumerableBehavior.php new file mode 100644 index 00000000..a693df01 --- /dev/null +++ b/src/support/datastructure/trait/firehub.EnumerableBehavior.php @@ -0,0 +1,126 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Trait; + +use FireHub\Core\Shared\Enums\ControlFlow\Signal; +use FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException; + +/** + * ### Enumerable Behavior Trait + * + * Reusable iteration behavior for data structures, providing common functional operations over any IteratorAggregate + * implementation with a consistent traversal model. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +trait EnumerableBehavior { + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructure\DS; + * + * $ds = DS::sequence()->fromArray(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $called = []; + * $ds->each( + * function ($value, $key) use (&$called):void { + * $called[] = $value; + * }); + * + * print $called; + * + * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] + * + * + * @since 1.0.0 + */ + public function tap (callable $callback):static { + + foreach ($this as $key => $value) + $callback($value, $key); + + return $this; + + } + + /** + * {@inheritDoc} + * + * + * use FireHub\Core\Support\DataStructure\DS; + * use FireHub\Core\Shared\Enums\ControlFlow\Signal; + * + * $ds = DS::sequence()->fromArray(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $called = []; + * $ds->each( + * function ($value, $key) use (&$called):Signal { + * $called[] = $value; + * return Signal::CONTINUE; + * }); + * + * print $called; + * + * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] + * + * + * You can also stop at any time with returning Signal::BREAK: + * + * use FireHub\Core\Support\DataStructure\DS; + * use FireHub\Core\Shared\Enums\ControlFlow\Signal; + * + * $ds = DS::sequence()->fromArray(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); + * + * $called = []; + * $ds->each( + * function ($value, $key) use (&$called):Signal { + * if ($value === 'Richard') return Signal::BREAK; + * echo $value.','; + * return Signal::CONTINUE; + * }); + * + * print $called; + * + * // ['John', 'Jane', 'Jane', 'Jane'] + * + * + * @since 1.0.0 + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException If the callback returns an + * invalid signal. + */ + public function each (callable $callback):void { + + foreach ($this as $key => $value) { + + $signal = $callback($value, $key); + + if ($signal === Signal::BREAK) break; + if ($signal === Signal::CONTINUE) continue; + throw WrongReturnTypeException::builder() + ->withContext([ + 'type' => $signal + ]) + ->build(); + + } + + } + +} \ No newline at end of file diff --git a/tests/unit/support/datastructure/collection/linear/SequenceTest.php b/tests/unit/support/datastructure/collection/linear/SequenceTest.php index 81dbce24..2280fb46 100644 --- a/tests/unit/support/datastructure/collection/linear/SequenceTest.php +++ b/tests/unit/support/datastructure/collection/linear/SequenceTest.php @@ -16,6 +16,8 @@ use FireHub\Core\Support\DataStructure\DS; use FireHub\Core\Support\DataStructure\Builder\SequenceBuilder; use FireHub\Core\Support\DataStructure\Collection\Linear\Sequence; +use FireHub\Core\Shared\Enums\ControlFlow\Signal; +use FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException; use PHPUnit\Framework\Attributes\ { CoversClass, Group, Small, TestWith }; @@ -46,4 +48,82 @@ public function testCount (int $expected, array $array):void { } + /** + * @since 1.0.0 + * + * @param array $array + * + * @return void + */ + #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testTap (array $array):void { + + $ds = DS::sequence()->fromArray($array); + + $called = []; + $ds->tap(function ($value, $key) use (&$called):void { + $called[] = $value; + }); + + self::assertSame(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'], $called); + + } + + /** + * @since 1.0.0 + * + * @param array $array + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException + * + * @return void + */ + #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testEach (array $array):void { + + $ds = DS::sequence()->fromArray($array); + + $called = []; + $ds->each(function ($value, $key) use (&$called):Signal { + $called[] = $value; + return Signal::CONTINUE; + }); + + self::assertSame(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'], $called); + + $called = []; + $ds->each(function ($value, $key) use (&$called):Signal { + if ($value === 'Richard') return Signal::BREAK; + $called[] = $value; + return Signal::CONTINUE; + }); + + self::assertSame(['John', 'Jane', 'Jane', 'Jane'], $called); + + } + + /** + * @since 1.0.0 + * + * @param array $array + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * + * @return void + */ + #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testEachWrongReturnSignal (array $array):void { + + $this->expectException(WrongReturnTypeException::class); + + $called = []; + DS::sequence()->fromArray($array)->each(function ($value, $key) use (&$called) { + if ($value === 'Richard') return false; + $called[] = $value; + return Signal::CONTINUE; + }); + + } + } \ No newline at end of file diff --git a/tests/unit/support/datastructure/storage/ArrStorageTest.php b/tests/unit/support/datastructure/storage/ArrStorageTest.php index 78df0422..3e45cebd 100644 --- a/tests/unit/support/datastructure/storage/ArrStorageTest.php +++ b/tests/unit/support/datastructure/storage/ArrStorageTest.php @@ -42,4 +42,18 @@ public function testCount (int $expected, array $array):void { } + /** + * @since 1.0.0 + * + * @param array $array + * + * @return void + */ + #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testEntries (array $array):void { + + self::assertSame($array, new ArrStorage($array)->entries()); + + } + } \ No newline at end of file diff --git a/tests/unit/support/datastructure/storage/GeneratorStorageTest.php b/tests/unit/support/datastructure/storage/GeneratorStorageTest.php index e4fc52ee..c333ae0c 100644 --- a/tests/unit/support/datastructure/storage/GeneratorStorageTest.php +++ b/tests/unit/support/datastructure/storage/GeneratorStorageTest.php @@ -14,6 +14,7 @@ use FireHub\Core\Testing\Base; use FireHub\Core\Support\DataStructure\Storage\GeneratorStorage; +use FireHub\Core\Support\LowLevel\Iterator; use PHPUnit\Framework\Attributes\ { CoversClass, Group, Small, TestWith }; @@ -45,4 +46,21 @@ public function testCount (int $expected, array $array):void { } + /** + * @since 1.0.0 + * + * @param array $array + * + * @return void + */ + #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] + public function testEntries (array $array):void { + + self::assertSame( + $array, + Iterator::toArray(new GeneratorStorage(static fn() => yield from $array)->entries()) + ); + + } + } \ No newline at end of file From 389a8c27794cf7fbf01c2088d64cf58db7670be4 Mon Sep 17 00:00:00 2001 From: Riddick Date: Fri, 17 Apr 2026 13:30:33 +0200 Subject: [PATCH 50/79] refactor: remove unused data structure class mappings from classmap --- dist/core.min.phar | Bin 216284 -> 204767 bytes dist/core.phar | Bin 696225 -> 670893 bytes src/support/autoload/classmap.php | 15 -- .../loader/firehub.CompiledClassmap.php | 60 -------- .../abstraction/firehub.Collection.php | 30 ---- .../abstraction/firehub.Enumerable.php | 63 --------- .../abstraction/firehub.Stream.php | 30 ---- .../builder/firehub.SequenceBuilder.php | 99 -------------- .../access/firehub.RandomAccess.php | 23 ---- .../access/firehub.SequentialAccess.php | 23 ---- .../access/firehub.StreamingAccess.php | 23 ---- .../capability/behavior/firehub.Countable.php | 25 ---- .../collection/linear/firehub.Sequence.php | 100 -------------- src/support/datastructure/firehub.DS.php | 46 ------- src/support/datastructure/firehub.Storage.php | 38 ------ .../storage/firehub.ArrStorage.php | 75 ---------- .../storage/firehub.GeneratorStorage.php | 88 ------------ .../trait/firehub.EnumerableBehavior.php | 126 ----------------- .../datastructure/type/firehub.Linear.php | 25 ---- .../collection/linear/SequenceTest.php | 129 ------------------ .../datastructure/storage/ArrStorageTest.php | 59 -------- .../storage/GeneratorStorageTest.php | 66 --------- 22 files changed, 1143 deletions(-) delete mode 100644 src/support/datastructure/abstraction/firehub.Collection.php delete mode 100644 src/support/datastructure/abstraction/firehub.Enumerable.php delete mode 100644 src/support/datastructure/abstraction/firehub.Stream.php delete mode 100644 src/support/datastructure/builder/firehub.SequenceBuilder.php delete mode 100644 src/support/datastructure/capability/access/firehub.RandomAccess.php delete mode 100644 src/support/datastructure/capability/access/firehub.SequentialAccess.php delete mode 100644 src/support/datastructure/capability/access/firehub.StreamingAccess.php delete mode 100644 src/support/datastructure/capability/behavior/firehub.Countable.php delete mode 100644 src/support/datastructure/collection/linear/firehub.Sequence.php delete mode 100644 src/support/datastructure/firehub.DS.php delete mode 100644 src/support/datastructure/firehub.Storage.php delete mode 100644 src/support/datastructure/storage/firehub.ArrStorage.php delete mode 100644 src/support/datastructure/storage/firehub.GeneratorStorage.php delete mode 100644 src/support/datastructure/trait/firehub.EnumerableBehavior.php delete mode 100644 src/support/datastructure/type/firehub.Linear.php delete mode 100644 tests/unit/support/datastructure/collection/linear/SequenceTest.php delete mode 100644 tests/unit/support/datastructure/storage/ArrStorageTest.php delete mode 100644 tests/unit/support/datastructure/storage/GeneratorStorageTest.php diff --git a/dist/core.min.phar b/dist/core.min.phar index cb9bd4b7c0a6adeb2c708cf7c98c30f24aa04147..3b930613aaf88eb0d7a2f80389600c707bd8641c 100644 GIT binary patch delta 2462 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 delta 15226 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 F{4X>1S=|5t diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index 74107361..6975b55d 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -78,21 +78,6 @@ \FireHub\Core\Support\Bootstrap\Bootloader\RegisterHelpers::class => __DIR__.'/../../support/bootstrap/bootloader/firehub.RegisterHelpers.php', \FireHub\Core\Support\Bootstrap\FireHubConfigurator::class => __DIR__.'/../../support/bootstrap/firehub.FireHubConfigurator.php', \FireHub\Core\Support\Contracts\DataStructure::class => __DIR__.'/../../support/contracts/firehub.DataStructure.php', - \FireHub\Core\Support\DataStructure\Abstraction\Collection::class => __DIR__.'/../../support/datastructure/abstraction/firehub.Collection.php', - \FireHub\Core\Support\DataStructure\Abstraction\Enumerable::class => __DIR__.'/../../support/datastructure/abstraction/firehub.Enumerable.php', - \FireHub\Core\Support\DataStructure\Abstraction\Stream::class => __DIR__.'/../../support/datastructure/abstraction/firehub.Stream.php', - \FireHub\Core\Support\DataStructure\Builder\SequenceBuilder::class => __DIR__.'/../../support/datastructure/builder/firehub.SequenceBuilder.php', - \FireHub\Core\Support\DataStructure\Capability\Access\RandomAccess::class => __DIR__.'/../../support/datastructure/capability/access/firehub.RandomAccess.php', - \FireHub\Core\Support\DataStructure\Capability\Access\SequentialAccess::class => __DIR__.'/../../support/datastructure/capability/access/firehub.SequentialAccess.php', - \FireHub\Core\Support\DataStructure\Capability\Access\StreamingAccess::class => __DIR__.'/../../support/datastructure/capability/access/firehub.StreamingAccess.php', - \FireHub\Core\Support\DataStructure\Capability\Behavior\Countable::class => __DIR__.'/../../support/datastructure/capability/behavior/firehub.Countable.php', - \FireHub\Core\Support\DataStructure\Collection\Linear\Sequence::class => __DIR__.'/../../support/datastructure/collection/linear/firehub.Sequence.php', - \FireHub\Core\Support\DataStructure\DS::class => __DIR__.'/../../support/datastructure/firehub.DS.php', - \FireHub\Core\Support\DataStructure\Storage::class => __DIR__.'/../../support/datastructure/firehub.Storage.php', - \FireHub\Core\Support\DataStructure\Storage\ArrStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrStorage.php', - \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.GeneratorStorage.php', - \FireHub\Core\Support\DataStructure\Trait\EnumerableBehavior::class => __DIR__.'/../../support/datastructure/trait/firehub.EnumerableBehavior.php', - \FireHub\Core\Support\DataStructure\Type\Linear::class => __DIR__.'/../../support/datastructure/type/firehub.Linear.php', \FireHub\Core\Support\LowLevel::class => __DIR__.'/../../support/firehub.LowLevel.php', \FireHub\Core\Support\LowLevel\Arr::class => __DIR__.'/../../support/lowlevel/firehub.Arr.php', \FireHub\Core\Support\LowLevel\CharMB::class => __DIR__.'/../../support/lowlevel/firehub.CharMB.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 0dd0f978..80e72df9 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -244,66 +244,6 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/contracts/firehub.DataStructure.php'; return; - case \FireHub\Core\Support\DataStructure\Abstraction\Collection::class: - require __DIR__.'/../../../support/datastructure/abstraction/firehub.Collection.php'; - return; - - case \FireHub\Core\Support\DataStructure\Abstraction\Enumerable::class: - require __DIR__.'/../../../support/datastructure/abstraction/firehub.Enumerable.php'; - return; - - case \FireHub\Core\Support\DataStructure\Abstraction\Stream::class: - require __DIR__.'/../../../support/datastructure/abstraction/firehub.Stream.php'; - return; - - case \FireHub\Core\Support\DataStructure\Builder\SequenceBuilder::class: - require __DIR__.'/../../../support/datastructure/builder/firehub.SequenceBuilder.php'; - return; - - case \FireHub\Core\Support\DataStructure\Capability\Access\RandomAccess::class: - require __DIR__.'/../../../support/datastructure/capability/access/firehub.RandomAccess.php'; - return; - - case \FireHub\Core\Support\DataStructure\Capability\Access\SequentialAccess::class: - require __DIR__.'/../../../support/datastructure/capability/access/firehub.SequentialAccess.php'; - return; - - case \FireHub\Core\Support\DataStructure\Capability\Access\StreamingAccess::class: - require __DIR__.'/../../../support/datastructure/capability/access/firehub.StreamingAccess.php'; - return; - - case \FireHub\Core\Support\DataStructure\Capability\Behavior\Countable::class: - require __DIR__.'/../../../support/datastructure/capability/behavior/firehub.Countable.php'; - return; - - case \FireHub\Core\Support\DataStructure\Collection\Linear\Sequence::class: - require __DIR__.'/../../../support/datastructure/collection/linear/firehub.Sequence.php'; - return; - - case \FireHub\Core\Support\DataStructure\DS::class: - require __DIR__.'/../../../support/datastructure/firehub.DS.php'; - return; - - case \FireHub\Core\Support\DataStructure\Storage::class: - require __DIR__.'/../../../support/datastructure/firehub.Storage.php'; - return; - - case \FireHub\Core\Support\DataStructure\Storage\ArrStorage::class: - require __DIR__.'/../../../support/datastructure/storage/firehub.ArrStorage.php'; - return; - - case \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::class: - require __DIR__.'/../../../support/datastructure/storage/firehub.GeneratorStorage.php'; - return; - - case \FireHub\Core\Support\DataStructure\Trait\EnumerableBehavior::class: - require __DIR__.'/../../../support/datastructure/trait/firehub.EnumerableBehavior.php'; - return; - - case \FireHub\Core\Support\DataStructure\Type\Linear::class: - require __DIR__.'/../../../support/datastructure/type/firehub.Linear.php'; - return; - case \FireHub\Core\Support\LowLevel::class: require __DIR__.'/../../../support/firehub.LowLevel.php'; return; diff --git a/src/support/datastructure/abstraction/firehub.Collection.php b/src/support/datastructure/abstraction/firehub.Collection.php deleted file mode 100644 index db55bda6..00000000 --- a/src/support/datastructure/abstraction/firehub.Collection.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Abstraction; - -/** - * ### Collection Contract - * - * A Collection is a structured, stateful data container that stores and manages a finite set of elements. It - * provides consistent, repeatable iteration and supports common data operations such as adding, removing, - * and transforming items while preserving internal state and order guarantees depending on its specific type - * (e.g., linear, associative, or set-based). - * @since 1.0.0 - * - * @template TKey - * @template TValue - * - * @extends \FireHub\Core\Support\DataStructure\Abstraction\Enumerable - */ -interface Collection extends Enumerable {} \ No newline at end of file diff --git a/src/support/datastructure/abstraction/firehub.Enumerable.php b/src/support/datastructure/abstraction/firehub.Enumerable.php deleted file mode 100644 index 48e2ee9d..00000000 --- a/src/support/datastructure/abstraction/firehub.Enumerable.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Abstraction; - -use FireHub\Core\Support\Contracts\DataStructure; -use FireHub\Core\Shared\Contracts\IteratorAggregate; - -/** - * ### Enumerable Contract - * - * Defines the ability to iterate over all elements in a structure. Provides higher-level traversal operations such - * as mapping, filtering, and transformation, typically built on top of a traversal mechanism. - * @since 1.0.0 - * - * @template TKey - * @template TValue - * - * @extends \FireHub\Core\Support\Contracts\DataStructure - * @extends \FireHub\Core\Shared\Contracts\IteratorAggregate - */ -interface Enumerable extends DataStructure, IteratorAggregate { - - /** - * ### Tap into the enumerable for side effects - * @since 1.0.0 - * - * @param callable(TValue, TKey):void $callback

- * Function to call on each item in a data structure. - *

- * - * @return $this - */ - public function tap (callable $callback):static; - - /** - * ### Call a user-generated function on each item in the data structure - * @since 1.0.0 - * - * @uses \FireHub\Core\Shared\Enums\ControlFlow\Signal::BREAK As signal. - * @uses \FireHub\Core\Shared\Enums\ControlFlow\Signal::CONTINUE As signal. - * - * @param callable(TValue, TKey):(\FireHub\Core\Shared\Enums\ControlFlow\Signal::BREAK|\FireHub\Core\Shared\Enums\ControlFlow\Signal::CONTINUE) $callback

- * Function to call on each item in a data structure.
- * Return `Signal::BREAK` to stop iteration early.
- * Return `Signal::CONTINUE` to continue iteration. - *

- * - * @return void - */ - public function each (callable $callback):void; - -} \ No newline at end of file diff --git a/src/support/datastructure/abstraction/firehub.Stream.php b/src/support/datastructure/abstraction/firehub.Stream.php deleted file mode 100644 index 30e55e02..00000000 --- a/src/support/datastructure/abstraction/firehub.Stream.php +++ /dev/null @@ -1,30 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Abstraction; - -/** - * ### Stream Contract - * - * A Stream is a lazy, single-pass data structure that produces elements on demand during iteration. It does not - * store data in memory as a collection but instead computes or retrieves each element as it is traversed. - * Streams are ideal for processing large or infinite datasets, enabling transformations and operations like mapping - * and filtering without materializing the entire dataset. - * @since 1.0.0 - * - * @template TKey - * @template TValue - * - * @extends \FireHub\Core\Support\DataStructure\Abstraction\Enumerable - */ -interface Stream extends Enumerable {} \ No newline at end of file diff --git a/src/support/datastructure/builder/firehub.SequenceBuilder.php b/src/support/datastructure/builder/firehub.SequenceBuilder.php deleted file mode 100644 index 8ccf7a4f..00000000 --- a/src/support/datastructure/builder/firehub.SequenceBuilder.php +++ /dev/null @@ -1,99 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Builder; - -use FireHub\Core\Support\DataStructure\Collection\Linear\Sequence; -use FireHub\Core\Support\DataStructure\Capability\Access\SequentialAccess; -use FireHub\Core\Support\DataStructure\ { - Storage, Storage\ArrStorage -}; -use FireHub\Core\Support\LowLevel\Arr; - -/** - * ### Sequence Builder - * - * Provides a scoped construction API for creating Sequence data structures.
- * Handles normalization and storage selection while keeping the Sequence model clean. - * @since 1.0.0 - */ -final class SequenceBuilder { - - /** - * ### Create Sequence from storage - * - * Uses an existing storage implementation that supports sequential access. - * @since 1.0.0 - * - * @template TValue - * - * @param \FireHub\Core\Support\DataStructure\Storage&\FireHub\Core\Support\DataStructure\Capability\Access\SequentialAccess $storage

- * Storage instance that provides sequential access to the data. - *

- * - * @return Sequence New Sequence instance. - */ - public function fromStorage (Storage&SequentialAccess $storage):Sequence { - - return new Sequence($storage); - - } - - - /** - * ### Create Sequence from an array - * Normalizes array keys into a sequential integer index. - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Arr::values() To reindex the input array with sequential integer keys. - * - * @template TValue - * - * @param array $array

- * The array to convert into a Sequence. - *

- * - * @return Sequence New Sequence instance. - */ - public function fromArray (array $array):Sequence { - - return new Sequence( - new ArrStorage(Arr::values($array)) - ); - - } - - /** - * ### Create Sequence from values - * Builds a Sequence directly from given values without additional normalization. - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Arr::values() To reindex the input values with sequential integer keys. - * - * @template TValue - * - * @param TValue ...$values

- * Variadic list of values to include in the Sequence. - *

- * - * @return Sequence New Sequence instance. - */ - public function of (mixed ...$values):Sequence { - - return new Sequence( - new ArrStorage(Arr::values($values)) - ); - - } - -} \ No newline at end of file diff --git a/src/support/datastructure/capability/access/firehub.RandomAccess.php b/src/support/datastructure/capability/access/firehub.RandomAccess.php deleted file mode 100644 index e6fc9e13..00000000 --- a/src/support/datastructure/capability/access/firehub.RandomAccess.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Capability\Access; - -/** - * ### Random Access - * - * Defines the ability to access elements directly by key or index in constant or near-constant time. It allows - * non-sequential retrieval of elements without iterating through the structure. - * @since 1.0.0 - */ -interface RandomAccess {} \ No newline at end of file diff --git a/src/support/datastructure/capability/access/firehub.SequentialAccess.php b/src/support/datastructure/capability/access/firehub.SequentialAccess.php deleted file mode 100644 index d97e93e8..00000000 --- a/src/support/datastructure/capability/access/firehub.SequentialAccess.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Capability\Access; - -/** - * ### Sequential Access - * - * Defines the ability to access elements in a strict sequential order, one after another, from beginning to end. It - * guarantees ordered traversal but does not provide direct access to arbitrary positions without iteration. - * @since 1.0.0 - */ -interface SequentialAccess {} \ No newline at end of file diff --git a/src/support/datastructure/capability/access/firehub.StreamingAccess.php b/src/support/datastructure/capability/access/firehub.StreamingAccess.php deleted file mode 100644 index e498fe13..00000000 --- a/src/support/datastructure/capability/access/firehub.StreamingAccess.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Capability\Access; - -/** - * ### Streaming Access - * - * Defines the ability to access elements in a single-pass, forward-only manner where each element is produced or - * consumed once. It does not support revisiting or random retrieval of previously seen elements. - * @since 1.0.0 - */ -interface StreamingAccess {} \ No newline at end of file diff --git a/src/support/datastructure/capability/behavior/firehub.Countable.php b/src/support/datastructure/capability/behavior/firehub.Countable.php deleted file mode 100644 index 10cb7d8d..00000000 --- a/src/support/datastructure/capability/behavior/firehub.Countable.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Capability\Behavior; - -use FireHub\Core\Shared\Contracts\Countable as CountableContract; - -/** - * ### Countable Behavior Contract - * - * Defines the ability to determine the number of elements within a structure. Ensures that the structure can provide - * a consistent and reliable size or element count at any given time. - * @since 1.0.0 - */ -interface Countable extends CountableContract {} \ No newline at end of file diff --git a/src/support/datastructure/collection/linear/firehub.Sequence.php b/src/support/datastructure/collection/linear/firehub.Sequence.php deleted file mode 100644 index 09997390..00000000 --- a/src/support/datastructure/collection/linear/firehub.Sequence.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Collection\Linear; - -use FireHub\Core\Support\DataStructure\Abstraction\Collection; -use FireHub\Core\Support\DataStructure\Type\Linear; -use FireHub\Core\Support\DataStructure\Capability\ { - Access\SequentialAccess, Behavior\Countable -}; -use FireHub\Core\Support\DataStructure\Storage; -use FireHub\Core\Support\DataStructure\Trait\EnumerableBehavior; -use Traversable; - -/** - * ### Sequence Data Structure - * - * A fundamental linear structure that maintains a strict ordering of elements. Provides predictable iteration, stable - * indexing (depending on storage), and serves as a base abstraction for other linear collections. - * @since 1.0.0 - * - * @template TValue - * - * @implements \FireHub\Core\Support\DataStructure\Abstraction\Collection - * - * @phpstan-type StorageType = (\FireHub\Core\Support\DataStructure\Storage&\FireHub\Core\Support\DataStructure\Capability\Access\SequentialAccess) - */ -class Sequence implements Collection, Linear, Countable { - - /** - * ### Enumerable Behavior Trait - * @since 1.0.0 - * - * @use \FireHub\Core\Support\DataStructure\Trait\EnumerableBehavior - */ - use EnumerableBehavior; - - /** - * ### Constructor - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage As parameter. - * - * @param StorageType $storage

- * Underlying storage data. - *

- * - * @return void - */ - public function __construct ( - protected Storage&SequentialAccess $storage - ) {} - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructure\DS; - * - * $ds = DS::sequence()->fromArray(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $ds->count(); - * - * // 6 - * - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage::count() To count the number of elements in the sequence. - */ - public function count ():int { - - return $this->storage->count(); - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage::entries() To get the entries of the storage for iteration. - */ - public function getIterator ():Traversable { - - yield from $this->storage->entries(); - - } - -} \ No newline at end of file diff --git a/src/support/datastructure/firehub.DS.php b/src/support/datastructure/firehub.DS.php deleted file mode 100644 index 133a1156..00000000 --- a/src/support/datastructure/firehub.DS.php +++ /dev/null @@ -1,46 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure; - -use FireHub\Core\Support\DataStructure\Builder\SequenceBuilder; - -/** - * ### Core Data Structure Abstraction Layer - * - * Defines the fundamental abstraction for all data structures in the FireHub ecosystem. It provides a unified - * foundation for representing and working with different structural types such as collections, records, streams, and - * hierarchical models, ensuring consistent behavior, type safety, and interchangeable storage implementations across - * the system. - * @since 1.0.0 - * - * @template TKey - * @template TValue - */ -final class DS { - - /** - * ### Sequence Builder - * - * Creates a builder for constructing linear sequence structures. - * @since 1.0.0 - * - * @return \FireHub\Core\Support\DataStructure\Builder\SequenceBuilder The builder instance. - */ - public static function sequence ():SequenceBuilder { - - return new SequenceBuilder(); - - } - -} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Storage.php b/src/support/datastructure/firehub.Storage.php deleted file mode 100644 index 01acae3a..00000000 --- a/src/support/datastructure/firehub.Storage.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure; - -use FireHub\Core\Support\DataStructure\Capability\Behavior\Countable; - -/** - * ### Storage Abstraction Layer - * - * Root contract for all storage implementations in the system. Defines the base rules for how data is persisted, - * accessed, and managed regardless of the underlying memory model (array, linked, generator, or external source). - * @since 1.0.0 - * - * @template TKey - * @template TValue - */ -interface Storage extends Countable { - - /** - * ### Get all entries from the storage - * @since 1.0.0 - * - * @return iterable - */ - public function entries ():iterable; - -} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.ArrStorage.php b/src/support/datastructure/storage/firehub.ArrStorage.php deleted file mode 100644 index 68895ed9..00000000 --- a/src/support/datastructure/storage/firehub.ArrStorage.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Storage; - -use FireHub\Core\Support\DataStructure\Storage; -use FireHub\Core\Support\DataStructure\Capability\Access\ { - RandomAccess, SequentialAccess -}; -use FireHub\Core\Support\LowLevel\Arr; - -/** - * ### Array-Based Storage - * - * In-memory storage implementation based on contiguous array structures. Provides fast sequential and random access - * with predictable performance characteristics. - * @since 1.0.0 - * - * @template TKey of array-key - * @template TValue - * - * @implements \FireHub\Core\Support\DataStructure\Storage - */ -class ArrStorage implements Storage, RandomAccess, SequentialAccess { - - /** - * ### Constructor - * @since 1.0.0 - * - * @param array $data

- * Initial data to store. - *

- * - * @return void - */ - public function __construct ( - protected array $data = [] - ) {} - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Arr::count() To count the number of elements in the storage. - */ - public function count ():int { - - return Arr::count($this->data); - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function entries ():iterable { - - return $this->data; - - } - - -} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.GeneratorStorage.php b/src/support/datastructure/storage/firehub.GeneratorStorage.php deleted file mode 100644 index bcfaec0b..00000000 --- a/src/support/datastructure/storage/firehub.GeneratorStorage.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Storage; - -use FireHub\Core\Support\DataStructure\Storage; -use FireHub\Core\Support\DataStructure\Capability\Access\StreamingAccess; -use FireHub\Core\Support\LowLevel\Iterator; -use Closure, Generator; - -/** - * ### Generator-Based Storage - * - * Lazy, streaming-oriented storage implementation that produces elements on demand. Ideal for large or infinite - * datasets where full materialization is not possible or desired. - * @since 1.0.0 - * - * @template TKey - * @template TValue - * - * @implements \FireHub\Core\Support\DataStructure\Storage - */ -class GeneratorStorage implements Storage, StreamingAccess { - - /** - * ### Constructor - * @since 1.0.0 - * - * @param Closure():Generator $callable

- * The callable that produces the generator. - *

- * - * @return void - */ - public function __construct ( - protected Closure $callable - ) {} - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Iterator::count() To count the number of elements in the storage. - */ - public function count ():int { - - return Iterator::count($this->create()); - - } - - /** - * ### Creates the generator - * @since 1.0.0 - * - * @return Generator The generator produced by the callable. - */ - private function create ():Generator { - - yield from ($this->callable)(); - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::create() To produce the generator for - * entries. - */ - public function entries ():iterable { - - return $this->create(); - - } - -} \ No newline at end of file diff --git a/src/support/datastructure/trait/firehub.EnumerableBehavior.php b/src/support/datastructure/trait/firehub.EnumerableBehavior.php deleted file mode 100644 index a693df01..00000000 --- a/src/support/datastructure/trait/firehub.EnumerableBehavior.php +++ /dev/null @@ -1,126 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Trait; - -use FireHub\Core\Shared\Enums\ControlFlow\Signal; -use FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException; - -/** - * ### Enumerable Behavior Trait - * - * Reusable iteration behavior for data structures, providing common functional operations over any IteratorAggregate - * implementation with a consistent traversal model. - * @since 1.0.0 - * - * @template TKey - * @template TValue - */ -trait EnumerableBehavior { - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructure\DS; - * - * $ds = DS::sequence()->fromArray(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $called = []; - * $ds->each( - * function ($value, $key) use (&$called):void { - * $called[] = $value; - * }); - * - * print $called; - * - * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] - * - * - * @since 1.0.0 - */ - public function tap (callable $callback):static { - - foreach ($this as $key => $value) - $callback($value, $key); - - return $this; - - } - - /** - * {@inheritDoc} - * - * - * use FireHub\Core\Support\DataStructure\DS; - * use FireHub\Core\Shared\Enums\ControlFlow\Signal; - * - * $ds = DS::sequence()->fromArray(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $called = []; - * $ds->each( - * function ($value, $key) use (&$called):Signal { - * $called[] = $value; - * return Signal::CONTINUE; - * }); - * - * print $called; - * - * // ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'] - * - * - * You can also stop at any time with returning Signal::BREAK: - * - * use FireHub\Core\Support\DataStructure\DS; - * use FireHub\Core\Shared\Enums\ControlFlow\Signal; - * - * $ds = DS::sequence()->fromArray(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']); - * - * $called = []; - * $ds->each( - * function ($value, $key) use (&$called):Signal { - * if ($value === 'Richard') return Signal::BREAK; - * echo $value.','; - * return Signal::CONTINUE; - * }); - * - * print $called; - * - * // ['John', 'Jane', 'Jane', 'Jane'] - * - * - * @since 1.0.0 - * - * @throws \FireHub\Core\Shared\Contracts\Throwable - * @throws \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException If the callback returns an - * invalid signal. - */ - public function each (callable $callback):void { - - foreach ($this as $key => $value) { - - $signal = $callback($value, $key); - - if ($signal === Signal::BREAK) break; - if ($signal === Signal::CONTINUE) continue; - throw WrongReturnTypeException::builder() - ->withContext([ - 'type' => $signal - ]) - ->build(); - - } - - } - -} \ No newline at end of file diff --git a/src/support/datastructure/type/firehub.Linear.php b/src/support/datastructure/type/firehub.Linear.php deleted file mode 100644 index 0eeb5d62..00000000 --- a/src/support/datastructure/type/firehub.Linear.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Type; - -/** - * ### Linear Data Structure - * - * A Linear data structure type defines a sequential organization of elements where each item has a clear position in - * a single-ordered sequence. It guarantees predictable traversal from one element to the next, typically supporting - * operations such as head/tail access, sequential iteration, and ordered insertion or removal depending on the - * underlying collection. - * @since 1.0.0 - */ -interface Linear {} \ No newline at end of file diff --git a/tests/unit/support/datastructure/collection/linear/SequenceTest.php b/tests/unit/support/datastructure/collection/linear/SequenceTest.php deleted file mode 100644 index 2280fb46..00000000 --- a/tests/unit/support/datastructure/collection/linear/SequenceTest.php +++ /dev/null @@ -1,129 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @package Core\Test - */ - -namespace FireHub\Tests\Unit\Support\DataStructure\Collection\Linear; - -use FireHub\Core\Testing\Base; -use FireHub\Core\Support\DataStructure\DS; -use FireHub\Core\Support\DataStructure\Builder\SequenceBuilder; -use FireHub\Core\Support\DataStructure\Collection\Linear\Sequence; -use FireHub\Core\Shared\Enums\ControlFlow\Signal; -use FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException; -use PHPUnit\Framework\Attributes\ { - CoversClass, Group, Small, TestWith -}; - -/** - * ### Test Sequence Data Structure - * @since 1.0.0 - */ -#[Small] -#[Group('support')] -#[CoversClass(DS::class)] -#[CoversClass(SequenceBuilder::class)] -#[CoversClass(Sequence::class)] -final class SequenceTest extends Base { - - /** - * @since 1.0.0 - * - * @param int $expected - * @param array $array - * - * @return void - */ - #[TestWith([6, ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testCount (int $expected, array $array):void { - - self::assertSame($expected, DS::sequence()->fromArray($array)->count()); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @return void - */ - #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testTap (array $array):void { - - $ds = DS::sequence()->fromArray($array); - - $called = []; - $ds->tap(function ($value, $key) use (&$called):void { - $called[] = $value; - }); - - self::assertSame(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'], $called); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @throws \FireHub\Core\Shared\Contracts\Throwable - * @throws \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException - * - * @return void - */ - #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testEach (array $array):void { - - $ds = DS::sequence()->fromArray($array); - - $called = []; - $ds->each(function ($value, $key) use (&$called):Signal { - $called[] = $value; - return Signal::CONTINUE; - }); - - self::assertSame(['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard'], $called); - - $called = []; - $ds->each(function ($value, $key) use (&$called):Signal { - if ($value === 'Richard') return Signal::BREAK; - $called[] = $value; - return Signal::CONTINUE; - }); - - self::assertSame(['John', 'Jane', 'Jane', 'Jane'], $called); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @throws \FireHub\Core\Shared\Contracts\Throwable - * - * @return void - */ - #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testEachWrongReturnSignal (array $array):void { - - $this->expectException(WrongReturnTypeException::class); - - $called = []; - DS::sequence()->fromArray($array)->each(function ($value, $key) use (&$called) { - if ($value === 'Richard') return false; - $called[] = $value; - return Signal::CONTINUE; - }); - - } - -} \ No newline at end of file diff --git a/tests/unit/support/datastructure/storage/ArrStorageTest.php b/tests/unit/support/datastructure/storage/ArrStorageTest.php deleted file mode 100644 index 3e45cebd..00000000 --- a/tests/unit/support/datastructure/storage/ArrStorageTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @package Core\Test - */ - -namespace FireHub\Tests\Unit\Support\DataStructure\Storage; - -use FireHub\Core\Testing\Base; -use FireHub\Core\Support\DataStructure\Storage\ArrStorage; -use PHPUnit\Framework\Attributes\ { - CoversClass, Group, Small, TestWith -}; - -/** - * ### Test Array-Based Storage - * @since 1.0.0 - */ -#[Small] -#[Group('support')] -#[CoversClass(ArrStorage::class)] -final class ArrStorageTest extends Base { - - /** - * @since 1.0.0 - * - * @param int $expected - * @param array $array - * - * @return void - */ - #[TestWith([6, ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testCount (int $expected, array $array):void { - - self::assertSame($expected, new ArrStorage($array)->count()); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @return void - */ - #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testEntries (array $array):void { - - self::assertSame($array, new ArrStorage($array)->entries()); - - } - -} \ No newline at end of file diff --git a/tests/unit/support/datastructure/storage/GeneratorStorageTest.php b/tests/unit/support/datastructure/storage/GeneratorStorageTest.php deleted file mode 100644 index c333ae0c..00000000 --- a/tests/unit/support/datastructure/storage/GeneratorStorageTest.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @package Core\Test - */ - -namespace FireHub\Tests\Unit\Support\DataStructure\Storage; - -use FireHub\Core\Testing\Base; -use FireHub\Core\Support\DataStructure\Storage\GeneratorStorage; -use FireHub\Core\Support\LowLevel\Iterator; -use PHPUnit\Framework\Attributes\ { - CoversClass, Group, Small, TestWith -}; - -/** - * ### Test Generator-Based Storage - * @since 1.0.0 - */ -#[Small] -#[Group('support')] -#[CoversClass(GeneratorStorage::class)] -final class GeneratorStorageTest extends Base { - - /** - * @since 1.0.0 - * - * @param int $expected - * @param array $array - * - * @return void - */ - #[TestWith([6, ['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testCount (int $expected, array $array):void { - - self::assertSame( - $expected, - new GeneratorStorage(static fn() => yield from $array)->count() - ); - - } - - /** - * @since 1.0.0 - * - * @param array $array - * - * @return void - */ - #[TestWith([['John', 'Jane', 'Jane', 'Jane', 'Richard', 'Richard']])] - public function testEntries (array $array):void { - - self::assertSame( - $array, - Iterator::toArray(new GeneratorStorage(static fn() => yield from $array)->entries()) - ); - - } - -} \ No newline at end of file From 41cc1e11afccf0a248d5fd62de9debfd11c9909b Mon Sep 17 00:00:00 2001 From: Riddick Date: Thu, 23 Apr 2026 08:39:56 +0200 Subject: [PATCH 51/79] feat: add `EmptyStructureException` and improve exception message consistency **Detailed Description:** 1. **Introduction of `EmptyStructureException`:** - Created `EmptyStructureException` class for handling cases where a `DataStructure` is unexpectedly empty. - Includes a default message: "DataStructure is empty." 2. **Improvements to `WrongReturnTypeException`:** - Corrected typos and improved formatting in class description and the default exception message for clarity and consistency. - Updated: "Datastructure has retuned the wrong type." to "DataStructure has returned the wrong type." **Key Benefits:** - Establishes a dedicated exception for empty data structures, ensuring clearer and more precise error handling. - Enhances overall code quality and consistency in exception messaging. --- .../firehub.EmptyStructureException.php | 31 +++++++++++++++++++ .../firehub.WrongReturnTypeException.php | 4 +-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/throwable/exception/datastructure/firehub.EmptyStructureException.php diff --git a/src/throwable/exception/datastructure/firehub.EmptyStructureException.php b/src/throwable/exception/datastructure/firehub.EmptyStructureException.php new file mode 100644 index 00000000..2f37276f --- /dev/null +++ b/src/throwable/exception/datastructure/firehub.EmptyStructureException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### DataStructure is empty + * @since 1.0.0 + */ +class EmptyStructureException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'DataStructure is empty.'; + +} \ No newline at end of file diff --git a/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php b/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php index ef5e9470..c8b2d0f7 100644 --- a/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php +++ b/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php @@ -16,7 +16,7 @@ use FireHub\Core\Throwable\Exception; /** - * ### Datastructure returns wrong type + * ### DataStructure returns the wrong type * @since 1.0.0 */ class WrongReturnTypeException extends Exception { @@ -26,6 +26,6 @@ class WrongReturnTypeException extends Exception { * * @since 1.0.0 */ - protected const string DEFAULT_MESSAGE = 'Datastructure has retuned the wrong type.'; + protected const string DEFAULT_MESSAGE = 'DataStructure has retuned the wrong type.'; } \ No newline at end of file From 7a6f81dc0b8fb1778b0e3e59c625d6ffa82a4aa6 Mon Sep 17 00:00:00 2001 From: Riddick Date: Thu, 23 Apr 2026 08:51:04 +0200 Subject: [PATCH 52/79] feat: add `EmptyStructureException` and improve exception message consistency **Detailed Description:** 1. **Introduction of `EmptyStructureException`:** - Created `EmptyStructureException` class for handling cases where a `DataStructure` is unexpectedly empty. - Includes a default message: "DataStructure is empty." 2. **Improvements to `WrongReturnTypeException`:** - Corrected typos and improved formatting in class description and the default exception message for clarity and consistency. - Updated: "Datastructure has retuned the wrong type." to "DataStructure has returned the wrong type." **Key Benefits:** - Establishes a dedicated exception for empty data structures, ensuring clearer and more precise error handling. - Enhances overall code quality and consistency in exception messaging. --- ...ureException.php => firehub.EmptyDataStructureException.php} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/throwable/exception/datastructure/{firehub.EmptyStructureException.php => firehub.EmptyDataStructureException.php} (92%) diff --git a/src/throwable/exception/datastructure/firehub.EmptyStructureException.php b/src/throwable/exception/datastructure/firehub.EmptyDataStructureException.php similarity index 92% rename from src/throwable/exception/datastructure/firehub.EmptyStructureException.php rename to src/throwable/exception/datastructure/firehub.EmptyDataStructureException.php index 2f37276f..d08d8528 100644 --- a/src/throwable/exception/datastructure/firehub.EmptyStructureException.php +++ b/src/throwable/exception/datastructure/firehub.EmptyDataStructureException.php @@ -19,7 +19,7 @@ * ### DataStructure is empty * @since 1.0.0 */ -class EmptyStructureException extends Exception { +class EmptyDataStructureException extends Exception { /** * @inheritdoc From dc34c56563924b80229bceb7a4d5eb14543190c2 Mon Sep 17 00:00:00 2001 From: Riddick Date: Mon, 27 Apr 2026 09:27:31 +0200 Subject: [PATCH 53/79] feat: add `Enumerable` and `Collection` interfaces to strengthen data structure hierarchy **Detailed Description:** 1. **Introduction of `Enumerable` Interface:** - Added `Enumerable` interface to represent iterable data structures with a standardized contract for traversal. - Extends core `DataStructure` and `IteratorAggregate` contracts. - Improves type consistency across data structures and simplifies iteration handling. 2. **Addition of `Collection` Interface:** - Introduced `Collection` interface as an extension of `Enumerable`. - Designed for stateful, in-memory data structures with finite elements. - Serves as a base abstraction for diverse collection types (e.g., linear, associative, set-based). 3. **Classmap Enhancements:** - Updated `classmap` and `compiled classmap` to include `Enumerable` and `Collection` interfaces. - Ensures proper autoloading of new interfaces for seamless integration with the system. 4. **Refinements to `DataStructure`:** - Updated the `DataStructure` interface to redefine its purpose as a root abstraction for classifying and interacting with data structures. - Enhanced the documentation to clarify its role within the architectural boundaries. 5. **PHAR Regeneration:** - Regenerated `core.phar` and `core.min.phar` to incorporate the newly added interfaces and changes. **Key Benefits:** - Strengthens FireHub's modular data structure hierarchy with foundational contracts. - Simplifies future extension of enumerable and collection-based abstractions. - Improves autoloading efficiency and runtime consistency for enterprise environments. --- dist/core.min.phar | Bin 204767 -> 206644 bytes dist/core.phar | Bin 670893 -> 668789 bytes src/support/autoload/classmap.php | 3 ++ .../loader/firehub.CompiledClassmap.php | 12 +++++++ .../contracts/firehub.DataStructure.php | 10 ++++-- .../contracts/firehub.Collection.php | 31 +++++++++++++++++ .../datastructure/firehub.Enumerable.php | 32 ++++++++++++++++++ 7 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/support/datastructure/contracts/firehub.Collection.php create mode 100644 src/support/datastructure/firehub.Enumerable.php diff --git a/dist/core.min.phar b/dist/core.min.phar index 3b930613aaf88eb0d7a2f80389600c707bd8641c..5fbb3d0190e19d56123bbd576b57afa8a1259a6d 100644 GIT binary patch delta 3353 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 a+g84?OMPRhrqT(#t9XMyC-ZZr=KLSSzgJ@b delta 5242 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 I`IGYh4-{3cMF0Q* diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index 6975b55d..41c3ae32 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -78,6 +78,8 @@ \FireHub\Core\Support\Bootstrap\Bootloader\RegisterHelpers::class => __DIR__.'/../../support/bootstrap/bootloader/firehub.RegisterHelpers.php', \FireHub\Core\Support\Bootstrap\FireHubConfigurator::class => __DIR__.'/../../support/bootstrap/firehub.FireHubConfigurator.php', \FireHub\Core\Support\Contracts\DataStructure::class => __DIR__.'/../../support/contracts/firehub.DataStructure.php', + \FireHub\Core\Support\DataStructure\Contracts\Collection::class => __DIR__.'/../../support/datastructure/contracts/firehub.Collection.php', + \FireHub\Core\Support\DataStructure\Enumerable::class => __DIR__.'/../../support/datastructure/firehub.Enumerable.php', \FireHub\Core\Support\LowLevel::class => __DIR__.'/../../support/firehub.LowLevel.php', \FireHub\Core\Support\LowLevel\Arr::class => __DIR__.'/../../support/lowlevel/firehub.Arr.php', \FireHub\Core\Support\LowLevel\CharMB::class => __DIR__.'/../../support/lowlevel/firehub.CharMB.php', @@ -187,6 +189,7 @@ \FireHub\Core\Throwable\Error\LowLevel\SystemRuntime\SleepTimeInvalidError::class => __DIR__.'/../../throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php', \FireHub\Core\Throwable\Exception::class => __DIR__.'/../../throwable/firehub.Exception.php', \FireHub\Core\Throwable\ExceptionBuilder::class => __DIR__.'/../../throwable/firehub.ExceptionBuilder.php', + \FireHub\Core\Throwable\Exception\DataStructure\EmptyDataStructureException::class => __DIR__.'/../../throwable/exception/datastructure/firehub.EmptyDataStructureException.php', \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException::class => __DIR__.'/../../throwable/exception/datastructure/firehub.WrongReturnTypeException.php', \FireHub\Core\Throwable\Exception\Domain\Autoload\ImplementationException::class => __DIR__.'/../../throwable/exception/domain/autoload/firehub.ImplementationException.php', \FireHub\Core\Throwable\Exception\Domain\Autoload\InvalidFolderException::class => __DIR__.'/../../throwable/exception/domain/autoload/firehub.InvalidFolderException.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 80e72df9..6570838c 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -244,6 +244,14 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/contracts/firehub.DataStructure.php'; return; + case \FireHub\Core\Support\DataStructure\Contracts\Collection::class: + require __DIR__.'/../../../support/datastructure/contracts/firehub.Collection.php'; + return; + + case \FireHub\Core\Support\DataStructure\Enumerable::class: + require __DIR__.'/../../../support/datastructure/firehub.Enumerable.php'; + return; + case \FireHub\Core\Support\LowLevel::class: require __DIR__.'/../../../support/firehub.LowLevel.php'; return; @@ -680,6 +688,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/firehub.ExceptionBuilder.php'; return; + case \FireHub\Core\Throwable\Exception\DataStructure\EmptyDataStructureException::class: + require __DIR__.'/../../../throwable/exception/datastructure/firehub.EmptyDataStructureException.php'; + return; + case \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException::class: require __DIR__.'/../../../throwable/exception/datastructure/firehub.WrongReturnTypeException.php'; return; diff --git a/src/support/contracts/firehub.DataStructure.php b/src/support/contracts/firehub.DataStructure.php index 8a43c8f8..b0751e83 100644 --- a/src/support/contracts/firehub.DataStructure.php +++ b/src/support/contracts/firehub.DataStructure.php @@ -16,9 +16,13 @@ /** * ### Data structure Contract * - * Defines a generic, type-safe contract for all high-level data structures in FireHub.
- * Supports iteration, array conversion, serialization, and common utility operations, ensuring consistency across - * collections, lazy collections, and other linear or dynamic data containers. + * Represents the root abstraction for all data structures within the system. + * A data structure defines the semantic interpretation and usage model of data, independent of its underlying storage + * mechanism.
+ * It serves as a type identity and architectural boundary, enabling consistent classification, composition, and + * interaction across different structural paradigms.
+ * This interface does not define behavior or operations but establishes a common contract for all structures that + * organize and expose data meaningfully. * @since 1.0.0 * * @template TKey diff --git a/src/support/datastructure/contracts/firehub.Collection.php b/src/support/datastructure/contracts/firehub.Collection.php new file mode 100644 index 00000000..ce9526a7 --- /dev/null +++ b/src/support/datastructure/contracts/firehub.Collection.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Contracts; + +use FireHub\Core\Support\DataStructure\Enumerable; + +/** + * ### Collection Contract + * + * Represents a finite, stateful data structure that holds a set of elements in memory.
+ * A collection provides consistent and repeatable iteration over its elements and serves as a base abstraction for + * structured data types such as linear, associative, and set-based collections. + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Enumerable + */ +interface Collection extends Enumerable {} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Enumerable.php b/src/support/datastructure/firehub.Enumerable.php new file mode 100644 index 00000000..1515eead --- /dev/null +++ b/src/support/datastructure/firehub.Enumerable.php @@ -0,0 +1,32 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure; + +use FireHub\Core\Support\Contracts\DataStructure; +use FireHub\Core\Shared\Contracts\IteratorAggregate; + +/** + * ### Enumerable Contract + * + * Represents a data structure that can be iterated.
+ * Provides a standardized way to traverse elements via an external iterator. + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @extends \FireHub\Core\Support\Contracts\DataStructure + * @extends \FireHub\Core\Shared\Contracts\IteratorAggregate + */ +interface Enumerable extends DataStructure, IteratorAggregate {} \ No newline at end of file From b040d499fe698ca9e3205a05564f1d6221dcfb7d Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 28 Apr 2026 09:24:02 +0200 Subject: [PATCH 54/79] feat: add `SizeException`, mark builders as internal, and fix typos in documentation **Detailed Description:** 1. **Introduction of `SizeException`:** - Added `SizeException` class under `Throwable\Exception\DataStructure` namespace. - Provides a dedicated exception for handling invalid data structure sizes with a default message: "DataStructure size is wrong." 2. **Mark `ErrorBuilder` and `ExceptionBuilder` as Internal:** - Updated the class-level annotations for `firehub.ErrorBuilder` and `firehub.ExceptionBuilder` to mark them as `@internal`. - Indicates these builders are not intended for external use, helping maintain proper encapsulation within the framework. 3. **Documentation Fixes:** - Corrected a typo in `firehub.Resolver`: - Updated "namespaces prefixes" to "namespace prefixes" for improved clarity. **Key Benefits:** - Adds a precise and context-specific exception for size-related errors in data structures. - Strengthens encapsulation by designating builders as internal, limiting unintended external use. - Improves documentation clarity, ensuring consistency and professionalism in the codebase. --- .../autoload/loader/firehub.Resolver.php | 2 +- .../datastructure/firehub.SizeException.php | 31 +++++++++++++++++++ src/throwable/firehub.ErrorBuilder.php | 2 ++ src/throwable/firehub.ExceptionBuilder.php | 2 ++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/throwable/exception/datastructure/firehub.SizeException.php diff --git a/src/support/autoload/loader/firehub.Resolver.php b/src/support/autoload/loader/firehub.Resolver.php index 0144108a..c43e8032 100644 --- a/src/support/autoload/loader/firehub.Resolver.php +++ b/src/support/autoload/loader/firehub.Resolver.php @@ -35,7 +35,7 @@ final class Resolver implements Loader { /** - * ### List of namespaces prefixes with its folders + * ### List of namespace prefixes with its folders * * An associative array where the key is a namespace prefix, and the value is an array of base folders for classes * in that namespace. diff --git a/src/throwable/exception/datastructure/firehub.SizeException.php b/src/throwable/exception/datastructure/firehub.SizeException.php new file mode 100644 index 00000000..a4e47586 --- /dev/null +++ b/src/throwable/exception/datastructure/firehub.SizeException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### DataStructure size + * @since 1.0.0 + */ +class SizeException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'DataStructure size iz wrong.'; + +} \ No newline at end of file diff --git a/src/throwable/firehub.ErrorBuilder.php b/src/throwable/firehub.ErrorBuilder.php index bdcb039d..4d839d3f 100644 --- a/src/throwable/firehub.ErrorBuilder.php +++ b/src/throwable/firehub.ErrorBuilder.php @@ -24,5 +24,7 @@ * @template TThrowable of \FireHub\Core\Throwable\Error * * @extends \FireHub\Core\Throwable\Builder + * + * @internal */ final class ErrorBuilder extends Builder {} \ No newline at end of file diff --git a/src/throwable/firehub.ExceptionBuilder.php b/src/throwable/firehub.ExceptionBuilder.php index 334c5bdd..38ee10c2 100644 --- a/src/throwable/firehub.ExceptionBuilder.php +++ b/src/throwable/firehub.ExceptionBuilder.php @@ -25,5 +25,7 @@ * @template TThrowable of \FireHub\Core\Throwable\Exception * * @extends \FireHub\Core\Throwable\Builder + * + * @internal */ final class ExceptionBuilder extends Builder {} \ No newline at end of file From d8fe8f416390bc91c2ea81512c4df0585ba812bd Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 29 Apr 2026 13:37:56 +0200 Subject: [PATCH 55/79] refactor: update namespace paths for enhanced consistency and structure **Detailed Description:** 1. **Namespace Adjustments:** - Refactored namespaces for multiple exception classes: - `WrongReturnTypeException`, `SizeException`, and `EmptyDataStructureException` updated from `Exception\DataStructure` to `Exception\Support\DataStructure`. - Aligns with the logical organization under a more appropriate "Support" directory for better clarity and maintainability. - Updated `InvalidValueObjectError` namespace from `Error\LowLevel` to `Error\ValueObject`, improving hierarchical alignment within the error structure. 2. **Documentation Updates:** - Adjusted related comments and annotations to reflect the new namespace paths. - Ensures consistency across the codebase for easier navigation and understanding. 3. **Improved Exception References:** - Modified all references to the relocated `InvalidValueObjectError` for better contextual accuracy: - Updated an instance in `Throwable\ValueObject\Firehub.Code` to reflect the correct path. **Key Benefits:** - Enhances overall code modularity and organizational structure by aligning namespaces with intended functionality. - Improves long-term maintainability and ease of understanding for developers interacting with exception and error classes. --- .../error/valueobject/firehub.InvalidValueObjectError.php | 2 +- .../datastructure/firehub.EmptyDataStructureException.php | 2 +- .../{ => support}/datastructure/firehub.SizeException.php | 2 +- .../datastructure/firehub.WrongReturnTypeException.php | 2 +- src/throwable/valueobject/firehub.Code.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename src/throwable/exception/{ => support}/datastructure/firehub.EmptyDataStructureException.php (90%) rename src/throwable/exception/{ => support}/datastructure/firehub.SizeException.php (90%) rename src/throwable/exception/{ => support}/datastructure/firehub.WrongReturnTypeException.php (90%) diff --git a/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php b/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php index cb864a74..db41c251 100644 --- a/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php +++ b/src/throwable/error/valueobject/firehub.InvalidValueObjectError.php @@ -11,7 +11,7 @@ * @package Core\Throwable */ -namespace FireHub\Core\Throwable\Error\LowLevel; +namespace FireHub\Core\Throwable\Error\ValueObject; use FireHub\Core\Throwable\Error; diff --git a/src/throwable/exception/datastructure/firehub.EmptyDataStructureException.php b/src/throwable/exception/support/datastructure/firehub.EmptyDataStructureException.php similarity index 90% rename from src/throwable/exception/datastructure/firehub.EmptyDataStructureException.php rename to src/throwable/exception/support/datastructure/firehub.EmptyDataStructureException.php index d08d8528..68894210 100644 --- a/src/throwable/exception/datastructure/firehub.EmptyDataStructureException.php +++ b/src/throwable/exception/support/datastructure/firehub.EmptyDataStructureException.php @@ -11,7 +11,7 @@ * @package Core\Throwable */ -namespace FireHub\Core\Throwable\Exception\DataStructure; +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; use FireHub\Core\Throwable\Exception; diff --git a/src/throwable/exception/datastructure/firehub.SizeException.php b/src/throwable/exception/support/datastructure/firehub.SizeException.php similarity index 90% rename from src/throwable/exception/datastructure/firehub.SizeException.php rename to src/throwable/exception/support/datastructure/firehub.SizeException.php index a4e47586..6d0ea08f 100644 --- a/src/throwable/exception/datastructure/firehub.SizeException.php +++ b/src/throwable/exception/support/datastructure/firehub.SizeException.php @@ -11,7 +11,7 @@ * @package Core\Throwable */ -namespace FireHub\Core\Throwable\Exception\DataStructure; +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; use FireHub\Core\Throwable\Exception; diff --git a/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php b/src/throwable/exception/support/datastructure/firehub.WrongReturnTypeException.php similarity index 90% rename from src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php rename to src/throwable/exception/support/datastructure/firehub.WrongReturnTypeException.php index c8b2d0f7..b6d18cda 100644 --- a/src/throwable/exception/datastructure/firehub.WrongReturnTypeException.php +++ b/src/throwable/exception/support/datastructure/firehub.WrongReturnTypeException.php @@ -11,7 +11,7 @@ * @package Core\Throwable */ -namespace FireHub\Core\Throwable\Exception\DataStructure; +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; use FireHub\Core\Throwable\Exception; diff --git a/src/throwable/valueobject/firehub.Code.php b/src/throwable/valueobject/firehub.Code.php index b87e4818..08b7e5c1 100644 --- a/src/throwable/valueobject/firehub.Code.php +++ b/src/throwable/valueobject/firehub.Code.php @@ -35,7 +35,7 @@ * The error code. *

* - * @throws \FireHub\Core\Throwable\Error\LowLevel\InvalidValueObjectError If the code is negative. + * @throws \FireHub\Core\Throwable\Error\ValueObject\InvalidValueObjectError If the code is negative. * * @return void */ From 69557fef24ee603a54d50b3756c00c657ba79035 Mon Sep 17 00:00:00 2001 From: Riddick Date: Mon, 4 May 2026 10:27:40 +0200 Subject: [PATCH 56/79] feat: implement Maybe type and related exceptions for value handling --- src/shared/firehub.ValueObject.php | 4 +- src/shared/type/Maybe.php | 158 ++++++++++++++++++ src/support/lowlevel/firehub.Arr.php | 4 +- .../shared/type/firehub.NoValueException.php | 31 ++++ .../firehub.OutOfBoundsException.php | 31 ++++ 5 files changed, 223 insertions(+), 5 deletions(-) create mode 100644 src/shared/type/Maybe.php create mode 100644 src/throwable/exception/shared/type/firehub.NoValueException.php create mode 100644 src/throwable/exception/support/datastructure/firehub.OutOfBoundsException.php diff --git a/src/shared/firehub.ValueObject.php b/src/shared/firehub.ValueObject.php index 17a2c802..542bc9de 100644 --- a/src/shared/firehub.ValueObject.php +++ b/src/shared/firehub.ValueObject.php @@ -13,7 +13,7 @@ namespace FireHub\Core\Shared; -use FireHub\Core\Throwable\Error\LowLevel\InvalidValueObjectError; +use FireHub\Core\Throwable\Error\ValueObject\InvalidValueObjectError; /** * ### Base Value Object @@ -62,7 +62,7 @@ public function equals (self $other):bool { * Exception message. *

* - * @throws \FireHub\Core\Throwable\Error\LowLevel\InvalidValueObjectError If the condition is not met. + * @throws \FireHub\Core\Throwable\Error\ValueObject\InvalidValueObjectError If the condition is not met. * * @return void */ diff --git a/src/shared/type/Maybe.php b/src/shared/type/Maybe.php new file mode 100644 index 00000000..f6db7ab0 --- /dev/null +++ b/src/shared/type/Maybe.php @@ -0,0 +1,158 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Shared + */ + +namespace FireHub\Core\Shared\Type; + +use FireHub\Core\Throwable\Exception\Shared\Type\NoValueException; + +/** + * ### Optional Value Container (Maybe Type) + * + * Represents a computation result that may or may not contain a value.
+ * This abstraction explicitly encodes the presence or absence of a value, removing ambiguity between "null as + * value" and "null as state". + * + * The Maybe type is used as a safe alternative to nullable returns in Storage, Data Structure, and Application + * layers where value existence must be explicitly expressed. + * @since 1.0.0 + * + * @template TValue + */ +final readonly class Maybe { + + /** + * ### Constructor + * @since 1.0.0 + * + * @param bool $hasValue

+ * Indicates whether a value is present. + *

+ * @param null|TValue $value [optional]

+ * Optional stored value (can be null if explicitly set via `some()`). + *

+ * + * @return void + */ + private function __construct( + private bool $hasValue, + private mixed $value = null + ) {} + + /** + * ### Create an Empty Maybe Instance + * + * Creates a Maybe instance representing the absence of a value. + * This state explicitly indicates that no value is present and is distinct from a null value. + * @since 1.0.0 + * + * @return self Empty Maybe instance. + */ + public static function none ():self { + + return new self(false); + + } + + /** + * ### Create a Maybe Instance With a Value + * + * Wraps a value into a Maybe container, explicitly marking it as present.
+ * The value may be null, but will still be considered a valid present state. + * @since 1.0.0 + * + * @template TSomeValue + * + * @param TSomeValue $value

+ * The value to wrap. + *

+ * + * @return self Maybe instance containing a value. + */ + public static function some (mixed $value):self { + + return new self(true, $value); + + } + + /** + * ### Check Value Presence + * + * Determines whether this Maybe instance contains a value.
+ * Returns true even if the stored value is null, as presence is independent of value content. + * @since 1.0.0 + * + * @return bool True if a value is present, false otherwise. + */ + public function has ():bool { + + return $this->hasValue; + + } + + /** + * ### Check Value Absence + * + * Determines whether this Maybe instance does not contain a value.
+ * This is the inverse of `has()`. + * @since 1.0.0 + * + * @return bool True if no value is present, false otherwise. + */ + public function isEmpty ():bool { + + return !$this->hasValue; + + } + + /** + * ### Retrieve Wrapped Value + * + * Returns the stored value if present.
+ * Throws an exception if no value exists in this Maybe instance. + * @since 1.0.0 + * + * @throws \FireHub\Core\Throwable\Exception\Shared\Type\NoValueException If no value is present. + * + * @return TValue The wrapped value. + */ + public function get ():mixed { + + if (!$this->hasValue) throw new NoValueException; + + /** @var TValue */ + return $this->value; + + } + + /** + * ### Unwrap Value or Default + * + * Returns the wrapped value if present, otherwise returns the provided default value.
+ * This method provides a safe fallback mechanism for empty Maybe instances. + * @since 1.0.0 + * + * @template TDefault + * + * @param TDefault $default

+ * Default value returned if Maybe is empty. + *

+ * + * @return TValue|TDefault The stored value or the default. + */ + public function unwrap (mixed $default):mixed { + + return $this->hasValue ? $this->value : $default; // @phpstan-ignore return.type + + } + +} \ No newline at end of file diff --git a/src/support/lowlevel/firehub.Arr.php b/src/support/lowlevel/firehub.Arr.php index 08f2a8a7..7719c180 100644 --- a/src/support/lowlevel/firehub.Arr.php +++ b/src/support/lowlevel/firehub.Arr.php @@ -183,14 +183,12 @@ public static function any (array $array, callable $callback):bool { * An array with keys to check. *

* - * @phpstan-assert-if-true array $array - * * @return bool True if the key exists in an array, false otherwise. * * @note Method will search for the keys in the first dimension only. * Nested keys in multidimensional arrays will not be found. */ - public static function keyExist (int|string $key, array $array):bool { + public static function keyExists (int|string $key, array $array):bool { return array_key_exists($key, $array); diff --git a/src/throwable/exception/shared/type/firehub.NoValueException.php b/src/throwable/exception/shared/type/firehub.NoValueException.php new file mode 100644 index 00000000..a1728f23 --- /dev/null +++ b/src/throwable/exception/shared/type/firehub.NoValueException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Shared\Type; + +use FireHub\Core\Throwable\Exception; + +/** + * ### No value present in Maybe exception + * @since 1.0.0 + */ +class NoValueException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'No value present in Maybe.'; + +} \ No newline at end of file diff --git a/src/throwable/exception/support/datastructure/firehub.OutOfBoundsException.php b/src/throwable/exception/support/datastructure/firehub.OutOfBoundsException.php new file mode 100644 index 00000000..3ad01796 --- /dev/null +++ b/src/throwable/exception/support/datastructure/firehub.OutOfBoundsException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### DataStructure is out of bounds exception + * @since 1.0.0 + */ +class OutOfBoundsException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'DataStructure is out of bounds.'; + +} \ No newline at end of file From 32e80e7623f5d7a97eb89e76d49078ea751d8812 Mon Sep 17 00:00:00 2001 From: Riddick Date: Mon, 4 May 2026 10:43:21 +0200 Subject: [PATCH 57/79] fix: update parameter type hint for array key in firehub.Arr.php --- src/support/lowlevel/firehub.Arr.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/support/lowlevel/firehub.Arr.php b/src/support/lowlevel/firehub.Arr.php index 7719c180..79a3fec2 100644 --- a/src/support/lowlevel/firehub.Arr.php +++ b/src/support/lowlevel/firehub.Arr.php @@ -174,9 +174,7 @@ public static function any (array $array, callable $callback):bool { * Key can be any value possible for an array index. * @since 1.0.0 * - * @template TKey of array-key - * - * @param TKey $key

+ * @param array-key $key

* Key to check. *

* @param array $array

From 26e8d15a8fc4e150060b89412c16bed8d04dd056 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 6 May 2026 09:52:14 +0200 Subject: [PATCH 58/79] feat: enhance `range` method in `firehub.Arr.php` with stricter type constraints and improved annotations **Detailed Description:** 1. **Stricter Argument Validation:** - Added validation to ensure `start` and `end` parameters are of the same type. - Throws `OutOfRangeError` if one parameter is a string and the other is not, with an appropriate error message. 2. **Improved Type Annotations and Templates:** - Updated the method's parameter types to generic templates (`TStart`, `TEnd`, and `TStep`) for improved type hinting. - Enhanced `@return` annotations with conditional types to specify the possible return value structures based on input types: - Integer, float, or string sequences are correctly annotated depending on the input parameters. 3. **Inclusion of `DataIs::string()`:** - Documented usage of `DataIs::string()` for type-checks to clarify its role in validating `start` and `end` inputs. 4. **Code Simplification:** - Consolidated checks and exception handling for better readability and maintainability. **Key Benefits:** - Ensures stricter type safety and consistency for the `range` method. - Reduces runtime errors and enhances developer understanding with more robust type annotations. - Improves the reliability of sequence generation by explicitly handling edge cases like mismatched types. --- src/support/lowlevel/firehub.Arr.php | 40 +++++++++++++++++++++------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/support/lowlevel/firehub.Arr.php b/src/support/lowlevel/firehub.Arr.php index 79a3fec2..cf30a9d4 100644 --- a/src/support/lowlevel/firehub.Arr.php +++ b/src/support/lowlevel/firehub.Arr.php @@ -1466,8 +1466,7 @@ public static function reverse (array $array, bool $preserve_keys = false):array * You can change this behavior by setting preserve_keys to true. *

* - * @return ( - * $preserve_keys is true + * @return ( $preserve_keys is true * ? array * : ($array is list * ? list @@ -1557,28 +1556,51 @@ public static function unique (array $array, Compare $compare = Compare::AS_REGU * ### Create an array containing a range of elements * @since 1.0.0 * - * @param int|float|string $start

+ * @uses \FireHub\Core\Support\LowLevel\DataIs::string() To determine if the $start and $end values are strings. + * + * @template TStart of int|float|string + * @template TEnd of int|float|string + * @template TStep of int|float + * + * @param TStart $start

* First value of the sequence. *

- * @param int|float|string $end

+ * @param TEnd $end

* The sequence is ended upon reaching the end value. *

- * @param positive-int|float $step [optional]

+ * @param TStep $step [optional]

* If a step value is given, it will be used as the increment between elements in the sequence.
* Step should be given as a positive number. If not specified, a step will default to 1. *

* * @throws \FireHub\Core\Throwable\Error\LowLevel\Arr\OutOfRangeError If $step is 0, $start, $end, or $step is not - * finite, or $step is negative, but the produced range is increasing (in other words, $start <= $end). - * - * @return list Sequence of elements as an array with the first element being start going up to - * end, with each value of the sequence being step values apart. + * finite, or $step is negative, but the produced range is increasing (in other words, $start <= $end), or if one + * is string, bu not both. + * + * @return (TStart is string + * ? list + * : (TEnd is string + * ? list + * : (TStart is float + * ? list + * : (TEnd is float + * ? list + * : (TStep is float + * ? list + * : list)))) + * ) Sequence of elements as an array with the first element being start going up to end, with each value of the + * sequence being step values apart. * * @note Character sequence values are limited to a length of one.
* If a length greater than one is entered only the first character is used. */ public static function range (int|float|string $start, int|float|string $end, int|float $step = 1):array { + if (DataIs::string($start) xor DataIs::string($end)) + throw new OutOfRangeError( + 'Start and end must be of the same type. If one is string, both must be string.' + ); + try { return range($start, $end, $step); From 82bafa580e1d2c448deff66288ac3de42e97c0c0 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 6 May 2026 10:16:15 +0200 Subject: [PATCH 59/79] feat: enhance `range` method in `firehub.Arr.php` with stricter type constraints and improved annotations **Detailed Description:** 1. **Stricter Argument Validation:** - Added validation to ensure `start` and `end` parameters are of the same type. - Throws `OutOfRangeError` if one parameter is a string and the other is not, with an appropriate error message. 2. **Improved Type Annotations and Templates:** - Updated the method's parameter types to generic templates (`TStart`, `TEnd`, and `TStep`) for improved type hinting. - Enhanced `@return` annotations with conditional types to specify the possible return value structures based on input types: - Integer, float, or string sequences are correctly annotated depending on the input parameters. 3. **Inclusion of `DataIs::string()`:** - Documented usage of `DataIs::string()` for type-checks to clarify its role in validating `start` and `end` inputs. 4. **Code Simplification:** - Consolidated checks and exception handling for better readability and maintainability. **Key Benefits:** - Ensures stricter type safety and consistency for the `range` method. - Reduces runtime errors and enhances developer understanding with more robust type annotations. - Improves the reliability of sequence generation by explicitly handling edge cases like mismatched types. --- src/support/lowlevel/firehub.Arr.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/support/lowlevel/firehub.Arr.php b/src/support/lowlevel/firehub.Arr.php index cf30a9d4..a488b35e 100644 --- a/src/support/lowlevel/firehub.Arr.php +++ b/src/support/lowlevel/firehub.Arr.php @@ -1578,16 +1578,16 @@ public static function unique (array $array, Compare $compare = Compare::AS_REGU * is string, bu not both. * * @return (TStart is string - * ? list + * ? array * : (TEnd is string - * ? list + * ? array * : (TStart is float - * ? list + * ? array * : (TEnd is float - * ? list + * ? array * : (TStep is float - * ? list - * : list)))) + * ? array + * : array)))) * ) Sequence of elements as an array with the first element being start going up to end, with each value of the * sequence being step values apart. * From 7a506d1a14c3e459d24b9aba31992001f4a74f7e Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 6 May 2026 13:24:21 +0200 Subject: [PATCH 60/79] fix: correct typo in exception message in `firehub.Arr.php` documentation **Detailed Description:** - Fixed a typographical error in the `OutOfRangeError` exception documentation: - Changed "bu not both" to "but not both." **Key Benefits:** - Improves code documentation accuracy and professionalism. - Enhances readability and understanding for developers working with the `range` method. --- src/support/lowlevel/firehub.Arr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/support/lowlevel/firehub.Arr.php b/src/support/lowlevel/firehub.Arr.php index a488b35e..520e859f 100644 --- a/src/support/lowlevel/firehub.Arr.php +++ b/src/support/lowlevel/firehub.Arr.php @@ -1575,7 +1575,7 @@ public static function unique (array $array, Compare $compare = Compare::AS_REGU * * @throws \FireHub\Core\Throwable\Error\LowLevel\Arr\OutOfRangeError If $step is 0, $start, $end, or $step is not * finite, or $step is negative, but the produced range is increasing (in other words, $start <= $end), or if one - * is string, bu not both. + * is string, but not both. * * @return (TStart is string * ? array From ce61610fd080bcb2f2b3aaf0768c1a0e95b9609f Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 19 May 2026 12:08:09 +0200 Subject: [PATCH 61/79] feat: redesign and expand data structure capabilities with flexible abstraction contracts **Detailed Description:** 1. **Removed `Enumerable` and `Collection` Interfaces:** - Deprecated interfaces were removed to streamline the data structure hierarchy and eliminate redundancy in traversal contracts. 2. **Introduced Comprehensive Storage Capabilities:** - Designed new interfaces under the `Storage\Capability` namespace to add extensible abstractions for specific data structure operations, including: - `IndexAccess`, `NodeInsertAfter`, `NodeInsertBefore`, `NodeBidirectionalInsert`, `NodeRemoval`, `CyclicTraversal`. - These capabilities enhance granularity and modularity in defining and implementing storage behaviors. 3. **Added Initialization Strategies:** - Introduced concrete initializers `ArrCallbackInitializer` and `GeneratorCallbackInitializer` for dynamic and memory-efficient data generation, enabling greater flexibility in array and generator-based storage. 4. **Expanded `MutationOutcome` Enum:** - Added `MutationOutcome` enum to standardize mutation operation results (e.g., `CREATED`, `UPDATED`, `REMOVED`, `NOT_FOUND`). 5. **Enhanced Exception Handling:** - Included new custom exceptions and relocated existing ones for better organization: - Updated paths for size, boundaries, and ownership-related exception classes under the `Support\DataStructure` namespace. 6. **Classmap Updates:** - Comprehensive updates to the classmap for seamless autoloading of new capabilities, enums, initializers, and exceptions. 7. **Code Consistency Improvements:** - Updated annotations, namespaces, and internal references for better adherence to the project's architectural style and clarity. **Key Benefits:** - Enhances modularity and scalability for data structure-related functionality. - Adds robust and reusable abstractions for key storage operations. - Improves memory efficiency and flexibility through dynamic initializers. - Enhances exception granularity, improving error management and debugging clarity. --- dist/core.min.phar | Bin 206644 -> 238055 bytes dist/core.phar | Bin 668789 -> 760160 bytes src/shared/enums/firehub.MutationOutcome.php | 46 +++ src/support/autoload/classmap.php | 48 ++- .../loader/firehub.CompiledClassmap.php | 184 ++++++++++- .../contracts/firehub.Collection.php | 31 -- .../datastructure/firehub.Enumerable.php | 32 -- .../datastructure/interface.Storage.php | 44 +++ .../capability/firehub.BackInsertion.php | 39 +++ .../capability/firehub.BackMutation.php | 26 ++ .../capability/firehub.BackRemoval.php | 36 +++ .../storage/capability/firehub.Cloneable.php | 40 +++ .../capability/firehub.CyclicTraversal.php | 47 +++ .../capability/firehub.DequeMutation.php | 30 ++ .../capability/firehub.FrontInsertion.php | 38 +++ .../capability/firehub.FrontMutation.php | 26 ++ .../capability/firehub.FrontRemoval.php | 36 +++ .../capability/firehub.IndexAccess.php | 65 ++++ .../capability/firehub.IndexMutation.php | 72 +++++ .../storage/capability/firehub.KeyAccess.php | 67 ++++ .../capability/firehub.KeyMutation.php | 73 +++++ .../firehub.LinearBoundaryAccess.php | 54 ++++ .../storage/capability/firehub.NodeAccess.php | 62 ++++ .../firehub.NodeBidirectionalInsert.php | 29 ++ .../capability/firehub.NodeInsertAfter.php | 50 +++ .../capability/firehub.NodeInsertBefore.php | 50 +++ .../capability/firehub.NodeMutation.php | 29 ++ .../capability/firehub.NodeRemoval.php | 48 +++ .../firehub.StorageMetricsAware.php | 58 ++++ .../storage/firehub.ArrListStorage.php | 300 ++++++++++++++++++ .../storage/firehub.ArrMapStorage.php | 196 ++++++++++++ .../storage/firehub.GeneratorStorage.php | 61 ++++ .../datastructure/storage/firehub.Node.php | 47 +++ .../storage/handle/firehub.NodeHandle.php | 59 ++++ .../firehub.ArrStorageInitializer.php | 38 +++ .../firehub.GeneratorStorageInitializer.php | 39 +++ .../firehub.ArrCallbackInitializer.php | 59 ++++ .../strategy/firehub.ArrFillInitializer.php | 71 +++++ .../strategy/firehub.ArrRangeInitializer.php | 95 ++++++ .../firehub.GeneratorCallbackInitializer.php | 59 ++++ .../firehub.InvalidBufferException.php | 31 ++ .../firehub.NodeOwnershipException.php | 31 ++ 42 files changed, 2362 insertions(+), 84 deletions(-) create mode 100644 src/shared/enums/firehub.MutationOutcome.php delete mode 100644 src/support/datastructure/contracts/firehub.Collection.php delete mode 100644 src/support/datastructure/firehub.Enumerable.php create mode 100644 src/support/datastructure/interface.Storage.php create mode 100644 src/support/datastructure/storage/capability/firehub.BackInsertion.php create mode 100644 src/support/datastructure/storage/capability/firehub.BackMutation.php create mode 100644 src/support/datastructure/storage/capability/firehub.BackRemoval.php create mode 100644 src/support/datastructure/storage/capability/firehub.Cloneable.php create mode 100644 src/support/datastructure/storage/capability/firehub.CyclicTraversal.php create mode 100644 src/support/datastructure/storage/capability/firehub.DequeMutation.php create mode 100644 src/support/datastructure/storage/capability/firehub.FrontInsertion.php create mode 100644 src/support/datastructure/storage/capability/firehub.FrontMutation.php create mode 100644 src/support/datastructure/storage/capability/firehub.FrontRemoval.php create mode 100644 src/support/datastructure/storage/capability/firehub.IndexAccess.php create mode 100644 src/support/datastructure/storage/capability/firehub.IndexMutation.php create mode 100644 src/support/datastructure/storage/capability/firehub.KeyAccess.php create mode 100644 src/support/datastructure/storage/capability/firehub.KeyMutation.php create mode 100644 src/support/datastructure/storage/capability/firehub.LinearBoundaryAccess.php create mode 100644 src/support/datastructure/storage/capability/firehub.NodeAccess.php create mode 100644 src/support/datastructure/storage/capability/firehub.NodeBidirectionalInsert.php create mode 100644 src/support/datastructure/storage/capability/firehub.NodeInsertAfter.php create mode 100644 src/support/datastructure/storage/capability/firehub.NodeInsertBefore.php create mode 100644 src/support/datastructure/storage/capability/firehub.NodeMutation.php create mode 100644 src/support/datastructure/storage/capability/firehub.NodeRemoval.php create mode 100644 src/support/datastructure/storage/capability/firehub.StorageMetricsAware.php create mode 100644 src/support/datastructure/storage/firehub.ArrListStorage.php create mode 100644 src/support/datastructure/storage/firehub.ArrMapStorage.php create mode 100644 src/support/datastructure/storage/firehub.GeneratorStorage.php create mode 100644 src/support/datastructure/storage/firehub.Node.php create mode 100644 src/support/datastructure/storage/handle/firehub.NodeHandle.php create mode 100644 src/support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php create mode 100644 src/support/datastructure/storage/initialization/firehub.GeneratorStorageInitializer.php create mode 100644 src/support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php create mode 100644 src/support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php create mode 100644 src/support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php create mode 100644 src/support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php create mode 100644 src/throwable/exception/support/datastructure/firehub.InvalidBufferException.php create mode 100644 src/throwable/exception/support/datastructure/firehub.NodeOwnershipException.php diff --git a/dist/core.min.phar b/dist/core.min.phar index 5fbb3d0190e19d56123bbd576b57afa8a1259a6d..ffcedf13cef1e6eaff41850874fb00b11be078b5 100644 GIT binary patch delta 22067 zcmd5^2Y3|MwdQI;S|Oo=BxDuPsG(i4sx)Z@5-NzQLNiSutyUwnMy$l{N)!hRl03)d zBbZF=u^+`Ej=PFUA=fCH+bMD;Pqc29j|5Vg%%g5B!jvDp)-qkmZu9y*d-QG8+kWw0pa_Gf$WTF=~ zR7NlQQ7OGRgUabeTFBf;(EiP+QKM3K?Y<)I9TO*gVi+$cm!fgT-{ZURRC*|6HkH2^ zQcL8s(5O)hGt5^cG-jd{V=&5%Whf>xzq_M*1AanuZZI?w(Hwl^;id~5I+Fs$kDfy> zR*jxVFYXz=lwMpNO*#D;TmNpx`;(>1#w6*BGn0%z;dE{u!|1;-ri$vshFa-GLnwQ+ zH*^ubGZnxuzZSiPuO&N@m3f!n{2G4cbbir#K2ldN5Y{(i zQBZ;MCx3mgl&e&M%3L=UEU??UZLN+@hi6*>?*Uad`^E)Mx9Eay0PX)6LxS>foy*9P zDgmh`2omp40CbQ6LAm(dT?;wT8~~~g0<=`z)YWV21e{+p94OnqPWcaxQw}(l0dT52 zyPTq}wUapLE`|c-t2g(q<|s9QGA|IyHhZVTzT9Q&6n{$_ z`imX7W4o%ldYo-Gmx|c?j2M*nKJZcs2dn_VssMoXU2USbe$k8_3)Q7b!~$qf$^KH#!%Xy?y+#KGSDjLb~|j&woXx52tj#1xdjmFiQ>jn4aYe| zJwPns5Durq(gEt(&)T?csovkD)V3niX?`BN_<#Tb%KIZrVx$EKAIy&*Z zpurAhF&C8YAG?&qu~z{1RU_cO)aKlPXA2GZ4g>9gP;NQ=;WHe3{fNL7@B49&I`CX~ z>y%B>>=+A;<~GGlqZjwaOpEz@5hVlV>CfIeEqxfn0!bm3r7O++;$SQbkk7@k1SWMn zlUX~S#f*24XEKB1S)`m9$Anwr*rP-I&RKqu63=kf#Is2L&UhB6z8=pqiR1)kVtoRW z+0QTjmca54VL~AZ`*FBCsx{J%hU!S^)K6)*61HGu4xQ1Tz^Na8J zMbjkq==db&qvW)egw=c4+~=>gY{vDTE1z(ovC`=@BZYZAt(jhw3A6_1v262Ai^mh! z_h-i4(ThUm#vT-H{188ZSVy`dtfV@N)0xGG(!GYB-6bBy^~#oaMxkuuJ6x$bgOU0} z2GdT?^jiER_oE7Fj;TbBibb(T;6N;$&SXlKthLnSty%2O#VoIO`SR4&(zwEGsXudq zTpo`Rz`+EeKbt9jpUt?go6PJ#F?k)uOv-7Y7dvto_?a9gQ({^{AMG_QqZc3WiwZM) zbf?))AAQg7tjb+W{0=MRx8GD817FJbPedk7Pi%SQc$2hgO0oRwTd;Te8Y78Q>WDJj zur{ojBV9ISOIAy?{Kc&(&N#>`HqJupe*xe4>V~?l&_$)4lfvbgOcX7z+>H{wPB>*@ zHOq9P|1zNhFqdJ$XPNiTL4w-CD!m!FB=u}DhK z!Nb33g8Z-rC3#2Df~m`5E@BaAU??lwimzhciBiM#40&e(N;W>hDZV&uJ%uiuzMep@ z!A}gK8&67)Oih=&i_o+rJClWSUi3}N_;fx?s+^u!qE6{~NK@Z+t*x_1oV(R7cJnOv zGsXwX-G;wymA;>DBL>4TY}6~?`~%ko2!=~(Gm_=*Lnv7~Ib$@D_#CVJJnx0uu!;!> zGKumx`_QDA(To<9cPxIcQF^(M>l?Augxm#AoXS`eBsN-xdGqiu_3vL&x%rj_35ojH?U z9G+QDeC)#b1;sDEE!{A4lC-F1oN*nC5TyJPx;`E0F4?zzA&X4%5(j9nNEp zRKBtsNtf$F<%5Qh4Ebac8as~c8#OJ*`$kRmUGkqFK@;Q!S%&CnvWbLAbh{kAIIfaW ziXm|(`$K5$>gp7-I&5wNZs9`0CdXE>O~}H%qem2G3(lU-PQff(FYo#bN*e9NTNv^U z@rD#byRB0mTpKcJyc=)S2`06cyffaA6zOsGh!%z;4VEU1!KMV0^ru%6joheozBJzK zaL?V;?b#-n%vM6_dch@ndR$H+JT zaf{$P*2*|I!zQ%^8jU^9EiPNPQjs>X-PY6T@mgY}d^iaef*MJ%3Rz53KJ*}(`?HUX zN6x%DBQn~jV@S3$g;CmjM=rm;V@x<{LufYX*(3^r(crgqrEd;=1!ms0~u?~envu5Z)YWD*<+1x;QzlDgdh2rIbxW4Q3#oiUvTY`Qypkl#RHYU?jObbE#g>Qf(&k#tPK4 z)ZzgeO4(W*wgVIme?C?A7&*;A?(_;XlF2$QW&4d9iWvc1%H)Ayjt-pOwj<|S5CB$J zkI~lau@LXj-AIlesI#i18Kzl>J4g-Pnv~KnOypBTaex}=YkTfKT3mnC^H~F-OJ>zG7k$JbR^q**CMv6`%v@4Mlj)M=TrR zfrg@5oHgxa9Z#@Z>U~e{j41(};j1RKyqBc7Ls?9eeIF*yk(GsnFX=-B8RI0T*hDuM zalpv;897u6C#ka|DOJ3dBJKRp2)$qmM^ZMp$hITI9PEkmK-Ba%rDr?%&REd>O5XE| z{MhuZtsl!JylQ?d`-S25r~9$LjBQ*(<%jObX=*>q4+p)y$stgjhd)24d1yB_H5~l; zL63t5hTAV5h97)3KQ#nON8ki44rfpnjDgaYL!7AXjmmo{pFT0f7ybb`r%28T1{EJp z@w}>hWRi!cu4Er6{Pg*JdBrU#@%Hs7Z{YPw$QbprZ^x*UJ*o1QYvhksqr-p$WXDH5s0KY9;pZU^$AE zU!05M`Q&$^2Ab!hx=?S@MudU=AkOf>)!nhstazaE3{Wq!tJb7*TB0LJ0|{BZ#!@mmS>xD1*??CC8cWZ!-jq&@8Yr?> z=>V)AS0$^{q6XsXRRK`FFp)^;b%WuigT%FZ$g1Q{POn227}0_HmRcVAmYxfgyl(g| z@T&OptCHR+Gy}QRD-9$AWrCU>HH=h{jMU-gf(qA>CWEBC^m;8UMl=&tumg2il{h%U z#HUl$OaLN7@<16a#ABXM@k+R?GezjCyF8=4s7@e zmCNZVDVX1^P}~2ea>hP!IInLu=n(O2X~?h0%_OX?|F!GqWKX ziI&N1Kb{zpk?1Fz!|{oljV8gNkd zv{3bM3Hb-qGK=8M@SLI@$Z^~h?}u1opnDmbHe&#%j)gIPGR83ZU^h-(KD`;Og4{7$ z{{8?S(%sF-D3|X;;nInka5-&1PFQO5P?Q|K52u)rUEYtgOM^~c`Pe~J6(Fx1ID0qx zE7GQoHkMM6jImKKPo#5PqGGO%4xxWA3LV z8v+|t(k9Z9+{;RW0(YsGc}vLP<~2dwO!R3u=C^~?I$S|}NMm5~8k$NM(Hgf1|gOKh=gu?$jJIdFjeL5^4KT8Co5B}mWkVL9PO>zx$3f{7m8HO|pH+M``6LdVno$G`G0m3! z@d63pRsk1)CGEO4J`pGldE&DsHgg90Ya*x*NvmBRWm--*u3gHBM)4 zl9&sMIf0-q@aEgQW}t*p2l={<7!gchl>*>%L^c;b-Q?TXyb{B0oW2n9z_XKzm>ce*6~6Ut|tk^fVD-?ggF*Lwb-&hcyF)>dXt=m zhte8P?kE#_@KMWJhrI7NijW>_4^zEY!L?11yBDI+aU7bghjRK@1NMR#64M71aXM`g z>TI440fV(W@b_YZ9nVE>c;J0AA_|U8-JRkl(dlt>CKh$|blTZpMHElWps}5QS3pmp zr#J?gJq z;uL|#B=vA3M_m=d@E3^W=#Dpi*(osINFIk176pko(T=~4^r#ubnbdae)o_nP= z#tpM}otb-)EaFxx9K$8fq57tPT8F{S@VAC^Wg#5roMehQ-MA;gb8PJHUTU1P-}cyn5_{B)`zqtkHT2b}Ul;l^1$cDJ`R>Fi>)ZnAB~qX|GPLZO*bZlGosW7qIl zT*u0m4hJNhR5>qCD98GAkal-H;N z<2hp}uFi0$LO$%Yak$lrPvxh{&jS=z@yd^5Sgp#(0_3bY#O43`)qOD!sk||c&+4vZd=^2KY3VN7^4{Y(ZW!@W zjpu$7q^;lH;$>yyR}IdsuQ-c{HBFIsigD=iF+|NE5{&k@4xa{Uz+(stD<8^zZg zx^n+NSY>PYEU3=ueZMv#iwmv^p9=BikcqI3PlQ?^GSlhLh8QK_TnMfUG!v=~jc_^y z=)jX9C+9ootY{R-7fQ;cqndO4OoeKmL$;6f=R;C;-PzC|FQ2(E0q7Yh6dJhWtJf^(^o(zGmyKp3}%zBpkl};M3)<;qY1?U<7mFfs{(toNluRq zsr9=6lrjFkNiR%qKCdFW;IlpmV7ZEXCCiXJ8r~d8F{@`Q8DkiGE;}DW8DLm*^pSXH zEac2|Z-Y32{4HcT@m*3)0j|Il$*q-OnJtU>q1^u}(ORO&}gr#2#9@*uy( zX|x+3v?Ly$j^&2DsKm{u%1?EWz%PkXUuk%XNm<<(D$bnPk1aq837KZAjpUk2lQs*Lkp?%Xl?E232)>r+tqW8;365-;^)8%OfO7Cll^MxG~Ja)-IRe`w08rtp1c(=?vmrm#fQV67VrZtSsPt zU;)btn|g5Oj@>1WS!MT}uVQhk>|<{~`Vi*CGWiH{`E#9Ov~88Uz1WTN3q zB=0Q7^JQHK{%RuKFk_%3*>HJm zpW~0c0}~JLIaF0;zA5Ft>CksSU9ss+vBL36Nmox_{JCXskE(k<`pnA5H?(cM zCn~-q;^x}^f&2Oj>KAU`a=`t^9Zwn_>)yXF@$}xeQQ-}P_lbjtKizQejMpY-#P+Vp zsNQAmkrLi;KHXdrE*(35H2ljaiZ6dQxMc4)>6co!zxLLNyMF)NSLIK>_uKHE`l_SO z7dKQNy712W&&209?l~Ckv3$|@Z@)VJivwBWTQ^Sq-MOpBR#$s^Hn;9Ok!~+?jlM2= zTj=@+&>K?z<%{p_bZ@>{td~5$zW1reSG=4y&-|nMPu`t3X6*AD&bBtpOUrlO{+P4z zu0Q_xYU|;RRi`D#u9utV&0agdwKX@gJMY5AZ<>?ep8ff%JCbYG-Sz72^Ex_z{CW2y zEjxbDcQE42tI3hacZNN<<|)VN$b^MbV%3z6I|fHzxaA4?)v2ehhQ9sM9bZp<_3@YY zJ^!%1`^|{zX_;u?;PqeUtt?r$(=l*1{?P0nKA#vi>*Jq)RMB>?!%y1c@1 zeB9r2qE>7^+BfTXY}`ha$$~ LUyqnqRaf<2L|`9a delta 3931 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 diff --git a/dist/core.phar b/dist/core.phar index d534135e015917a0f4ecc19d2e56d99e2cc7682b..c27fadf7a61514f4a9e039145a113f5ea5891189 100644 GIT binary patch delta 52887 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 delta 4731 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 + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.1 + * @package Core\Shared + */ + +namespace FireHub\Core\Shared\Enums; + +/** + * ### Mutation outcome enum + * @since 1.0.0 + */ +enum MutationOutcome { + + /** + * ### New Entry Created + * @since 1.0.0 + */ + case CREATED; + + /** + * ### Existing Entry Updated + * @since 1.0.0 + */ + case UPDATED; + + /** + * ### Entry Removed + * @since 1.0.0 + */ + case REMOVED; + + /** + * ### Entry Not Found + * @since 1.0.0 + */ + case NOT_FOUND; + +} \ No newline at end of file diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index 41c3ae32..d87888fb 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -54,6 +54,7 @@ \FireHub\Core\Shared\Enums\Json\Flag\Encode::class => __DIR__.'/../../shared/enums/json/flag/firehub.Encode.php', \FireHub\Core\Shared\Enums\Json\Flag\Error::class => __DIR__.'/../../shared/enums/json/flag/firehub.Error.php', \FireHub\Core\Shared\Enums\Json\Flag\Validate::class => __DIR__.'/../../shared/enums/json/flag/firehub.Validate.php', + \FireHub\Core\Shared\Enums\MutationOutcome::class => __DIR__.'/../../shared/enums/firehub.MutationOutcome.php', \FireHub\Core\Shared\Enums\Number\LogBase::class => __DIR__.'/../../shared/enums/number/firehub.LogBase.php', \FireHub\Core\Shared\Enums\Number\Round::class => __DIR__.'/../../shared/enums/number/firehub.Round.php', \FireHub\Core\Shared\Enums\Order::class => __DIR__.'/../../shared/enums/firehub.Order.php', @@ -66,6 +67,7 @@ \FireHub\Core\Shared\Enums\String\Sort::class => __DIR__.'/../../shared/enums/string/firehub.Sort.php', \FireHub\Core\Shared\Enums\SystemRuntime\IniAccessLevel::class => __DIR__.'/../../shared/enums/systemruntime/firehub.IniAccessLevel.php', \FireHub\Core\Shared\Enums\SystemRuntime\PhpExtension::class => __DIR__.'/../../shared/enums/systemruntime/firehub.PhpExtension.php', + \FireHub\Core\Shared\Type\Maybe::class => __DIR__.'/../../shared/type/Maybe.php', \FireHub\Core\Shared\ValueObject::class => __DIR__.'/../../shared/firehub.ValueObject.php', \FireHub\Core\Support\Autoload::class => __DIR__.'/../../support/firehub.Autoload.php', \FireHub\Core\Support\Autoload\Loader::class => __DIR__.'/../../support/autoload/firehub.Loader.php', @@ -78,8 +80,39 @@ \FireHub\Core\Support\Bootstrap\Bootloader\RegisterHelpers::class => __DIR__.'/../../support/bootstrap/bootloader/firehub.RegisterHelpers.php', \FireHub\Core\Support\Bootstrap\FireHubConfigurator::class => __DIR__.'/../../support/bootstrap/firehub.FireHubConfigurator.php', \FireHub\Core\Support\Contracts\DataStructure::class => __DIR__.'/../../support/contracts/firehub.DataStructure.php', - \FireHub\Core\Support\DataStructure\Contracts\Collection::class => __DIR__.'/../../support/datastructure/contracts/firehub.Collection.php', - \FireHub\Core\Support\DataStructure\Enumerable::class => __DIR__.'/../../support/datastructure/firehub.Enumerable.php', + \FireHub\Core\Support\DataStructure\Storage::class => __DIR__.'/../../support/datastructure/interface.Storage.php', + \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrListStorage.php', + \FireHub\Core\Support\DataStructure\Storage\ArrMapStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrMapStorage.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\BackInsertion::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.BackInsertion.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\BackMutation::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.BackMutation.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\BackRemoval::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.BackRemoval.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\Cloneable::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.Cloneable.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\CyclicTraversal::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.CyclicTraversal.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\DequeMutation::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.DequeMutation.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\FrontInsertion::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.FrontInsertion.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\FrontMutation::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.FrontMutation.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\FrontRemoval::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.FrontRemoval.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\IndexAccess::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.IndexAccess.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\IndexMutation::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.IndexMutation.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\KeyAccess::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.KeyAccess.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\KeyMutation::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.KeyMutation.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\LinearBoundaryAccess::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.LinearBoundaryAccess.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\NodeAccess::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.NodeAccess.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\NodeBidirectionalInsert::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.NodeBidirectionalInsert.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\NodeInsertAfter::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.NodeInsertAfter.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\NodeInsertBefore::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.NodeInsertBefore.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\NodeMutation::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.NodeMutation.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\NodeRemoval::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.NodeRemoval.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\StorageMetricsAware::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.StorageMetricsAware.php', + \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.GeneratorStorage.php', + \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle::class => __DIR__.'/../../support/datastructure/storage/handle/firehub.NodeHandle.php', + \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\Initialization\GeneratorStorageInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/firehub.GeneratorStorageInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrFillInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrRangeInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\GeneratorCallbackInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\Node::class => __DIR__.'/../../support/datastructure/storage/firehub.Node.php', \FireHub\Core\Support\LowLevel::class => __DIR__.'/../../support/firehub.LowLevel.php', \FireHub\Core\Support\LowLevel\Arr::class => __DIR__.'/../../support/lowlevel/firehub.Arr.php', \FireHub\Core\Support\LowLevel\CharMB::class => __DIR__.'/../../support/lowlevel/firehub.CharMB.php', @@ -164,7 +197,6 @@ \FireHub\Core\Throwable\Error\LowLevel\FileSystem\SetOwnerError::class => __DIR__.'/../../throwable/error/lowlevel/filesystem/firehub.SetOwnerError.php', \FireHub\Core\Throwable\Error\LowLevel\FileSystem\SetPermissionsError::class => __DIR__.'/../../throwable/error/lowlevel/filesystem/firehub.SetPermissionsError.php', \FireHub\Core\Throwable\Error\LowLevel\Func\RegisterTickFailedError::class => __DIR__.'/../../throwable/error/lowlevel/func/firehub.RegisterTickFailedError.php', - \FireHub\Core\Throwable\Error\LowLevel\InvalidValueObjectError::class => __DIR__.'/../../throwable/error/valueobject/firehub.InvalidValueObjectError.php', \FireHub\Core\Throwable\Error\LowLevel\Json\DecodeError::class => __DIR__.'/../../throwable/error/lowlevel/json/firehub.DecodeError.php', \FireHub\Core\Throwable\Error\LowLevel\Json\EncodeError::class => __DIR__.'/../../throwable/error/lowlevel/json/firehub.EncodeError.php', \FireHub\Core\Throwable\Error\LowLevel\Number\ArithmeticError::class => __DIR__.'/../../throwable/error/lowlevel/number/firehub.ArithmeticError.php', @@ -187,16 +219,22 @@ \FireHub\Core\Throwable\Error\LowLevel\SystemRuntime\InvalidConfigurationQuantityError::class => __DIR__.'/../../throwable/error/lowlevel/systemruntime/firehub.InvalidConfigurationQuantityError.php', \FireHub\Core\Throwable\Error\LowLevel\SystemRuntime\InvalidExtensionError::class => __DIR__.'/../../throwable/error/lowlevel/systemruntime/firehub.InvalidExtensionError.php', \FireHub\Core\Throwable\Error\LowLevel\SystemRuntime\SleepTimeInvalidError::class => __DIR__.'/../../throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php', + \FireHub\Core\Throwable\Error\ValueObject\InvalidValueObjectError::class => __DIR__.'/../../throwable/error/valueobject/firehub.InvalidValueObjectError.php', \FireHub\Core\Throwable\Exception::class => __DIR__.'/../../throwable/firehub.Exception.php', \FireHub\Core\Throwable\ExceptionBuilder::class => __DIR__.'/../../throwable/firehub.ExceptionBuilder.php', - \FireHub\Core\Throwable\Exception\DataStructure\EmptyDataStructureException::class => __DIR__.'/../../throwable/exception/datastructure/firehub.EmptyDataStructureException.php', - \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException::class => __DIR__.'/../../throwable/exception/datastructure/firehub.WrongReturnTypeException.php', \FireHub\Core\Throwable\Exception\Domain\Autoload\ImplementationException::class => __DIR__.'/../../throwable/exception/domain/autoload/firehub.ImplementationException.php', \FireHub\Core\Throwable\Exception\Domain\Autoload\InvalidFolderException::class => __DIR__.'/../../throwable/exception/domain/autoload/firehub.InvalidFolderException.php', \FireHub\Core\Throwable\Exception\Domain\Autoload\InvalidHandleException::class => __DIR__.'/../../throwable/exception/domain/autoload/firehub.InvalidHandleException.php', \FireHub\Core\Throwable\Exception\Domain\Autoload\InvalidNamespaceException::class => __DIR__.'/../../throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php', + \FireHub\Core\Throwable\Exception\Shared\Type\NoValueException::class => __DIR__.'/../../throwable/exception/shared/type/firehub.NoValueException.php', \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException::class => __DIR__.'/../../throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php', \FireHub\Core\Throwable\Exception\Support\Bootstrap\NotBootloaderException::class => __DIR__.'/../../throwable/exception/support/bootstrap/firehub.NotBootloaderException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\EmptyDataStructureException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.EmptyDataStructureException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidBufferException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidBufferException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\NodeOwnershipException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.NodeOwnershipException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\OutOfBoundsException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.OutOfBoundsException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\SizeException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.SizeException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\WrongReturnTypeException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.WrongReturnTypeException.php', \FireHub\Core\Throwable\Throwable::class => __DIR__.'/../../throwable/firehub.Throwable.php', \FireHub\Core\Throwable\ValueObject\Code::class => __DIR__.'/../../throwable/valueobject/firehub.Code.php', ]; \ No newline at end of file diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 6570838c..947a2dc0 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -148,6 +148,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../shared/enums/json/flag/firehub.Validate.php'; return; + case \FireHub\Core\Shared\Enums\MutationOutcome::class: + require __DIR__.'/../../../shared/enums/firehub.MutationOutcome.php'; + return; + case \FireHub\Core\Shared\Enums\Number\LogBase::class: require __DIR__.'/../../../shared/enums/number/firehub.LogBase.php'; return; @@ -196,6 +200,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../shared/enums/systemruntime/firehub.PhpExtension.php'; return; + case \FireHub\Core\Shared\Type\Maybe::class: + require __DIR__.'/../../../shared/type/Maybe.php'; + return; + case \FireHub\Core\Shared\ValueObject::class: require __DIR__.'/../../../shared/firehub.ValueObject.php'; return; @@ -244,12 +252,136 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/contracts/firehub.DataStructure.php'; return; - case \FireHub\Core\Support\DataStructure\Contracts\Collection::class: - require __DIR__.'/../../../support/datastructure/contracts/firehub.Collection.php'; + case \FireHub\Core\Support\DataStructure\Storage::class: + require __DIR__.'/../../../support/datastructure/interface.Storage.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::class: + require __DIR__.'/../../../support/datastructure/storage/firehub.ArrListStorage.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\ArrMapStorage::class: + require __DIR__.'/../../../support/datastructure/storage/firehub.ArrMapStorage.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\BackInsertion::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.BackInsertion.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\BackMutation::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.BackMutation.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\BackRemoval::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.BackRemoval.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\Cloneable::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.Cloneable.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\CyclicTraversal::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.CyclicTraversal.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\DequeMutation::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.DequeMutation.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\FrontInsertion::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.FrontInsertion.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\FrontMutation::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.FrontMutation.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\FrontRemoval::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.FrontRemoval.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\IndexAccess::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.IndexAccess.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\IndexMutation::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.IndexMutation.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\KeyAccess::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.KeyAccess.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\KeyMutation::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.KeyMutation.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\LinearBoundaryAccess::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.LinearBoundaryAccess.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\NodeAccess::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.NodeAccess.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\NodeBidirectionalInsert::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.NodeBidirectionalInsert.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\NodeInsertAfter::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.NodeInsertAfter.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\NodeInsertBefore::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.NodeInsertBefore.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\NodeMutation::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.NodeMutation.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\NodeRemoval::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.NodeRemoval.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Capability\StorageMetricsAware::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.StorageMetricsAware.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::class: + require __DIR__.'/../../../support/datastructure/storage/firehub.GeneratorStorage.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle::class: + require __DIR__.'/../../../support/datastructure/storage/handle/firehub.NodeHandle.php'; return; - case \FireHub\Core\Support\DataStructure\Enumerable::class: - require __DIR__.'/../../../support/datastructure/firehub.Enumerable.php'; + case \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Initialization\GeneratorStorageInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/firehub.GeneratorStorageInitializer.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrFillInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrRangeInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\GeneratorCallbackInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Node::class: + require __DIR__.'/../../../support/datastructure/storage/firehub.Node.php'; return; case \FireHub\Core\Support\LowLevel::class: @@ -588,10 +720,6 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/error/lowlevel/func/firehub.RegisterTickFailedError.php'; return; - case \FireHub\Core\Throwable\Error\LowLevel\InvalidValueObjectError::class: - require __DIR__.'/../../../throwable/error/valueobject/firehub.InvalidValueObjectError.php'; - return; - case \FireHub\Core\Throwable\Error\LowLevel\Json\DecodeError::class: require __DIR__.'/../../../throwable/error/lowlevel/json/firehub.DecodeError.php'; return; @@ -680,6 +808,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/error/lowlevel/systemruntime/firehub.SleepTimeInvalidError.php'; return; + case \FireHub\Core\Throwable\Error\ValueObject\InvalidValueObjectError::class: + require __DIR__.'/../../../throwable/error/valueobject/firehub.InvalidValueObjectError.php'; + return; + case \FireHub\Core\Throwable\Exception::class: require __DIR__.'/../../../throwable/firehub.Exception.php'; return; @@ -688,14 +820,6 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/firehub.ExceptionBuilder.php'; return; - case \FireHub\Core\Throwable\Exception\DataStructure\EmptyDataStructureException::class: - require __DIR__.'/../../../throwable/exception/datastructure/firehub.EmptyDataStructureException.php'; - return; - - case \FireHub\Core\Throwable\Exception\DataStructure\WrongReturnTypeException::class: - require __DIR__.'/../../../throwable/exception/datastructure/firehub.WrongReturnTypeException.php'; - return; - case \FireHub\Core\Throwable\Exception\Domain\Autoload\ImplementationException::class: require __DIR__.'/../../../throwable/exception/domain/autoload/firehub.ImplementationException.php'; return; @@ -712,6 +836,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/exception/domain/autoload/firehub.InvalidNamespaceException.php'; return; + case \FireHub\Core\Throwable\Exception\Shared\Type\NoValueException::class: + require __DIR__.'/../../../throwable/exception/shared/type/firehub.NoValueException.php'; + return; + case \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException::class: require __DIR__.'/../../../throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php'; return; @@ -720,6 +848,30 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/exception/support/bootstrap/firehub.NotBootloaderException.php'; return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\EmptyDataStructureException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.EmptyDataStructureException.php'; + return; + + case \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidBufferException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidBufferException.php'; + return; + + case \FireHub\Core\Throwable\Exception\Support\DataStructure\NodeOwnershipException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.NodeOwnershipException.php'; + return; + + case \FireHub\Core\Throwable\Exception\Support\DataStructure\OutOfBoundsException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.OutOfBoundsException.php'; + return; + + case \FireHub\Core\Throwable\Exception\Support\DataStructure\SizeException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.SizeException.php'; + return; + + case \FireHub\Core\Throwable\Exception\Support\DataStructure\WrongReturnTypeException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.WrongReturnTypeException.php'; + return; + case \FireHub\Core\Throwable\Throwable::class: require __DIR__.'/../../../throwable/firehub.Throwable.php'; return; diff --git a/src/support/datastructure/contracts/firehub.Collection.php b/src/support/datastructure/contracts/firehub.Collection.php deleted file mode 100644 index ce9526a7..00000000 --- a/src/support/datastructure/contracts/firehub.Collection.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Contracts; - -use FireHub\Core\Support\DataStructure\Enumerable; - -/** - * ### Collection Contract - * - * Represents a finite, stateful data structure that holds a set of elements in memory.
- * A collection provides consistent and repeatable iteration over its elements and serves as a base abstraction for - * structured data types such as linear, associative, and set-based collections. - * @since 1.0.0 - * - * @template TKey - * @template TValue - * - * @extends \FireHub\Core\Support\DataStructure\Enumerable - */ -interface Collection extends Enumerable {} \ No newline at end of file diff --git a/src/support/datastructure/firehub.Enumerable.php b/src/support/datastructure/firehub.Enumerable.php deleted file mode 100644 index 1515eead..00000000 --- a/src/support/datastructure/firehub.Enumerable.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 7.0 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure; - -use FireHub\Core\Support\Contracts\DataStructure; -use FireHub\Core\Shared\Contracts\IteratorAggregate; - -/** - * ### Enumerable Contract - * - * Represents a data structure that can be iterated.
- * Provides a standardized way to traverse elements via an external iterator. - * @since 1.0.0 - * - * @template TKey - * @template TValue - * - * @extends \FireHub\Core\Support\Contracts\DataStructure - * @extends \FireHub\Core\Shared\Contracts\IteratorAggregate - */ -interface Enumerable extends DataStructure, IteratorAggregate {} \ No newline at end of file diff --git a/src/support/datastructure/interface.Storage.php b/src/support/datastructure/interface.Storage.php new file mode 100644 index 00000000..048a3871 --- /dev/null +++ b/src/support/datastructure/interface.Storage.php @@ -0,0 +1,44 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure; + +/** + * ### Storage Abstraction Layer + * + * Root contract for all storage implementations in the system.
+ * A Storage represents a persistence boundary responsible for holding, exposing, and iterating over data entries + * through a unified access model. It abstracts away the underlying memory or structural representation, ensuring that + * all implementations provide a consistent entry-based interface for consumption by Data Structures. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +interface Storage { + + /** + * ### Traverses Storage Elements + * + * Provides a unified, read-only traversal contract for accessing all elements within a storage implementation. + * The method exposes elements in their natural iteration order without leaking internal structure details or + * coupling the consumer to a specific storage strategy. + * Each storage implementation defines its own traversal mechanism, but all must guarantee compliance with + * the iterable contract and ensure safe, side-effect-free iteration over the current state. + * @since 1.0.0 + * + * @return iterable + */ + public function iterate ():iterable; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.BackInsertion.php b/src/support/datastructure/storage/capability/firehub.BackInsertion.php new file mode 100644 index 00000000..b0c56143 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.BackInsertion.php @@ -0,0 +1,39 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Back Insertion + * + * Provides the ability to insert one or more elements at the logical end of the structure in constant time, assuming + * tail access is available. + * @since 1.0.0 + * + * @template TValue + */ +interface BackInsertion { + + /** + * ### Prepend values to the back + * @since 1.0.0 + * + * @param TValue ...$values

+ * List of values to add to the back of the storage. + *

+ * + * @return static The modified storage structure. + */ + public function addLast (mixed ...$values):static; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.BackMutation.php b/src/support/datastructure/storage/capability/firehub.BackMutation.php new file mode 100644 index 00000000..0d5f9267 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.BackMutation.php @@ -0,0 +1,26 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Back Mutation Capability + * + * Combines back insertion and back removal, enabling full mutation of the logical end of the structure. + * @since 1.0.0 + * + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Storage\Capability\BackInsertion + */ +interface BackMutation extends BackInsertion, BackRemoval {} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.BackRemoval.php b/src/support/datastructure/storage/capability/firehub.BackRemoval.php new file mode 100644 index 00000000..8b1c48e2 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.BackRemoval.php @@ -0,0 +1,36 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Back Removal + * + * Provides the ability to remove one or more elements from the logical end of the structure in constant time. + * @since 1.0.0 + */ +interface BackRemoval { + + /** + * ### Removes values from the back + * @since 1.0.0 + * + * @param int $items [optional]

+ * Number of values to remove from the back of the storage. + *

+ * + * @return static The modified storage structure. + */ + public function removeLast (int $items = 1):static; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.Cloneable.php b/src/support/datastructure/storage/capability/firehub.Cloneable.php new file mode 100644 index 00000000..78ffc55d --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.Cloneable.php @@ -0,0 +1,40 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Provide explicit deep copy of a storage + * + * Defines a contract for creating a full, independent copy of a storage by duplicating all underlying data. The + * resulting instance has no shared state with the original, ensuring complete isolation at the cost of O(n) time and + * memory complexity. Suitable for scenarios where data integrity and independence are required over performance + * optimizations. + * @since 1.0.0 + */ +interface Cloneable { + + /** + * ### Create a full independent deep copy of the storage + * + * Creates a completely independent clone of the storage by duplicating all internal data. The resulting instance + * shares no state with the original, ensuring full isolation between both objects. This operation has O(n) time + * and memory complexity and is suitable when data integrity and strict independence are required over performance + * optimization. + * @since 1.0.0 + * + * @return static A deep copy of the storage. + */ + public function copy ():static; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.CyclicTraversal.php b/src/support/datastructure/storage/capability/firehub.CyclicTraversal.php new file mode 100644 index 00000000..dbaa981b --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.CyclicTraversal.php @@ -0,0 +1,47 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Cyclic Traversal Capability + * + * Provides the ability to traverse a data structure in a continuous infinite loop. This capability is intended for + * cyclic or circular data structures where iteration does not terminate naturally and instead restarts from the + * beginning upon reaching the end. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +interface CyclicTraversal { + + /** + * ### Cycle through elements infinitely + * + * Returns an infinite iterable sequence that continuously traverses the structure in a loop, restarting from the + * beginning once the end is reached. + * @since 1.0.0 + * + * @param null|int $limit

+ * Maximum number of elements to yield. If null, traversal is infinite. + *

+ * + * @return iterable Infinite cyclic traversal of elements. + * + * @warning This method does not terminate naturally and must be consumed with care + * (e.g. with limits or external stopping conditions). + */ + public function cycle (?int $limit = null):iterable; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.DequeMutation.php b/src/support/datastructure/storage/capability/firehub.DequeMutation.php new file mode 100644 index 00000000..2a0ff754 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.DequeMutation.php @@ -0,0 +1,30 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Deque End Mutation Capability + * + * Defines the ability of a storage structure to perform double-ended mutations on a linear sequence. This includes + * adding elements to both ends (append and prepend) as well as removing elements from both ends (pop and shift). + * It is intended for data structures that maintain ordered elements with efficient front and back operations, such as + * deque, linked lists, and sequence-based storages. + * @since 1.0.0 + * + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Storage\Capability\FrontMutation + * @extends \FireHub\Core\Support\DataStructure\Storage\Capability\BackMutation + */ +interface DequeMutation extends FrontMutation, BackMutation {} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.FrontInsertion.php b/src/support/datastructure/storage/capability/firehub.FrontInsertion.php new file mode 100644 index 00000000..692b62b5 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.FrontInsertion.php @@ -0,0 +1,38 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Front Insertion + * + * Provides the ability to insert one or more elements at the logical start the structure in constant time. + * @since 1.0.0 + * + * @template TValue + */ +interface FrontInsertion { + + /** + * ### Prepend values to the front + * @since 1.0.0 + * + * @param TValue ...$values

+ * List of values to add to the front of the storage. + *

+ * + * @return static The modified storage structure. + */ + public function addFirst (mixed ...$values):static; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.FrontMutation.php b/src/support/datastructure/storage/capability/firehub.FrontMutation.php new file mode 100644 index 00000000..9258e9e4 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.FrontMutation.php @@ -0,0 +1,26 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Front Mutation Capability + * + * Combines front insertion and front removal, enabling full mutation of the logical start of the structure. + * @since 1.0.0 + * + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Storage\Capability\FrontInsertion + */ +interface FrontMutation extends FrontInsertion, FrontRemoval {} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.FrontRemoval.php b/src/support/datastructure/storage/capability/firehub.FrontRemoval.php new file mode 100644 index 00000000..99c33d2f --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.FrontRemoval.php @@ -0,0 +1,36 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Front Removal + * + * Provides the ability to remove one or more elements from the logical start of the structure in constant time. + * @since 1.0.0 + */ +interface FrontRemoval { + + /** + * ### Removes values from the front + * @since 1.0.0 + * + * @param int $items [optional]

+ * Number of values to remove from the front of the storage. + *

+ * + * @return static The modified storage structure. + */ + public function removeFirst (int $items = 1):static; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.IndexAccess.php b/src/support/datastructure/storage/capability/firehub.IndexAccess.php new file mode 100644 index 00000000..8d4ffbe7 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.IndexAccess.php @@ -0,0 +1,65 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +use FireHub\Core\Shared\Type\Maybe; + +/** + * ### Positional Index Access Capability + * + * A storage capability that provides read-only access to elements based on their positional index within a linear + * structure. It enables safe retrieval and existence checks over ordered collections such as arrays, lists, fixed-size + * buffers, and ring buffers. The abstraction assumes a dense or logically mapped index space where each integer index + * represents a position rather than an identity or key. + * @since 1.0.0 + * + * @template TValue + */ +interface IndexAccess { + + /** + * ### Check Index Existence + * + * Determines whether a valid element exists at the given positional index. This operation does not retrieve the + * value and is optimized for fast boundary or presence checks within indexed storage structures. + * @since 1.0.0 + * + * @param int $index

+ * The key to check for existence. + *

+ * + * @return bool True if the key exists, false otherwise. + */ + public function has (int $index):bool; + + /** + * ### Retrieve Value by Index + * + * Returns the value located at the specified positional index within the storage. If the index does not exist or + * is out of bounds, an empty Maybe is returned. This operation provides safe, read-only access to ordered storage + * without exposing internal structure or requiring direct array access. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Type\Maybe As return. + * + * @param int $index

+ * The key to retrieve value by index. + *

+ * + * @return \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe Maybe with element at index + * position of the storage, or Maybe with null if element at index position of the storage doesn't exist. + */ + public function get (int $index):Maybe; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.IndexMutation.php b/src/support/datastructure/storage/capability/firehub.IndexMutation.php new file mode 100644 index 00000000..862fcaa0 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.IndexMutation.php @@ -0,0 +1,72 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +use FireHub\Core\Shared\Enums\MutationOutcome; + +/** + * ### Positional Index Mutation Capability + * + * A storage capability that enables modification of elements based on their positional index within a linear + * structure. It defines write and removal operations over indexed storage models such as arrays, lists, fixed + * buffers, and ring buffers. The abstraction assumes a positional addressing scheme where integer indexes represent + * logical positions rather than identity or key-based mappings. + * @since 1.0.0 + * + * @template TValue + */ +interface IndexMutation { + + /** + * ### Set Value at Index + * + * Assigns a value to the specified positional index in the storage. If the index already contains a value, it is + * overwritten according to the storage’s mutation semantics. This operation assumes a valid index-based + * addressing model and does not perform key resolution or structural lookup. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\MutationOutcome As return. + * + * @param int $index

+ * The key where the value will be added. + *

+ * @param TValue $value

+ * Value to add to the index. + *

+ * + * @return \FireHub\Core\Shared\Enums\MutationOutcome::CREATED|\FireHub\Core\Shared\Enums\MutationOutcome::UPDATED + * An enum indicating the result of the mutation operation. + */ + public function set (int $index, mixed $value):MutationOutcome; + + /** + * ### Remove Value by Index + * + * Removes the element located at the specified index. The behavior after removal depends on the storage + * implementation (e.g., shifting in lists, pulling in fixed storage, or logical repositioning in ring buffers). + * This operation affects structural layout but not value semantics directly. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\MutationOutcome As return. + * + * @param int $index

+ * The key of the value to remove. + *

+ * + * @return \FireHub\Core\Shared\Enums\MutationOutcome::REMOVED|\FireHub\Core\Shared\Enums\MutationOutcome::NOT_FOUND + * An enum indicating the result of the mutation operation. + */ + public function remove (int $index):MutationOutcome; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.KeyAccess.php b/src/support/datastructure/storage/capability/firehub.KeyAccess.php new file mode 100644 index 00000000..470805dd --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.KeyAccess.php @@ -0,0 +1,67 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +use FireHub\Core\Shared\Type\Maybe; + +/** + * ### Key-Based Read Access Capability + * + * A storage capability that provides read-only access to elements identified by a key (string or integer). It + * enables safe retrieval and existence checks without exposing mutation operations or internal storage structure. + * Designed for associative data structures such as maps, registries, and indexed key-value stores where lookup + * semantics are primary and structural details remain encapsulated. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + */ +interface KeyAccess { + + /** + * ### Check Key Existence + * + * Determines whether a value exists for the specified key in the storage. Provides a fast existence check + * without retrieving the underlying value, enabling safe conditional access patterns. + * @since 1.0.0 + * + * @param TKey $key

+ * The key to check for existence. + *

+ * + * @return bool True if the key exists, false otherwise. + */ + public function has (int|string $key):bool; + + /** + * ### Retrieve Value by Key + * + * Retrieves the value associated with the given key from an associative storage structure. If the key does not + * exist, an empty Maybe is returned instead of null, ensuring explicit handling of missing entries. This operation + * does not modify the storage and is designed for safe, read-only access to key-based data mappings such as + * dictionaries, maps, and registries. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Type\Maybe As return. + * + * @param TKey $key

+ * The key to retrieve value by key. + *

+ * + * @return \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe Maybe with element at key + * position of the storage, or Maybe with null if element at key position of the storage doesn't exist. + */ + public function get (int|string $key):Maybe; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.KeyMutation.php b/src/support/datastructure/storage/capability/firehub.KeyMutation.php new file mode 100644 index 00000000..e309ffef --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.KeyMutation.php @@ -0,0 +1,73 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +use FireHub\Core\Shared\Enums\MutationOutcome; + +/** + * ### Associative Key Mutation Capability + * + * A storage capability that enables modification of elements based on associative keys (string or integer + * identifiers). It defines write and removal operations over key-value storage models such as maps, dictionaries, + * and registries. The abstraction assumes a key-based addressing scheme where keys represent stable identifiers + * rather than positional indexes. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + */ +interface KeyMutation { + + /** + * ### Set Value by Key + * + * AAssigns a value to the specified key in the associative storage. If the key already exists, the existing + * value is overwritten. If it does not exist, a new entry is created. This operation is fundamental for + * key-value-based structures and does not involve positional logic or traversal. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\MutationOutcome As return. + * + * @param TKey $key

+ * The key where the value will be added. + *

+ * @param TValue $value

+ * Value to add to the key. + *

+ * + * @return \FireHub\Core\Shared\Enums\MutationOutcome::CREATED|\FireHub\Core\Shared\Enums\MutationOutcome::UPDATED + * An enum indicating the result of the mutation operation. + */ + public function set (int|string $key, mixed $value):MutationOutcome; + + /** + * ### Remove Value by Key + * + * Removes the entry associated with the specified key from the storage. If the key does not exist, the operation + * has no effect. This mutation affects only the associative mapping layer and does not depend on element ordering + * or structural position. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\MutationOutcome As return. + * + * @param TKey $key

+ * The key of the value to remove. + *

+ * + * @return \FireHub\Core\Shared\Enums\MutationOutcome::REMOVED|\FireHub\Core\Shared\Enums\MutationOutcome::NOT_FOUND + * An enum indicating the result of the mutation operation. + */ + public function remove (int|string $key):MutationOutcome; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.LinearBoundaryAccess.php b/src/support/datastructure/storage/capability/firehub.LinearBoundaryAccess.php new file mode 100644 index 00000000..e5e24b0c --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.LinearBoundaryAccess.php @@ -0,0 +1,54 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +use FireHub\Core\Shared\Type\Maybe; + +/** + * ### Linear Boundary Access Capability + * + * Defines the ability for a storage implementation to provide direct access to the boundaries + * of a linear sequence. This includes retrieving the first element and the last element without requiring full + * traversal of the underlying data. Intended as an optional optimization layer for linear structures where boundary + * access can be performed in constant time, while maintaining separation between storage concerns and data structure + * semantics. + * @since 1.0.0 + * + * @template TValue + */ +interface LinearBoundaryAccess { + + /** + * ### Retrieve the first element + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Type\Maybe As return. + * + * @return \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe Maybe with first element + * of the storage, or Maybe with null if storage is empty. + */ + public function first ():Maybe; + + /** + * ### Retrieve the last element + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Type\Maybe As return. + * + * @return \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe Maybe with last element + * of the storage, or Maybe with null if storage is empty. + */ + public function last ():Maybe; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.NodeAccess.php b/src/support/datastructure/storage/capability/firehub.NodeAccess.php new file mode 100644 index 00000000..c18187a8 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.NodeAccess.php @@ -0,0 +1,62 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +use FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle; + +/** + * ### Node Handle Access Capability + * + * Defines a read-only capability for accessing structural positions within a node-based storage system through + * NodeHandle references. It provides safe entry points into the internal topology without exposing raw nodes or + * traversal logic. This interface is intended exclusively for storage implementations that are based on explicit node + * structures such as linked lists, trees, or graph-like systems. + * @since 1.0.0 + * + * @template TValue + */ +interface NodeAccess { + + /** + * ### Retrieve First Node Handle + * + * Returns a NodeHandle representing the first logical element in the storage structure. The definition of + * “first” depends on the underlying topology (e.g. head in linked lists or root-like entry in hierarchical + * structures). Returns null if the structure is empty. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle As return. + * + * @return null|\FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle NodeHandle with value at the + * first position in the storage, or null if the structure is empty. + */ + public function firstNode ():?NodeHandle; + + /** + * ### Retrieve Last Node Handle + * + * Returns a NodeHandle representing the last logical element in the storage structure. Applicable primarily to + * ordered or linear node-based structures such as linked lists or deque-based implementations. Returns null if the + * structure is empty. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle As return. + * + * @return null|\FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle NodeHandle with value at the + * last position in the storage, or null if the structure is empty. + */ + public function lastNode ():?NodeHandle; + + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.NodeBidirectionalInsert.php b/src/support/datastructure/storage/capability/firehub.NodeBidirectionalInsert.php new file mode 100644 index 00000000..546d4ae3 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.NodeBidirectionalInsert.php @@ -0,0 +1,29 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Bidirectional Node Insertion Capability + * + * A composite capability that combines both forward (after) and backward (before) node insertion operations. It + * represents full positional insertion control within a node-based storage topology and is typically supported by + * doubly linked structures. + * @since 1.0.0 + * + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Storage\Capability\NodeInsertBefore + * @extends \FireHub\Core\Support\DataStructure\Storage\Capability\NodeInsertAfter + */ +interface NodeBidirectionalInsert extends NodeInsertBefore, NodeInsertAfter {} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.NodeInsertAfter.php b/src/support/datastructure/storage/capability/firehub.NodeInsertAfter.php new file mode 100644 index 00000000..d921661e --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.NodeInsertAfter.php @@ -0,0 +1,50 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +use FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle; + +/** + * ### Post-Node Insertion Capability + * + * Defines the ability to insert a node directly after a given target node within a pointer-based storage structure. + * This operation assumes the existence of forward-linking topology and is typically O(1) in singly, doubly, and + * circular linked structures. + * @since 1.0.0 + * + * @template TValue + */ +interface NodeInsertAfter { + + /** + * ### Insert a node after a target node + * + * Inserts a new node immediately after the specified target node, updating internal links to maintain structural + * consistency. Operates in O(1) for linked implementations where node references are directly accessible. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle As parameter and return. + * + * @param \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle $target

+ * The node after which the new node will be inserted. + *

+ * @param TValue $value

+ * The value to be inserted. + *

+ * + * @return \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle New node handle. + */ + public function insertAfter (NodeHandle $target, mixed $value):NodeHandle; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.NodeInsertBefore.php b/src/support/datastructure/storage/capability/firehub.NodeInsertBefore.php new file mode 100644 index 00000000..b069a057 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.NodeInsertBefore.php @@ -0,0 +1,50 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +use FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle; + +/** + * ### Pre-Node Insertion Capability + * + * Defines the ability to insert a node directly before a given target node. This operation requires backward + * navigation or traversal support and is naturally supported in doubly linked structures, while potentially O(n) in + * singly linked implementations. + * @since 1.0.0 + * + * @template TValue + */ +interface NodeInsertBefore { + + /** + * ### Insert a node before a target node + * + * Inserts a new node immediately before the specified target node. Requires traversal in singly linked + * structures but operates in O(1) for doubly linked implementations where backward references are available. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle As parameter and return. + * + * @param \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle $target

+ * The node before which the new node will be inserted. + *

+ * @param TValue $value

+ * The value to be inserted. + *

+ * + * @return \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle New node handle. + */ + public function insertBefore (NodeHandle $target, mixed $value):NodeHandle; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.NodeMutation.php b/src/support/datastructure/storage/capability/firehub.NodeMutation.php new file mode 100644 index 00000000..da2f800e --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.NodeMutation.php @@ -0,0 +1,29 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Full Node Mutation Capability + * + * A composite capability that represents full structural mutation support for node-based storage systems. It + * combines bidirectional insertion and node removal capabilities, enabling complete topological control over a linked + * structure. Typically implemented by doubly linked or a circular linked storages. + * @since 1.0.0 + * + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Storage\Capability\NodeBidirectionalInsert + * @extends \FireHub\Core\Support\DataStructure\Storage\Capability\NodeRemoval + */ +interface NodeMutation extends NodeBidirectionalInsert, NodeRemoval {} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.NodeRemoval.php b/src/support/datastructure/storage/capability/firehub.NodeRemoval.php new file mode 100644 index 00000000..10b09d54 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.NodeRemoval.php @@ -0,0 +1,48 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +use FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle; + +/** + * ### Node Removal Capability + * + * Defines the ability to remove a specific node from a storage structure by directly manipulating its surrounding + * links. This operation is pointer-based and allows O(1) removal in structures that maintain direct references to + * adjacent nodes. + * @since 1.0.0 + * + * @template TValue + */ +interface NodeRemoval { + + /** + * ### Remove Node from storage + * + * Removes the specified node from the storage structure and reconnects surrounding nodes to preserve continuity. + * Complexity depends on a structure type (O(1) for doubly-linked with direct reference, O(n) for singly-linked + * traversal-based removal). + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle As parameter. + * + * @param \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle $handle

+ * The node to remove. + *

+ * + * @return static The modified storage structure. + */ + public function removeNode (NodeHandle $handle):static; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.StorageMetricsAware.php b/src/support/datastructure/storage/capability/firehub.StorageMetricsAware.php new file mode 100644 index 00000000..92ca4f08 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.StorageMetricsAware.php @@ -0,0 +1,58 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +/** + * ### Storage Metrics Awareness Contract + * + * A unified interface that defines standardized introspection capabilities for storage structures.
+ * It provides a consistent way to access structural metrics such as the number of active elements and the maximum + * storage capacity across all FireHub data structure implementations.
+ *This contract ensures uniform observability for both bounded and unbounded storage types, enabling generic + * algorithms, diagnostics, and performance-aware operations to interact with different storage implementations + * without knowledge of their internal representation.
+ * It serves as a core abstraction layer for monitoring storage state, supporting operations such as utilization + * analysis, capacity planning, and runtime optimization decisions. + * @since 1.0.0 + */ +interface StorageMetricsAware { + + /** + * ### Retrieve the maximum number of elements that can be stored in the storage + * @since 1.0.0 + * + * @return null|non-negative-int The maximum number of elements that can be stored in the storage, or null for + * unbounded storage. + */ + public function capacity ():?int; + + /** + * ### Retrieve the remaining capacity that can be used in the storage + * + * @since 1.0.0 + * + * @return null|non-negative-int The remaining capacity that can be used in the storage, or null for unbounded + * storage. + */ + public function availableCapacity ():?int; + + /** + * ### Retrieve the number of elements stored in the storage + * @since 1.0.0 + * + * @return non-negative-int The number of elements stored in the storage. + */ + public function size ():int; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.ArrListStorage.php b/src/support/datastructure/storage/firehub.ArrListStorage.php new file mode 100644 index 00000000..e06c0593 --- /dev/null +++ b/src/support/datastructure/storage/firehub.ArrListStorage.php @@ -0,0 +1,300 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.4 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage; + +use FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; +use FireHub\Core\Support\DataStructure\Storage\Capability\ { + Cloneable, DequeMutation, IndexAccess, IndexMutation, LinearBoundaryAccess, StorageMetricsAware +}; +use FireHub\Core\Shared\Type\Maybe; +use FireHub\Core\Shared\Enums\MutationOutcome; +use FireHub\Core\Support\LowLevel\ { + Arr, Math +}; + +/** + * ### Array-Based List Storage + * + * A mutable sequential storage implementation backed by a native array structure. Represents an ordered list of + * elements with integer-indexed access and preserves insertion order. Supports fast append operations, indexed + * mutation, and controlled front and back insertions/removals with predictable performance characteristics. Designed + * for general-purpose list-based collections where ordered iteration and positional access are primary requirements. + * @since 1.0.0 + * + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Storage + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\LinearBoundaryAccess + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\DequeMutation + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\IndexAccess + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\IndexMutation + */ +final class ArrListStorage implements Storage, Cloneable, StorageMetricsAware, LinearBoundaryAccess, DequeMutation, + IndexAccess, IndexMutation { + + /** + * ### Underlying data storage + * @since 1.0.0 + * + * @var array + */ + private array $data = []; + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer As parameter. + * @uses \FireHub\Core\Support\LowLevel\Arr::values() To convert the array keys to integers. + * + * @param null|\FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer $initializer [optional]

+ * Initial data to store. + *

+ * + * @return void + */ + public function __construct (?ArrStorageInitializer $initializer = null) { + + if ($initializer !== null) $this->data = Arr::values($initializer()); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function iterate ():iterable { + + /** @var array */ + return $this->data; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function copy ():static { + + $clone = new static(); + + $clone->data = []; + + foreach ($this->data as $value) + $clone->data[] = $value; + + /** @var static */ + return $clone; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function capacity ():null { + + return null; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function availableCapacity ():null { + + return null; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::count() To count the number of elements in the storage. + */ + public function size ():int { + + return Arr::count($this->data); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::first() To get the first element in the storage. + */ + public function first ():Maybe { + + if ($this->data === []) return Maybe::none(); + + /** @var TValue $first */ + $first = Arr::first($this->data); + + return Maybe::some($first); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::last() To get the last element in the storage. + */ + public function last ():Maybe { + + if ($this->data === []) return Maybe::none(); + + /** @var TValue $last */ + $last = Arr::last($this->data); + + return Maybe::some($last); + + } + + /** + * @inheritDoc + * + * @uses \FireHub\Core\Support\LowLevel\Arr::unshift() To prepend values to the beginning of the array. + * + * @since 1.0.0 + */ + public function addFirst (mixed ...$values):static { + + Arr::unshift($this->data, ...$values); + + return $this; + + } + + /** + * @inheritDoc + * + * @uses \FireHub\Core\Support\LowLevel\Arr::push() To append values to the end of the array. + * + * @since 1.0.0 + */ + public function addLast (mixed ...$values):static { + + Arr::push($this->data, ...$values); + + return $this; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::slice() To remove first items from the array. + * @uses \FireHub\Core\Support\LowLevel\Math::max() To ensure the number of items to remove is not negative. + */ + public function removeFirst (int $items = 1):static { + + $this->data = Arr::slice($this->data, Math::max($items, 0)); + + return $this; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::pop() To remove last items from the array. + */ + public function removeLast (int $items = 1):static { + + while ($items-- > 0) + Arr::pop($this->data); + + return $this; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::keyExists() To check if a key exists in the storage. + */ + public function has (int $index):bool { + + return Arr::keyExists($index, $this->data); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. + */ + public function get (int $index):Maybe { + + return $this->has($index) + ? Maybe::some($this->data[$index]) // @phpstan-ignore offsetAccess.notFound + : Maybe::none(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. + */ + public function set (int $index, mixed $value):MutationOutcome { + + $this->data[$index] = $value; + + return $this->has($index) + ? MutationOutcome::UPDATED + : MutationOutcome::CREATED; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. + */ + public function remove (int $index):MutationOutcome { + + unset($this->data[$index]); + + return $this->has($index) + ? MutationOutcome::REMOVED + : MutationOutcome::NOT_FOUND; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.ArrMapStorage.php b/src/support/datastructure/storage/firehub.ArrMapStorage.php new file mode 100644 index 00000000..1d0fb60b --- /dev/null +++ b/src/support/datastructure/storage/firehub.ArrMapStorage.php @@ -0,0 +1,196 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage; + +use FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; +use FireHub\Core\Support\DataStructure\Storage\Capability\ { + Cloneable, KeyAccess, KeyMutation, StorageMetricsAware +}; +use FireHub\Core\Shared\Type\Maybe; +use FireHub\Core\Shared\Enums\MutationOutcome; +use FireHub\Core\Support\LowLevel\Arr; + +/** + * ### Array-Based Map Storage + * + * A mutable key-value storage implementation backed by a native PHP associative array. Provides fast key-based + * access, insertion, and mutation while preserving insertion order. Designed for structured datasets where elements + * are accessed via unique keys rather than positional indexing. Optimized for configuration objects, registries, + * and general-purpose associative collections with predictable lookup performance. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Storage + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\KeyAccess + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\KeyMutation + */ +final class ArrMapStorage implements Storage, Cloneable, StorageMetricsAware, KeyAccess, KeyMutation { + + /** + * ### Underlying data storage + * @since 1.0.0 + * + * @var array + */ + private array $data = []; + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer As parameter. + * + * @param null|\FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer $initializer [optional]

+ * Initial data to store. + *

+ * + * @return void + */ + public function __construct (?ArrStorageInitializer $initializer = null) { + + if ($initializer !== null) $this->data = $initializer(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function iterate ():iterable { + + return $this->data; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function copy ():static { + + $clone = new static(); + + $clone->data = []; + + foreach ($this->data as $key => $value) + $clone->data[$key] = $value; + + /** @var static */ + return $clone; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function capacity ():null { + + return null; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function availableCapacity ():null { + + return null; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::count() To count the number of elements in the storage. + */ + public function size ():int { + + return Arr::count($this->data); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::keyExists() To check if a key exists in the storage. + */ + public function has (int|string $key):bool { + + return Arr::keyExists($key, $this->data); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\ArrMapStorage::has() To check if key exists. + */ + public function get (int|string $key):Maybe { + + return $this->has($key) + ? Maybe::some($this->data[$key]) // @phpstan-ignore offsetAccess.notFound + : Maybe::none(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. + */ + public function set (int|string $key, mixed $value):MutationOutcome { + + $this->data[$key] = $value; + + return $this->has($key) + ? MutationOutcome::UPDATED + : MutationOutcome::CREATED; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. + */ + public function remove (int|string $key):MutationOutcome { + + unset($this->data[$key]); + + return $this->has($key) + ? MutationOutcome::REMOVED + : MutationOutcome::NOT_FOUND; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.GeneratorStorage.php b/src/support/datastructure/storage/firehub.GeneratorStorage.php new file mode 100644 index 00000000..9a58af44 --- /dev/null +++ b/src/support/datastructure/storage/firehub.GeneratorStorage.php @@ -0,0 +1,61 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage; + +use FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Support\DataStructure\Storage\Initialization\GeneratorStorageInitializer; + +/** + * ### Lazy Generator-Based Storage + * + * A read-optimized storage implementation based on PHP generators. Designed for streaming large or infinite datasets + * where materialization is not required. Does not guarantee rewinding or persistent state beyond iteration, making + * it suitable for pipeline-based or lazy evaluation scenarios. + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Storage + */ +final readonly class GeneratorStorage implements Storage { + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\GeneratorStorageInitializer As parameter. + * + * @param \FireHub\Core\Support\DataStructure\Storage\Initialization\GeneratorStorageInitializer $initializer

+ * Initial data to store. + *

+ * + * @return void + */ + public function __construct ( + private GeneratorStorageInitializer $initializer + ) {} + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function iterate ():iterable { + + return ($this->initializer)(); + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.Node.php b/src/support/datastructure/storage/firehub.Node.php new file mode 100644 index 00000000..054367b2 --- /dev/null +++ b/src/support/datastructure/storage/firehub.Node.php @@ -0,0 +1,47 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage; + +use FireHub\Core\Support\DataStructure\Storage; + +/** + * ### Base Storage Node Contract + * + * A minimal structural contract representing a node inside a storage implementation. It defines only value ownership + * semantics without imposing any constraints on linkage, traversal, or topology. + * @since 1.0.0 + * + * @template TValue + */ +interface Node { + + /** + * ### Retrieves the storage instance that owns this node + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage As return. + * + * @return \FireHub\Core\Support\DataStructure\Storage Storage instance that owns this node. + */ + public function owner ():Storage; + + /** + * ### Get the value contained in this node + * @since 1.0.0 + * + * @return TValue The value contained in this node. + */ + public function value ():mixed; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/handle/firehub.NodeHandle.php b/src/support/datastructure/storage/handle/firehub.NodeHandle.php new file mode 100644 index 00000000..3fe4d007 --- /dev/null +++ b/src/support/datastructure/storage/handle/firehub.NodeHandle.php @@ -0,0 +1,59 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Handle; + +use FireHub\Core\Support\DataStructure\Storage\Node; + +/** + * ### Opaque Storage Node Handle + * + * A lightweight, immutable reference that uniquely identifies and encapsulates a node within a storage structure. + * The handle acts as a stable external pointer to an internal node without exposing its implementation details or + * allowing direct structural manipulation. It is bound to a specific storage instance and is intended to be used as a + * safe token for node-based operations such as mutation, retrieval, or structural navigation through controlled APIs. + * NodeHandle does not provide traversal capabilities and does not represent a cursor in the navigational sense. + * Instead, it serves purely as an identity-safe bridge between external API consumers and internal storage topology. + * @since 1.0.0 + * + * @template TValue + */ +final readonly class NodeHandle { + + /** + * ### Constructor + * @since 1.0.0 + * + * @param \FireHub\Core\Support\DataStructure\Storage\Node $node

+ * The node to be encapsulated by the handle. + *

+ * + * @return void + */ + public function __construct ( + private Node $node + ) {} + + /** + * ### Get encapsulated node + * @since 1.0.0 + * + * @return \FireHub\Core\Support\DataStructure\Storage\Node Encapsulated node. + */ + public function node ():Node { + + return $this->node; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php b/src/support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php new file mode 100644 index 00000000..dfda8f54 --- /dev/null +++ b/src/support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php @@ -0,0 +1,38 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Initialization; + +/** + * ### Array Storage Initializer + * + * Provides a strategy for initializing the internal array of an ArrStorage instance during construction. Enables + * controlled, potentially lazy, or computed population of the underlying data structure while preserving encapsulation + * and avoiding direct array injection. Suitable for large datasets, dynamic generation, or deferred materialization + * patterns. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + */ +interface ArrStorageInitializer { + + /** + * ### Invoke Initializer + * @since 1.0.0 + * + * @return array Underlying data for storage. + */ + public function __invoke ():array; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/initialization/firehub.GeneratorStorageInitializer.php b/src/support/datastructure/storage/initialization/firehub.GeneratorStorageInitializer.php new file mode 100644 index 00000000..0a68325c --- /dev/null +++ b/src/support/datastructure/storage/initialization/firehub.GeneratorStorageInitializer.php @@ -0,0 +1,39 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Initialization; + +use Generator; + +/** + * ### Generator Storage Initializer + * + * Defines a contract for initializing generator-based storage by producing an iterable data stream. Enables + * deferred, memory-efficient data provisioning through generators while maintaining a consistent and encapsulated + * initialization interface for streaming storage implementations. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +interface GeneratorStorageInitializer { + + /** + * ### Invoke Initializer + * @since 1.0.0 + * + * @return Generator Underlying data for storage. + */ + public function __invoke ():Generator; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php b/src/support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php new file mode 100644 index 00000000..46dfc3a0 --- /dev/null +++ b/src/support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php @@ -0,0 +1,59 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy; + +use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; +use Closure; + +/** + * ### Initialize an array using a value-generating callback + * + * A concrete ArrStorageInitializer implementation that delegates array creation to a user-provided callback. + * Executes the callback during initialization to produce the underlying dataset, enabling flexible, dynamic, or + * computed data generation while preserving a consistent initialization contract. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer + */ +final readonly class ArrCallbackInitializer implements ArrStorageInitializer { + + /** + * ### Constructor + * @since 1.0.0 + * + * @param Closure():array $callback

+ * A callback function that returns an array of key-value pairs to be used as the underlying dataset. + *

+ * + * @return void + */ + public function __construct( + private Closure $callback + ) {} + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function __invoke ():array { + + return ($this->callback)(); + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php b/src/support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php new file mode 100644 index 00000000..8a287b09 --- /dev/null +++ b/src/support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php @@ -0,0 +1,71 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy; + +use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; +use FireHub\Core\Support\LowLevel\Arr; + +/** + * ### Initialize an array by filling it with a repeated value + * + * Creates an array of a defined size where each element is initialized with the same value. Useful for pre-allocating + * collections, setting default states, or bootstrapping predictable datasets (e.g., fixed-size buffers, placeholders, + * or test fixtures). The initializer ensures consistent indexing and value assignment across the entire range, + * providing a fast and deterministic way to populate storage. + * @since 1.0.0 + * + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer + */ +final readonly class ArrFillInitializer implements ArrStorageInitializer { + + /** + * ### Constructor + * @since 1.0.0 + * + * @param TValue $value

+ * Value to use for filling. + *

+ * @param int $start_index

+ * The first index of the returned array. + *

+ * @param int<0, 2147483647> $length

+ * Number of elements to insert. Must be greater than or equal to zero. + *

+ * + * @return void + */ + public function __construct( + private mixed $value, + private int $start_index, + private int $length + ) {} + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::fill() To fill an array with values. + * + * @throws \FireHub\Core\Throwable\Error\LowLevel\Arr\OutOfRangeError If $length is out of range. + */ + public function __invoke ():array { + + return Arr::fill($this->value, $this->start_index, $this->length); + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php b/src/support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php new file mode 100644 index 00000000..36b6a321 --- /dev/null +++ b/src/support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php @@ -0,0 +1,95 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy; + +use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; +use FireHub\Core\Throwable\Exception\Support\DataStructure\OutOfBoundsException; +use FireHub\Core\Throwable\Error\LowLevel\Arr\OutOfRangeError; +use FireHub\Core\Support\LowLevel\Arr; + +/** + * ### Generate a sequential array from a numeric or string range + * + * Creates a contiguous sequence of values between a defined start and end boundary, optionally using a custom step. + * Useful for quickly bootstrapping collections with predictable numeric keys or values (e.g., index ranges, pagination + * offsets, test datasets). The initializer ensures consistent ordering and supports both ascending and descending + * ranges, depending on the provided step. + * @since 1.0.0 + * + * @template TValue of float|int|string + * + * @implements \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer + */ +final readonly class ArrRangeInitializer implements ArrStorageInitializer { + + /** + * ### Constructor + * @since 1.0.0 + * + * @param TValue $start

+ * The starting value of the range. + *

+ * @param TValue $end

+ * The ending value of the range. + *

+ * @param (TValue is float ? float : int|float) $step [optional]

+ * The step size between each value in the range. Defaults to 1. + *

+ * + * @return void + */ + public function __construct( + private int|float|string $start, + private int|float|string $end, + private int|float $step = 1 + ) {} + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::range() To create an array containing a range of elements. + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\OutOfBoundsException If $step is 0, $start, $end, + * or $step is not finite, or $step is negative, but the produced range is increasing (in other words, $start <= + * $end), or if one is string, but not both. + * + * @note Character sequence values are limited to a length of one.
+ * If a length greater than one is entered only the first character is used. + */ + public function __invoke ():array { + + try { + + /** @var array */ + return Arr::range($this->start, $this->end, $this->step); + + } catch (OutOfRangeError $error) { + + throw OutOfBoundsException::builder() + ->withMessage($error->getMessage()) + ->withContext([ + 'start' => $this->start, + 'end' => $this->end, + 'step' => $this->step + ]) + ->build(); + + } + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php b/src/support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php new file mode 100644 index 00000000..109bdff7 --- /dev/null +++ b/src/support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php @@ -0,0 +1,59 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy; + +use FireHub\Core\Support\DataStructure\Storage\Initialization\GeneratorStorageInitializer; +use Closure, Generator; + +/** + * ### Generator Callback Initializer + * + * A concrete GeneratorStorageInitializer implementation that delegates data stream creation to a user-provided + * callback. Executes the callback to return a generator or iterable sequence, allowing dynamic, lazy, and + * memory-efficient data generation while preserving a uniform initialization contract. + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Storage\Initialization\GeneratorStorageInitializer + */ +final readonly class GeneratorCallbackInitializer implements GeneratorStorageInitializer { + + /** + * ### Constructor + * @since 1.0.0 + * + * @param Closure():Generator $callback

+ * A callback function that returns an Generator of key-value pairs to be used as the underlying dataset. + *

+ * + * @return void + */ + public function __construct( + private Closure $callback + ) {} + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function __invoke ():Generator { + + return ($this->callback)(); + + } + +} \ No newline at end of file diff --git a/src/throwable/exception/support/datastructure/firehub.InvalidBufferException.php b/src/throwable/exception/support/datastructure/firehub.InvalidBufferException.php new file mode 100644 index 00000000..778beabe --- /dev/null +++ b/src/throwable/exception/support/datastructure/firehub.InvalidBufferException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### Invalid buffer exception + * @since 1.0.0 + */ +class InvalidBufferException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'Buffer state is invalid.'; + +} \ No newline at end of file diff --git a/src/throwable/exception/support/datastructure/firehub.NodeOwnershipException.php b/src/throwable/exception/support/datastructure/firehub.NodeOwnershipException.php new file mode 100644 index 00000000..52c21bc4 --- /dev/null +++ b/src/throwable/exception/support/datastructure/firehub.NodeOwnershipException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### Provided node has the wrong ownership + * @since 1.0.0 + */ +class NodeOwnershipException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'Provided node has the wrong ownership.'; + +} \ No newline at end of file From 03bdc555bf86df0e157c7211f9cca8257ecf0830 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 19 May 2026 12:11:22 +0200 Subject: [PATCH 62/79] fix: correct method and static call typos in `ArrTest.php` **Detailed Description:** 1. **Resolved Typographical Errors:** - Updated method name `testKeyExist` to `testKeyExists` to align with naming conventions. - Corrected static method call from `Arr::keyExist` to `Arr::keyExists`. 2. **Improved Code Readability:** - Changes ensure consistency between method names and their usage across the codebase. **Key Benefits:** - Enhances code clarity and maintains conformity with established naming patterns. - Reduces potential confusion for future contributors working on the `Arr` utility and its test cases. --- CHANGELOG.md | 7 ++----- tests/unit/support/lowlevel/ArrTest.php | 4 ++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb9ec43f..22ad681c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,13 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.2.0...feature/support-high-level-api) +## [v0.3.0](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.2.0...v0.3.0) – 2026-05-19 ### Added -- Introduce foundational contracts, shared traits, and high-level abstractions for data structures (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`4f809d5`](https://github.com/The-FireHub-Project/Core-Foundation/commit/4f809d5)) -- Introduce foundational contracts, traits, and high-level data structure implementations (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`ee02c60`](https://github.com/The-FireHub-Project/Core-Foundation/commit/ee02c60)) -- Enhance core abstractions with new contracts, exception handling improvements, and serialization capabilities (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`4071f34`](https://github.com/The-FireHub-Project/Core-Foundation/commit/4071f34)) -- Add Convertable Trait, Enhance Collection Class, and Update Classmap (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`734f088`](https://github.com/The-FireHub-Project/Core-Foundation/commit/734f088)) +- redesign and expand data structure capabilities with flexible abstraction contracts (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`ce61610`](https://github.com/The-FireHub-Project/Core-Foundation/commit/ce61610)) ## [v0.2.0](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.1.1...v0.2.0) – 2026-03-23 diff --git a/tests/unit/support/lowlevel/ArrTest.php b/tests/unit/support/lowlevel/ArrTest.php index 4b964a8e..c499c585 100644 --- a/tests/unit/support/lowlevel/ArrTest.php +++ b/tests/unit/support/lowlevel/ArrTest.php @@ -87,9 +87,9 @@ public function testAny (bool $expected, array $array, mixed $result):void { #[TestWith([true, 2, [1, 2, 3]])] #[TestWith([false, 3, [1, 2, 3]])] #[TestWith([false, 'x', [null, 2, 3]])] - public function testKeyExist (bool $expected, int|string $key, array $array):void { + public function testKeyExists (bool $expected, int|string $key, array $array):void { - self::assertSame($expected, Arr::keyExist($key, $array)); + self::assertSame($expected, Arr::keyExists($key, $array)); } From f6c9043f69062d588376ed9854955406cf1e204b Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 19 May 2026 13:19:29 +0200 Subject: [PATCH 63/79] feat: add `autoload.files` directive to composer for PHAR integration **Detailed Description:** 1. **Introduced Autoload Files:** - Added the `autoload.files` directive to `composer.json` for including `dist/core.phar` in the project autoloader. 2. **Enhanced PHAR Compatibility:** - Ensures seamless integration of the prebuilt `core.phar` file into the application without requiring manual inclusion. 3. **Classmap Integration:** - Guarantees that `core.phar` is autoloaded consistently, improving runtime behavior in environments depending on the bundled PHAR. **Key Benefits:** - Simplifies dependency management by automating PHAR inclusion. - Enhances maintainability and ensures uniform loading in diverse execution environments. --- composer.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/composer.json b/composer.json index e2b4d5fa..6598dd0d 100644 --- a/composer.json +++ b/composer.json @@ -16,6 +16,11 @@ "firehub/phpstan-rules": "^1.0", "phpunit/phpunit": "^13.0" }, + "autoload": { + "files": [ + "dist/core.phar" + ] + }, "minimum-stability": "dev", "prefer-stable": true, "authors": [ From ac98fbf521eb5592cb529a30d05320ebc33b7bca Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 19 May 2026 14:23:34 +0200 Subject: [PATCH 64/79] chore: remove `autoload.files` directive and update PHAR builds in `composer.json` **Detailed Description:** 1. **Removed `autoload.files`:** - Eliminated the `autoload.files` directive from `composer.json`, which previously included `dist/core.phar` for autoloading. - Simplifies composer configuration by removing manual PHAR inclusion from the autoloader. 2. **Updated PHAR Builds:** - Made changes to `dist/core.phar` and `dist/core.min.phar` files, reflecting updated PHAR builds. **Key Benefits:** - Reduces reliance on manual file inclusion for better configuration maintainability. - Ensures consistency with the project's evolving standards for dependency and build management. --- composer.json | 5 ----- dist/core.min.phar | Bin 238055 -> 238079 bytes dist/core.phar | Bin 760160 -> 760195 bytes 3 files changed, 5 deletions(-) diff --git a/composer.json b/composer.json index 6598dd0d..e2b4d5fa 100644 --- a/composer.json +++ b/composer.json @@ -16,11 +16,6 @@ "firehub/phpstan-rules": "^1.0", "phpunit/phpunit": "^13.0" }, - "autoload": { - "files": [ - "dist/core.phar" - ] - }, "minimum-stability": "dev", "prefer-stable": true, "authors": [ diff --git a/dist/core.min.phar b/dist/core.min.phar index ffcedf13cef1e6eaff41850874fb00b11be078b5..0f77aea596eaa7fba1600bb799fc8621ffbd274d 100644 GIT binary patch delta 2849 zcmYLKcUY5G7taexNFZcFLO_fl+W;a;z%UY&Q7MRm3y@J9NKtVVsqM$8+d9x&eW5Cr z7NymyAXXnmaa2KErPw;2I-u@>NJUX`eD|EUBY))goO|}UzkA+$KTF^LEG@fiadq^% ztG@J~h!}5xK*k3kg9!tuWQ+iRFeU(Jix|n((URP~JRYxK>FRE>PM{*4mP&S3He)M1 zLQkpD_ZAUg`@kX=ZQU3iZe8R@EXH36e}03J@>E!?nVAkZuTL0lciR zo9R}OAnmjY2DoEo0O&75zckSZkg7x@u$FIWg-cg9?xnS8NwG-D-k8ORg-f`)eZ-i5 zj@S$?`^4Drb1`NdX*~)K%dFAlvNf7G+F;^zn{d!o+KdM1vO$M%306}m34p_$5`Tbe z5(Ac@D&X;)_BAFEg|i*0>2ngU=7yYX8x3ZgZ4&?@ zH6s&xb3>NeXM@)~`$+&7?56<)sWItBbp}YiY7CsL!N9eekKoYGAwkbS;b$OqDi_k_AYyMaj6%3th%{_)z=0{W$dy#>I0&;>n*-3#aTdTT$GH^NJE4&8 zG#k!3oC*O_`vn0I4$k%)4w98~7W{Yp8S*EpSLs?z~tGaOy|!2P|ir?PyY4+v_2qsNPeZ7rw$CCEu(*Ovxsv9v~*lk zO+%vET6jf(9hUZw#B#zUJl@83fdM0*)-sayIzE&u)FDkj(BW%eszX9I>x}5cqf>gI zQ%E4GG(Ky74s@|aiGj@n@L`nu9ODKkUM?KC)oG2x0T)ZUQ zC>&iN$a+_NztOHkpp=EKc&C?L@uCd_@!GczL@qxYh|G(3n+%pex@7^#+|eP=9UacO zBV9Z_QZeaMdg*;_w@#AU5O;RV4o1O>y%?479zCY6*F7>JLWC!Vt?=X+d50<&ACGAv znPv^q>7}IA%a-_iIf7}N7gD9l3mNy;YX%(Vcq5~mywfn}GwSbEUl&ALy$x)JAES|X zVme7K;OgYUnN$dXxBkco4;#of&d#EnL+aBXeP-8EUT|-Bdq~Ow(Kb7qCSM~3h16j zsT+(PDFQH9ZUD}!DS%rNFo%fHC%<6v?V*f@oqd8)${+n58PIM<%nK-uoEoBmwr&i; z7atM$(Z4f3_-p@}P!(Ge!Pt?zfljCa=gHq6kHWqjoBr!7eJGZ4U?@Is>9BEVevO)E zzLnMjK}eZiMQVoO&T1Ss74>4eIc$yfFaFW9iD&5IfT7T$ih_`c*MsnCh8u9Lf62i$ z1DBwknwAtjtU(5DJZJp?O#AA+=;G#uG*csN&( z1udv|`@8G76H>DELcqVza&8jg=gt1ZZF zE+FQC8uE)-!S0#FsLAFL{lVq%h$(0!phm{t{xf2?q|rh5abqeSiOcxWNCWt} zMGXT;jl!i<5fuW`Z&A2()X^x7i3VvAi9SH0nbc-YT4HQs()_GhX;VI#nV(Pu3Ni$UfPT!As25PenHzoAN9L9-Gc}ulX)TB?GW+TwU*D@{?Y^;sr2XN`d?a<`ZE2)G5hro<$YUIQY+fdH9u?id*|vX zV-^);3T|(mT=4e9ou6W(6Zcv0i}tpZ_S9rwTQ>33^9kLWI{r5&U-=ckT)XDOB@&bQ z_iT%f{K%oF8tKwKmh!+qu;YSB#4NL28+gPjbPzcj3g|p*0S@0WUp$X8IST&42u8{Gr4vUtHZTs~?pUr|P+Ly|AHU zSKpY&XOA<|yv+NbNw@SQlWn8JQ(iO&R;N_`byB~|c(V{MhX%;x^IL$gyq_Lim@x~_Mx)+Zm`y?Dk- ub+@>6d0|9x?#|NAxE-#~@A+3}bvf*wYLLS!GdVtZfA<)!K1E-^eG2 z#Zs$iZ7nE5i#0teWl`Ir)4}m5h$uL9w@h`ER_EROb>WZv&V6^k@AvM<>+|Bf=f!nb zjkLjgu6fg6V#c@w1Tr1~S&Rmtg$W0^&O`ysGSZ8*!J@(wJRWam&CaJ}4_{6m8e6d? zs~Ahc8G1^Mju>gd_9vtHXzR@Icnh7}pAv>Yi%5;lh~d7qAdenWn|F-g1k)koC^Qur z@pvf>EB29cQ#tW9aRFV5$pU~@lO%xWCVGG^luhiENfNX`8ke?Bs@=WEl@;O_qrO4>)O_I0d8~Vw}~u7>64y z!PJ{1i$K>e!Lr2CI1Im?M%(t|(NN-Nr6EmH8$4{MhaCy)%m|~0DZDd09UJYfLf~zbOvhJ__RL5h#qnq&_&DB09xee{!)$(%dD57!!zpe`3GLt zNhZx^Z_Y>r?%a^YHmksEz0Gof?`_rq1lwZLdfP0Jp4(#JBn1X;SLDE<^^8Qj0U_{9 zR0ue^pwg;~hJ-&g>5w~;$1}{>n+zip>=YmkPtU-C$?T9TX?DpF=7e27z)WQczz*d) z3VZEQD6=nxvs?BX0n%m$0}u`_&I|*|be0CYTWQSW4cPUL)BAI`U8?gb%P%vbEQi_v zd-qS(QI#wEje-$M4@fu-U~6DfDXCMrut)bZBI%>weE`k7`S-|Ws(CVlF=6ZIk2Knh za|AS2?)rp=M76o#-+b(_X0{H?(TI4w`Z2y5BM;ayqP;2;C|96Dnl4b`Yu~CuLiek} z(TPW=^pi>^f~4Yvl@i`sKF zWS66xh#Q5{5rXV>!uK2R6ab}ca>6^k>Vy}qo`ctZU=DJ5Y7R0l!8rpgKXYCQAaOy5 zVi$C{zam1pU_L6zH+;lw1>K|&7U$dR_Mma1$XH&bscfdh6viZ7`9<9$H)n) ztUaqAB-zmlqVf`xAva6n>!t+LMQ%uyRySnaZ*B!}nD35^?sHGaoKw`_?PLetYwl_` z%ZE`&A7VODA>huWjcchUm`ymz%n&?64H@&m;-fsV_(o4`>=g$qy;31bj~BM7@LrBd zph#8Vu#|>!VTS@3JJREA4R%A`7{k+tYvwk!yP&T&kXueJWX#W&T=22`b25p}6Ymj6 z?-2IoX*v`LNdrXrV!j67RJ6NAPx}vE>4O0E2F6qR3z~@v0qah-ULiyN;cVSEl#5=W zbXP$4G)jjbb|mx1V1@oTuRecnN#Hyp9{qsDk3}#Fw)7lhCB6T9WI*cz{WBf#E zwnhW+#cKm|{+#hwmuIhqs@Q5RV@)Ol?NI~H8Ar~>VPDF=zxv9YhoyAS!{;pyN=EY= z)I9q)aXS!%)OpECTM+InLr^a2g>-XRhM#=)hn`)0fi4ah3N31LFcNVj7_TNwjcfhy z9NbWI3C5^t_2zqR$iM^NF%tH>c*aIB$wk-^g12=y1iPCbibOgbij}?&MOrQoLpFRJ z#ua2l3+mXOSoH@x*{pvuGLrS2Px8ZMFsZl0mm&|sIUYpdPXybZIQS>Ewl)wT6Djl#pK>m_)vCp@H7fHb4oORZjMJ6K@@u(`c>&rdZ1f_%rSxO5ugLP7d54wsH?JW5OALE1v%yGcBg*3XtHjNG^RijBH`#m2pRstS55 zyJvOmZq@1BKd?XS;za+8>BtM3?=bmjpj@JDdR|_+v1`$>NN?wm?xtwX?ughN!)@iA zY`3u&UGm0?PqVi~IE0!meo#>mV(OQ*aWY5!^sPHp0>#CH1;snB1gJMeem*sQ%_L=D z*?*2V&2|L%s;qA=9p@zsN=8yo<*hC{D7Fr<*dG5;_u(qv z#D$yw*1W#=-E+q6WlfEWOMAu{zs+NZbH_R!=N$^Z>gpt`Om>Q?3EMzyu9bY76(S^E zJ)Oe;eHrlN=dmSwesz45v+3#$L&KSYmyzctz7lRo)OD78pBK|Qc{}sx+`*#VEs_ea z=T+|?@A12Jh?wny}o>VZX&7p z;?Vh1$(L1n_brJJ@96pFgL$JlZ|GG%CHvY-7B}?PzR2k)(p@42HJ7vWnzZ>jIUb@i z@5!QHvy|hSsb%%b*o=nZefs?3+NrY7vfq8Ds>NbtSSjkMHa)uHe8DA=%|fEkdFI!T znM{88B|98=_Jv@4sD3(d_|)ab!DFk+u3N;+o5OUsyglum8j?|6&^>D1s(EivVH)w^ zANRDYyRv*^t_xi`OclW-*@kwxiiT?ySCz} zw(d5sKV!q4K>Uq_TwemixqbvDb7KfJaia*_!nblF*hUN*RD2T5jYZLgR2(<9C3B2Q{5HMII5va0&v@TgB63dQ`CXhzMYTWSv1^&>9FMMUco6k&aC6 z69o~tC(=U(wJSKB?)u|$Byn{>duJ%<7QB^sJ=-RkxHZ_M6L`T|p|%r4dewF^|Ai$07pZGKjoIHknxOWFVX^2jRo=X=KvD zDczatMkGWf1p5T9-M-;+;G;)Jq#jJh5}q|vDyD4dtx^be!U=Xv;tYL~?>wI9v^y6Q za2fVFf!bm7F>F+TQL30r<{m1R5Xg54CxBSE;xd9*0@oO}JPC)h$aE$gAD}N|(o(c| zjSZU{!SCiQyogtPoM$h{m{y`KEiUyR!>$sX*>vs$s#B^M_h3pSzWXPS;N}+lE2s~z zlxvb=@t(ODU&h1o0$*7S3@Y#MkSvlOe>*NM=9a5 zS1O^WFDRpc6ooZXTieexk_JCDOD2pX6 z>(y*SHsZy!vxR&#B~Ff%0k+7bu|YwaVZ?Qe1{$SB0}c04GmA_X`$9wa_!=SP5zMcy zX!s8@`RbW%V=1|~6~c*12yU4&z5uU;Gv!&76TJ&o(10K0Zt#cPxBEj~Lo7@U$RRp<*;XmXPZWEF%bnc5Il@|HJOr#Nu}hL z5$v*W6(N%@ia9-%;-l@s@M;_hhPos=5G&EauJ!2H=i)2OT6b%r8XKewy`H zZ3Ur_PG=}wbK9`-Ahs5Zo$4OskxpU6b14~eDd=C zCUBiv5yQElz}(rMno#sGU8)BZz)SO0dtykd2CTTo)t4~G1->-I}iKW6v+ zA}`(*k!KG6Iep_<-U*u%qGe5Y9}Z;6=5D=g_Ifg3rg+=mxctz$gmw$QE}*_>D4V;d zT3+*8O|{Sc`$MlnTg-xBg#eXlztc$^hpgUBbTVIWvU>G?lY4Qg`bV84a?tSo@7!xm zMyH*7Mh#kb>BP;(mLoeioz8n$d$nfmr9$_K^)tTlb1@t%+O#aN=B`V}SNd6Ki)i3p9#t6R7b3O8XFp-%&Gl%MPGAyS?epA zk4bZML32gRnfQo@cPb{h1V<)JUDJ`+mYJoPNd;#e;wqj{e(%Qoa@e6iDq>=HyJ+v7 z+v+K)>n80lFaM%YkULniLw2y;bhUr_z1S}!+9NNvXJx+ZHNX7gzgw+?dJi(uXEHV% z(5CPn*PxE2RzeH2FLnP$hIK==%c*f?Nwu4tPA)K;`x{z(11nc~Yggny%Fj3dGb%Uz z?(fkZ0p{kg!fTqL(sh3GeFfg5erkLXGy_e0Re16Fv8{VGU#~pb`#9n9Tb@)u?uf4b z`m-KoZmVmTN9)lZ&lVqXb8NzBMel>Ls_cYSjy<~?H=j)|()D$u?W+s=xL~^Clowz8 T^fiAC2X~}B{v(kRpBDc=_v<%- delta 2853 zcmY*b2UL?;7EbbqKa>C|KnN{V0qHFPLJbhG02Tz1faqdF5k!Z@GGbeh(NXjb{G&J& z9oy(Kz}nWujs@KvaTHwFhPt*EkZrOZDA6Ct0-L>rz6(wTg;T? z6{Fy`zYtlo!Hhsao%V?m!S}f+1AQy0@126a6GUj{N@R>V*Yiqb$7&?#yMmbnzWq!R z`d+jU2<9EC-9r{hlq5v#18ceBF#zr29DujtbbutYG=MrYOsmf<6)ame4j_}o$<1sg zSohcr06z(qGe=?o>wqL0;ITvp;AW0IlX(hQ?dB<%%PpFrx#{_Pnv0s$m@A00g*B{? zw!qMfERw-GWP!#0Vu8U@Eyu!SgC)A$v_uytD~wrWl>lokR@nflB5^>!rN5fWM1DjQdK($XOZR4av#^@M}?`#ycglrrJ$KRs%in zfX%gfQlyIKWG;*?TWg6W+SvaNSc~oR0lu@J4WMht4{lN??`-3%~ z8{nVImRzDMqtpu)XU{ARu9#a9FpggZoYQh{gfwV;IQLLSD!cs~53sRaafMu?D-~gk z*baCSFP;aO=$kQ2RdLmlt#Za1SGyT7A&rsJd$~#!{w|!6Zqm>Ml(&hE}d)ns?PQ>)zZ`kZvf{{G;Ow=c;9J8zvw9KREJ0)gpR zP!`$b;U}GJfTYLn0gx7}YZEEiujwph-W^p80*St;y3Lnw z$gk*P=GhW4DNa@qO`r|w_p>G;eoo*z&JP=<-47e?z27{Toa>JbeZk*^A-gEQe(jE5 zNx#32+dh#|$#!8lX(?b+@suLEqUBaiVjS7sxI%_TW9~@-n0s>o*7bph8G(5a3l}Uw(@%YK`0au%vVI{Z1bGQ6UYNkA8vw)36SkY zKWQmo#{T7l#3Lx08&k+ASrDe-l0q=*wvasj?C5OE*rt9^AVZ-}+`pzXav4+#w+ygH zu}ez&!}Q$g8H|`ThvKWz6^eDq!%(a=40r8982?=Cq^wPY)7-EG_t}h!%nx_KXi!Cj zXN>`~YC230?6<7$h2ynPjF^dj-%`J=2}9wSRYRbXYdtD*{J-74oNkOlmHYGlS6fje zrgJnBuenXs6ck%e#ZL7Oi=b0DSvljtO(>%;L<60s`*AXA7J7Y8&8n#LpMCW5{^+n$ zi#>T)i^mkJ!xw%74|jBY2+(TtO+AR@;3bSVyPa3x7>(!kG#bmxh{1l^6N72~CkDGS zKNg#!Czj9SJS7gK-AMh|q}))i$ct^{<(BIwL(BB*`7VgVZLf>Nn>5TrUVH_(^u;d# z&?Vrrwl@JEP^(0Q@uUl%q;zB}H2k1HK$DXuVG-q#rMsf+WQoQ_qQIV&CWHlA9hINYL1 z?0fYz``7a5inRIuiv*>=Z0jl4E*-5txHs#E4bAqZ+`*-vIle7*I}uyseaOOnWc-Bq zN%Oz4IP<9_|6MJ?X12hRH*XL9}83a%CZ z{z*oMQ{XpkInmdbd--hYsqDp(_S3x2N!OJ0)I=5xpLKZ|^ZBQ(QLhVx=Ovfs z+$Hvo??a89IX4VF2Ubg4k4(N+vFsvoPT$uNEV1tF+IM)@NZ;Sw^!x2`md@O6$oD0vQllFchyua(n{v%~$emH$C-Pdv4_UA(- z<5vnZAC}dJ*lvor>pHCV8vNF2)omh0WQU*1xb+>Bh4;B@kgtZ7}PNkBVKLH{tM8!`?51%XnLp#T5? From 0400d2eff05d110a1b1bc318f0fca51445c3b23d Mon Sep 17 00:00:00 2001 From: Riddick Date: Mon, 25 May 2026 13:20:27 +0200 Subject: [PATCH 65/79] feat: introduce extensible data structure framework with granular capabilities and runtime state management **Detailed Description:** 1. **New Data Structures and Capabilities:** - Implemented `Vector` as a dynamic, index-based linear data structure for efficient positional operations with seamless random access. - Added `Snapshotable`, `Forkable`, `Freezable`, and `Copyable` interfaces to enable refined data structure operations including immutability, snapshots, structural sharing, and deep copying. 2. **Advanced Runtime State Management:** - Introduced `HasCopyOnWriteState` and `HasFreezeState` traits to enable runtime behavioral flexibility: - `HasCopyOnWriteState` facilitates lazy cloning for shared storage until mutation. - `HasFreezeState` allows locking data structures in immutable states, rejecting modifications. - Incorporated `StructureState` to manage reference counts and enforce safe ownership for copy-on-write operations. 3. **Snapshot Functionality:** - Implemented `Snapshot` base and `VectorSnapshot` for read-only, immutable projections of data structures with controlled delegation of read operations. 4. **New Exceptions:** - Added `InvalidCowStateException` and `FrozenDataStructureException` to handle errors related to copy-on-write ownership and mutation during freeze states. 5. **Type Enhancements:** - Introduced `Linear` as a logical description for sequentially organized data topologies to represent collections like vectors, stacks, and queues. 6. **Autoload Classmap Updates:** - Updated `classmap.php` for seamless integration of new data structure implementations, capabilities, and exceptions into the autoloader. **Key Benefits:** - Ensures modularity and scalability for creating consistent and reusable data structure abstractions. - Improves performance through memory-efficient structural sharing and lazy instantiation during mutations. - Enhances reliability with enforced immutability and clear runtime state tracking. - Facilitates extensible and safe interaction via snapshot capabilities and granular exception handling. --- CITATION.cff | 4 +- dist/core.min.phar | Bin 238079 -> 250590 bytes dist/core.phar | Bin 760195 -> 794942 bytes src/support/autoload/classmap.php | 16 ++ .../loader/firehub.CompiledClassmap.php | 64 +++++++ .../abstraction/firehub.Collection.php | 31 +++ .../capability/firehub.Copyable.php | 35 ++++ .../capability/firehub.Countable.php | 40 ++++ .../capability/firehub.Enumerable.php | 31 +++ .../capability/firehub.Forkable.php | 36 ++++ .../capability/firehub.Freezable.php | 35 ++++ .../capability/firehub.Snapshotable.php | 43 +++++ .../runtime/firehub.HasCopyOnWriteState.php | 84 ++++++++ .../runtime/firehub.HasFreezeState.php | 71 +++++++ .../runtime/firehub.StructureState.php | 104 ++++++++++ .../structure/firehub.Vector.php | 181 ++++++++++++++++++ .../structure/snapshot/firehub.Snapshot.php | 104 ++++++++++ .../snapshot/firehub.VectorSnapshot.php | 76 ++++++++ .../datastructure/type/firehub.Linear.php | 28 +++ .../firehub.FrozenDataStructureException.php | 31 +++ .../firehub.InvalidCowStateException.php | 31 +++ 21 files changed, 1043 insertions(+), 2 deletions(-) create mode 100644 src/support/datastructure/abstraction/firehub.Collection.php create mode 100644 src/support/datastructure/capability/firehub.Copyable.php create mode 100644 src/support/datastructure/capability/firehub.Countable.php create mode 100644 src/support/datastructure/capability/firehub.Enumerable.php create mode 100644 src/support/datastructure/capability/firehub.Forkable.php create mode 100644 src/support/datastructure/capability/firehub.Freezable.php create mode 100644 src/support/datastructure/capability/firehub.Snapshotable.php create mode 100644 src/support/datastructure/runtime/firehub.HasCopyOnWriteState.php create mode 100644 src/support/datastructure/runtime/firehub.HasFreezeState.php create mode 100644 src/support/datastructure/runtime/firehub.StructureState.php create mode 100644 src/support/datastructure/structure/firehub.Vector.php create mode 100644 src/support/datastructure/structure/snapshot/firehub.Snapshot.php create mode 100644 src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php create mode 100644 src/support/datastructure/type/firehub.Linear.php create mode 100644 src/throwable/exception/support/datastructure/firehub.FrozenDataStructureException.php create mode 100644 src/throwable/exception/support/datastructure/firehub.InvalidCowStateException.php diff --git a/CITATION.cff b/CITATION.cff index 250f3dce..5522c44b 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -4,8 +4,8 @@ title: The FireHub Project - Core Foundation abstract: The essential PHP core for clean, domain-driven architecture. type: software license: Apache-2.0 -version: v0.2.0 -date-released: 2026-03-23 +version: v0.3.1 +date-released: 2026-05-25 url: "https://the-firehub-project.github.io/core-foundation" repository-code: "https://github.com/The-FireHub-Project/Core-Foundation" diff --git a/dist/core.min.phar b/dist/core.min.phar index 0f77aea596eaa7fba1600bb799fc8621ffbd274d..6ae48f2ff5927272f56a928d7022df1d9c1a4e8f 100644 GIT binary patch delta 9070 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 diff --git a/dist/core.phar b/dist/core.phar index f1cd244080ab8540bcda0fd912ebf27d5037320c..aa7ef50453751d50ced7a7ea34316270becb468f 100644 GIT binary patch delta 18625 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 H{`CI`aj!$R delta 3367 zcmYjT2UJwo7M*!-;0?@-480BAVE`#ZQ3nR;y$dK+1;r8)0b>$_(STxKHoV3MMw%@~ zu>>Jw3wFP{z5@E!5B3;SG?74D#`u3C{`=0EZ^Bw{?RD-wXPj;x4KvDB?~xf5+qT>W`QIHaHk{>@TDXPFxDgiaE%ETdDSEyY^A9l zFv}FzH=AaF{lGLC(3is|=W(%McXAT}f8Ztnx=As9nlujVozgfc?iMXtTKeP_EzXhD zNv(*pnF1WfnI(Y3EJh^q%YAl;JT!MCUz=H2WmM0ND_=NU=$JLZj(f~-MlZ~;s6_Kr z;Ak|*W(Lh;z;>2laWiC-z;2Ue0glKpE?SO7*UGi9-YE|RyeAJ)u3rMVDh0gIe8Qf1 zc-oLqg&R0bQ6vJkC{mR>yU=?WkH2O3y|>7Kg$=2)(f~oJsYtZ?=8-Op+BzP2h`14)`E+qsuT1ZWsg)l>zJKXVm)?73#K4l@AOrRC58#T;>DzyDR`qa7DY@wF+#t z+ahS=3>`UB^4UrfTegD1ccdE-P1Wj6E8N}OTJOoVl2nXEmffwYK5gj}ufoNR1 zNHn+g{2!#;OU>^{W98f(1(w?6837)gmq-+?Ng1Y!Q}a*LS##wF&e*Derp2O85<|r> zqPFC>XVA&J32zdee4!WKie@iV|6MP9e;mi+dhuA~*Hf01UC%|NgYv&_XQawKQ;}c5 z%tbbHgv?I4CzMclpBe18XH#*HyHKUs|ztWk|m&@Xb4C`h?- z)L7_Pn25c%9u-j_5|thc$f7hpio7@>L)u7P z7A9FUZU$7^Lv88Lz3a#(AN3Z0eBJ&1G36?MywvyoQD9*KDACOU^Pq%30`MLb1>#lu zf^w~G*zuB_ouDSY0am=Ko3U5!!i<#yZY!HI-MDMX|M?Er&r_gM2aS$IF3!glYkC9>*8n!dfwtZqkPlBf{FO-+?ZGn zSr1e0Em7Zu(5yPLNT-5D;i#@ACyj>zoVxh80sN|)3P+z7j&Dqd5nqPm`s9cT*gqD5 zwxu2mtI^}|uj%pU$u$zOIx_#wc-l1youJmf4Xg!!d?RbiZKs6@Gjf}R;$A!ntG_b| zl@}g`(`}-D84ph82r4FLqEN<9qfi>z(OA=$(J1FJF}aX)D-9|cZaF}^RP)0(7#qIr zCS%13Ttd#?7@VzBEMCavM*JzZ8d@xkdmHd-96qNJ@%V7J#^YoUQXcEPk=>MD#mjFq zL7Y+RWLg3ib|zs4FnA^+u1Lh6j3>o-(W~<~%TUuG=AZ3;rz8&|aSOk9= zq%nCspM8LJQvMr@uN2U6?c;Ieata=RCUq8YZAeA?X)69WOijaoW;UhakMyN9J@`q| zb%4?7_|MTYqkRhPhSBuZqv>M9Xgc#;YdEr;d0|W3r%8E5GRyI1s~MHS?NeqTk*^Lh z;rP=JnI8UHC+os*dcbJONQ#zkxy|_SNA|JyhLK0i@^GFqjNvmhY&=FmYYhn!t3Q7iChzz5BB3 zjG_KJSyx2eiB0E&KU?!kk^mz+ByF= z*z(cg^YL9Kl3@SlIivaFeQWL4{j_ea_q}_gBVipwoYt8mb%Do&Ep125e=l|zy4h+z z^53oQ^J+BLf-S>`W4?MOzR_ChuzO$Xui*$+tiB%*%3k{rrjMY)H02 zqg(zsIxNJkVEv1Rf%f{kT_bkh{XRz*wl{Q~jnh56)i7114UaEh*`2UAC)ar{tIa(u zcK(s|`#t@;BQ}G2UGar3`RBL3)|91eoYq-izo>#M9IkA$JJi*GeQ?&@=%u=@@XKAf zIluG`{j%skO|qcALww}f?8bwE$;|ibNO!Hd)MUt)z4xzd*^afU(|L7?>$f`eE*u&f z+|l71uxk0(z$GQ$mXr)_&=+Ric^292Kh!?H;)c&?%|^d>eYvrz4_clE%_cKPDlY%r z)AYH|{$;&=-^XA5jj^7X_eF5?%_o=K3U|4j^4N9sl4pmvvOPLJ&AIRXWOaW0a@$LL pT0S|KG$(kVJM+NipjQiLIiL2DC?EeSSt+8I$%@{z __DIR__.'/../../support/bootstrap/bootloader/firehub.RegisterHelpers.php', \FireHub\Core\Support\Bootstrap\FireHubConfigurator::class => __DIR__.'/../../support/bootstrap/firehub.FireHubConfigurator.php', \FireHub\Core\Support\Contracts\DataStructure::class => __DIR__.'/../../support/contracts/firehub.DataStructure.php', + \FireHub\Core\Support\DataStructure\Abstraction\Collection::class => __DIR__.'/../../support/datastructure/abstraction/firehub.Collection.php', + \FireHub\Core\Support\DataStructure\Capability\Copyable::class => __DIR__.'/../../support/datastructure/capability/firehub.Copyable.php', + \FireHub\Core\Support\DataStructure\Capability\Countable::class => __DIR__.'/../../support/datastructure/capability/firehub.Countable.php', + \FireHub\Core\Support\DataStructure\Capability\Enumerable::class => __DIR__.'/../../support/datastructure/capability/firehub.Enumerable.php', + \FireHub\Core\Support\DataStructure\Capability\Forkable::class => __DIR__.'/../../support/datastructure/capability/firehub.Forkable.php', + \FireHub\Core\Support\DataStructure\Capability\Freezable::class => __DIR__.'/../../support/datastructure/capability/firehub.Freezable.php', + \FireHub\Core\Support\DataStructure\Capability\Snapshotable::class => __DIR__.'/../../support/datastructure/capability/firehub.Snapshotable.php', + \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::class => __DIR__.'/../../support/datastructure/runtime/firehub.HasCopyOnWriteState.php', + \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::class => __DIR__.'/../../support/datastructure/runtime/firehub.HasFreezeState.php', + \FireHub\Core\Support\DataStructure\Runtime\StructureState::class => __DIR__.'/../../support/datastructure/runtime/firehub.StructureState.php', \FireHub\Core\Support\DataStructure\Storage::class => __DIR__.'/../../support/datastructure/interface.Storage.php', \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrListStorage.php', \FireHub\Core\Support\DataStructure\Storage\ArrMapStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrMapStorage.php', @@ -113,6 +123,10 @@ \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrRangeInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php', \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\GeneratorCallbackInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php', \FireHub\Core\Support\DataStructure\Storage\Node::class => __DIR__.'/../../support/datastructure/storage/firehub.Node.php', + \FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot::class => __DIR__.'/../../support/datastructure/structure/snapshot/firehub.Snapshot.php', + \FireHub\Core\Support\DataStructure\Structure\Snapshot\VectorSnapshot::class => __DIR__.'/../../support/datastructure/structure/snapshot/firehub.VectorSnapshot.php', + \FireHub\Core\Support\DataStructure\Structure\Vector::class => __DIR__.'/../../support/datastructure/structure/firehub.Vector.php', + \FireHub\Core\Support\DataStructure\Type\Linear::class => __DIR__.'/../../support/datastructure/type/firehub.Linear.php', \FireHub\Core\Support\LowLevel::class => __DIR__.'/../../support/firehub.LowLevel.php', \FireHub\Core\Support\LowLevel\Arr::class => __DIR__.'/../../support/lowlevel/firehub.Arr.php', \FireHub\Core\Support\LowLevel\CharMB::class => __DIR__.'/../../support/lowlevel/firehub.CharMB.php', @@ -230,7 +244,9 @@ \FireHub\Core\Throwable\Exception\Support\Bootstrap\FailedToLoadBootloaderException::class => __DIR__.'/../../throwable/exception/support/bootstrap/firehub.FailedToLoadBootloaderException.php', \FireHub\Core\Throwable\Exception\Support\Bootstrap\NotBootloaderException::class => __DIR__.'/../../throwable/exception/support/bootstrap/firehub.NotBootloaderException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\EmptyDataStructureException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.EmptyDataStructureException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.FrozenDataStructureException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidBufferException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidBufferException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidCowStateException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\NodeOwnershipException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.NodeOwnershipException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\OutOfBoundsException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.OutOfBoundsException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\SizeException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.SizeException.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 947a2dc0..c4eb76bb 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -252,6 +252,46 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/contracts/firehub.DataStructure.php'; return; + case \FireHub\Core\Support\DataStructure\Abstraction\Collection::class: + require __DIR__.'/../../../support/datastructure/abstraction/firehub.Collection.php'; + return; + + case \FireHub\Core\Support\DataStructure\Capability\Copyable::class: + require __DIR__.'/../../../support/datastructure/capability/firehub.Copyable.php'; + return; + + case \FireHub\Core\Support\DataStructure\Capability\Countable::class: + require __DIR__.'/../../../support/datastructure/capability/firehub.Countable.php'; + return; + + case \FireHub\Core\Support\DataStructure\Capability\Enumerable::class: + require __DIR__.'/../../../support/datastructure/capability/firehub.Enumerable.php'; + return; + + case \FireHub\Core\Support\DataStructure\Capability\Forkable::class: + require __DIR__.'/../../../support/datastructure/capability/firehub.Forkable.php'; + return; + + case \FireHub\Core\Support\DataStructure\Capability\Freezable::class: + require __DIR__.'/../../../support/datastructure/capability/firehub.Freezable.php'; + return; + + case \FireHub\Core\Support\DataStructure\Capability\Snapshotable::class: + require __DIR__.'/../../../support/datastructure/capability/firehub.Snapshotable.php'; + return; + + case \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::class: + require __DIR__.'/../../../support/datastructure/runtime/firehub.HasCopyOnWriteState.php'; + return; + + case \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::class: + require __DIR__.'/../../../support/datastructure/runtime/firehub.HasFreezeState.php'; + return; + + case \FireHub\Core\Support\DataStructure\Runtime\StructureState::class: + require __DIR__.'/../../../support/datastructure/runtime/firehub.StructureState.php'; + return; + case \FireHub\Core\Support\DataStructure\Storage::class: require __DIR__.'/../../../support/datastructure/interface.Storage.php'; return; @@ -384,6 +424,22 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/storage/firehub.Node.php'; return; + case \FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot::class: + require __DIR__.'/../../../support/datastructure/structure/snapshot/firehub.Snapshot.php'; + return; + + case \FireHub\Core\Support\DataStructure\Structure\Snapshot\VectorSnapshot::class: + require __DIR__.'/../../../support/datastructure/structure/snapshot/firehub.VectorSnapshot.php'; + return; + + case \FireHub\Core\Support\DataStructure\Structure\Vector::class: + require __DIR__.'/../../../support/datastructure/structure/firehub.Vector.php'; + return; + + case \FireHub\Core\Support\DataStructure\Type\Linear::class: + require __DIR__.'/../../../support/datastructure/type/firehub.Linear.php'; + return; + case \FireHub\Core\Support\LowLevel::class: require __DIR__.'/../../../support/firehub.LowLevel.php'; return; @@ -852,10 +908,18 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.EmptyDataStructureException.php'; return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.FrozenDataStructureException.php'; + return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidBufferException::class: require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidBufferException.php'; return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidCowStateException.php'; + return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\NodeOwnershipException::class: require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.NodeOwnershipException.php'; return; diff --git a/src/support/datastructure/abstraction/firehub.Collection.php b/src/support/datastructure/abstraction/firehub.Collection.php new file mode 100644 index 00000000..f3657d37 --- /dev/null +++ b/src/support/datastructure/abstraction/firehub.Collection.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Abstraction; + +use FireHub\Core\Support\DataStructure\Capability\Enumerable; + +/** + * ### Collection Data Structure + * + * Represents an enumerable and structured group of elements that provides consistent storage, traversal, access, and + * optional mutation semantics. Collections serve as the foundational abstraction for linear, associative, and + * set-based data structures while maintaining a unified iteration model over their contained values. + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Capability\Enumerable + */ +interface Collection extends Enumerable {} \ No newline at end of file diff --git a/src/support/datastructure/capability/firehub.Copyable.php b/src/support/datastructure/capability/firehub.Copyable.php new file mode 100644 index 00000000..61a1a90a --- /dev/null +++ b/src/support/datastructure/capability/firehub.Copyable.php @@ -0,0 +1,35 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability; + +/** + * ### Copyable Data Structure + * + * Provides a full deep copy of the data structure with no shared state.
+ * Unlike fork, this operation guarantees full isolation. + * @since 1.0.0 + */ +interface Copyable { + + /** + * ### Create deep independent copy + * + * Returns a completely isolated instance with duplicated internal state. + * @since 1.0.0 + * + * @return static Deep independent copy. + */ + public function copy ():static; + +} \ No newline at end of file diff --git a/src/support/datastructure/capability/firehub.Countable.php b/src/support/datastructure/capability/firehub.Countable.php new file mode 100644 index 00000000..e8a1d2d0 --- /dev/null +++ b/src/support/datastructure/capability/firehub.Countable.php @@ -0,0 +1,40 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability; + +/** + * ### Enumerable Data Structure Capability + * + * Defines a contract for data structures that maintain a measurable logical element count. This capability ensures + * that a structure can expose the number of contained elements in a consistent, domain-specific manner, independent of + * its underlying storage implementation. It applies only to materialized data structures where element cardinality + * is well-defined, enabling predictable size semantics across data structures. + * @since 1.0.0 + */ +interface Countable { + + /** + * ### Element Count Retrieval + * + * Returns the total number of logically stored elements within the data structure. This value represents the + * current cardinality of the structure in its abstract form and is independent of the underlying storage + * implementation or memory layout. It is defined only for materialized data structures where element count is + * well-defined and stable. + * @since 1.0.0 + * + * @return non-negative-int Total number of logically stored elements in the structure. + */ + public function count ():int; + +} \ No newline at end of file diff --git a/src/support/datastructure/capability/firehub.Enumerable.php b/src/support/datastructure/capability/firehub.Enumerable.php new file mode 100644 index 00000000..bc29182e --- /dev/null +++ b/src/support/datastructure/capability/firehub.Enumerable.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability; + +use FireHub\Core\Shared\Contracts\IteratorAggregate; + +/** + * ### Enumerable Data Structure Capability + * + * Represents a data structure that exposes a unified iteration contract, enabling traversal of its elements in a + * sequential manner via an external or internal iterator. This capability does not define storage behavior or mutation + * rules but provides a consistent way to traverse underlying elements regardless of the structure type. + * @since 1.0.0 + * + * @template TKey + * @template TValue + * + * @extends \FireHub\Core\Shared\Contracts\IteratorAggregate + */ +interface Enumerable extends IteratorAggregate {} \ No newline at end of file diff --git a/src/support/datastructure/capability/firehub.Forkable.php b/src/support/datastructure/capability/firehub.Forkable.php new file mode 100644 index 00000000..90413ee8 --- /dev/null +++ b/src/support/datastructure/capability/firehub.Forkable.php @@ -0,0 +1,36 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability; + +/** + * ### Forkable Data Structure + * + * Provides a lightweight branching mechanism where the structure shares underlying state until a write operation + * forces a copy-on-write detach.
+ * This enables efficient snapshot-like workflows with minimal memory overhead. + * @since 1.0.0 + */ +interface Forkable { + + /** + * ### Create a shared state fork + * + * Creates a new instance that shares underlying storage/state with the current instance until a mutation occurs. + * @since 1.0.0 + * + * @return static Shared state fork. + */ + public function fork ():static; + +} \ No newline at end of file diff --git a/src/support/datastructure/capability/firehub.Freezable.php b/src/support/datastructure/capability/firehub.Freezable.php new file mode 100644 index 00000000..70bf7a83 --- /dev/null +++ b/src/support/datastructure/capability/firehub.Freezable.php @@ -0,0 +1,35 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability; + +/** + * ### Freezable Data Structure + * + * Allows a data structure to be permanently or temporarily locked from any mutation operations.
+ * Once frozen, all write operations must be rejected. + * @since 1.0.0 + */ +interface Freezable { + + /** + * ### Freeze structure (make immutable) + * + * Prevents any further modifications to the structure state. + * @since 1.0.0 + * + * @return void + */ + public function freeze ():void; + +} \ No newline at end of file diff --git a/src/support/datastructure/capability/firehub.Snapshotable.php b/src/support/datastructure/capability/firehub.Snapshotable.php new file mode 100644 index 00000000..69d5bfaf --- /dev/null +++ b/src/support/datastructure/capability/firehub.Snapshotable.php @@ -0,0 +1,43 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability; + +use FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot; + +/** + * ### Snapshotable Data Structure + * + * Provides a read-only view of the current state of a data structure.
+ * Snapshot is typically optimized for zero-copy or shared-storage access. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +interface Snapshotable { + + /** + * ### Create an immutable snapshot of the current state + * + * Returns a read-only representation of the structure at a point in time. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot As return. + * + * @return \FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot Immutable snapshot of + * current state. + */ + public function snapshot ():Snapshot; + +} \ No newline at end of file diff --git a/src/support/datastructure/runtime/firehub.HasCopyOnWriteState.php b/src/support/datastructure/runtime/firehub.HasCopyOnWriteState.php new file mode 100644 index 00000000..2eee5033 --- /dev/null +++ b/src/support/datastructure/runtime/firehub.HasCopyOnWriteState.php @@ -0,0 +1,84 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.4 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Runtime; + +/** + * ### Copy-On-Write State Management + * + * Provides structural sharing and lazy cloning behavior for data structures. This trait enables multiple instances + * to share the same underlying storage until a mutation forces a safe deep copy (detach). + * + * It is responsible only for ownership tracking and memory sharing logic, not for mutation rules or immutability + * enforcement. + * @since 1.0.0 + */ +trait HasCopyOnWriteState { + + /** + * ### Data Structure Structural State + * @since 1.0.0 + * + * @var \FireHub\Core\Support\DataStructure\Runtime\StructureState + */ + private StructureState $state; + + /** + * ### Conditional Storage Detachment + * + * Performs a copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * This ensures mutation safety by creating an isolated storage copy before any write operation is performed. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Runtime\StructureState::isExclusive() To check if the storage is + * exclusive (not shared). + * @uses \FireHub\Core\Support\DataStructure\Runtime\StructureState::decreaseRefs() To decrease Reference Counter. + * @uses \FireHub\Core\Support\DataStructure\Capability\Copyable::copy() To create a full independent deep copy + * of the storage if needed. + * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * + * @return void + */ + private function detachIfNeeded ():void { + + if ($this->state->isExclusive()) return; + + $this->storage = $this->storage->copy(); + + $this->state->decreaseRefs(); + + $this->state = new StructureState(); + + } + + /** + * ### Increase Shared Ownership Reference + * + * Increments the internal reference counter when a new data structure instance begins sharing the same storage + * (e.g., fork operation). + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Runtime\StructureState::increaseRefs() To increase Reference Counter. + * + * @return void + */ + private function increaseRef ():void { + + $this->state->increaseRefs(); + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/runtime/firehub.HasFreezeState.php b/src/support/datastructure/runtime/firehub.HasFreezeState.php new file mode 100644 index 00000000..1d789d73 --- /dev/null +++ b/src/support/datastructure/runtime/firehub.HasFreezeState.php @@ -0,0 +1,71 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.4 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Runtime; + +use FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException; + +/** + * ### Mutation Freeze Control + * + * Provides the ability to lock a data structure into an immutable state. Once frozen, all mutation operations must + * be rejected. + * + * This trait is responsible only for mutation safety enforcement and does not manage memory sharing or storage + * duplication. + * @since 1.0.0 + */ +trait HasFreezeState { + + /** + * ### Frozen State Flag + * + * Indicates whether the data structure is immutable. When true, all mutation attempts must throw an exception. + * @since 1.0.0 + * + * @var bool True if structure is frozen, false otherwise. + */ + private bool $frozen = false; + + /** + * ### Check Frozen State + * + * Returns whether the data structure is currently immutable. + * @since 1.0.0 + * + * @return bool True if frozen, false otherwise. + */ + public function isFrozen ():bool { + + return $this->frozen; + + } + + /** + * ### Mutation Guard: Freeze Check + * + * Ensures that the data structure is not in a frozen state before allowing any mutation operation to proceed. + * @since 1.0.0 + * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure + * is frozen. + * + * @return void + */ + private function assertNotFrozen ():void { + + if ($this->frozen) throw new FrozenDataStructureException; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/runtime/firehub.StructureState.php b/src/support/datastructure/runtime/firehub.StructureState.php new file mode 100644 index 00000000..5d83ec7f --- /dev/null +++ b/src/support/datastructure/runtime/firehub.StructureState.php @@ -0,0 +1,104 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.4 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Runtime; + +use FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException; + +/** + * ### Data Structure Structural State + * + * Represents shared runtime state between multiple instances of a data structure.
+ * This includes ownership tracking (COW), versioning metadata, and shared lifecycle control. + * @since 1.0.0 + */ +final class StructureState { + + /** + * ### Shared Ownership Counter + * + * Tracks how many data structure instances share the same underlying storage.
+ * Used to determine when a safe detaching (copy-on-write) is required. + * @since 1.0.0 + * + * @var positive-int Number of active references to shared storage. + */ + private int $refs = 1; + + /** + * ### Retrieve Reference Counter value + * @since 1.0.0 + * + * @return positive-int Reference counter value. + */ + public function getRefs ():int { + + return $this->refs; + + } + + /** + * ### Increase Reference Counter + * @since 1.0.0 + * + * @return void + */ + public function increaseRefs ():void { + + $this->refs++; + + } + + /** + * ### Decrease Reference Counter + * @since 1.0.0 + * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * + * @return void + */ + public function decreaseRefs ():void { + + if ($this->refs <= 1) + throw new InvalidCowStateException('Invalid COW state: cannot drop below 1.'); + + $this->refs--; + + } + + /** + * ### Check if Reference Counter is shared + * @since 1.0.0 + * + * @return bool True if Reference Counter is shared, false otherwise. + */ + public function isShared(): bool { + + return $this->refs > 1; + + } + + /** + * ### Check if Reference Counter is exclusive + * @since 1.0.0 + * + * @return bool True if Reference Counter is exclusive, false otherwise. + */ + public function isExclusive(): bool { + + return $this->refs === 1; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/structure/firehub.Vector.php b/src/support/datastructure/structure/firehub.Vector.php new file mode 100644 index 00000000..59e29289 --- /dev/null +++ b/src/support/datastructure/structure/firehub.Vector.php @@ -0,0 +1,181 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Structure; + +use FireHub\Core\Support\Contracts\DataStructure; +use FireHub\Core\Support\DataStructure\Structure\Snapshot\VectorSnapshot; +use FireHub\Core\Support\DataStructure\Abstraction\Collection; +use FireHub\Core\Support\DataStructure\Type\Linear; +use FireHub\Core\Support\DataStructure\Capability\ { + Copyable, Countable, Forkable, Freezable, Snapshotable +}; +use FireHub\Core\Support\DataStructure\Runtime\ { + HasCopyOnWriteState, HasFreezeState, StructureState +}; +use FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Support\DataStructure\Storage\Capability\ { + Cloneable, StorageMetricsAware +}; +use Traversable; + +/** + * ### Vector — Indexed Linear Data Structure + * + * A dynamic, index-based linear data structure that provides constant-time random access and efficient positional + * operations. Vector is designed for scenarios where elements are stored in a contiguous logical sequence and accessed + * via integer indices. It supports operations such as retrieval, update, insertion, and removal by index, while + * abstracting the underlying storage implementation (array-based, fixed-capacity, or optimized storage backends). + * Vector prioritizes fast access and predictable indexing behavior, making it suitable for computation-heavy and + * lookup-oriented use cases. + * @since 1.0.0 + * + * @template TValue + * + * @implements \FireHub\Core\Support\Contracts\DataStructure + * @implements \FireHub\Core\Support\DataStructure\Abstraction\Collection + * @implements \FireHub\Core\Support\DataStructure\Type\Linear + * @implements \FireHub\Core\Support\DataStructure\Capability\Snapshotable + */ +final class Vector implements DataStructure, Collection, Linear, Copyable, Forkable, Snapshotable, Freezable, + Countable { + + /** + * ### Copy-On-Write State Management + * @since 1.0.0 + */ + use HasCopyOnWriteState; + + /** + * ### Mutation Freeze Control + * @since 1.0.0 + */ + use HasFreezeState; + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage As parameter. + * + * @param Storage&Cloneable&StorageMetricsAware $storage

+ * The storage backend for the data structure. + *

+ * + * @return void + */ + public function __construct ( + protected Storage&Cloneable&StorageMetricsAware $storage + ) { + + $this->state = new StructureState(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function copy ():static { + + $copy = new self($this->storage->copy()); + + $copy->frozen = $this->frozen; + + return $copy; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::increaseRef() To increse shared + * ownership reference. + */ + public function fork ():static { + + $this->increaseRef(); + + return clone $this; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @return \FireHub\Core\Support\DataStructure\Structure\Snapshot\VectorSnapshot Immutable snapshot of + * current state. + */ + public function snapshot ():VectorSnapshot { + + $copy = new self($this->storage->copy()); + + $copy->frozen = true; + + return new VectorSnapshot($copy); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::detachIfNeeded() To performe a + * copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + */ + public function freeze ():void { + + $this->detachIfNeeded(); + + $this->frozen = true; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\StorageMetricsAware::size() To retrieve the number + * of elements in the storage. + */ + public function count ():int { + + return $this->storage->size(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage::iterate() To retrieve an iterable of the elements in the + * storage. + */ + public function getIterator ():Traversable { + + yield from $this->storage->iterate(); + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/structure/snapshot/firehub.Snapshot.php b/src/support/datastructure/structure/snapshot/firehub.Snapshot.php new file mode 100644 index 00000000..de153801 --- /dev/null +++ b/src/support/datastructure/structure/snapshot/firehub.Snapshot.php @@ -0,0 +1,104 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Structure\Snapshot; + +use FireHub\Core\Support\Contracts\DataStructure; +use FireHub\Core\Support\LowLevel\Arr; +use LogicException; + +/** + * ### Abstract Snapshot — Read-Only Data Structure Projection Base + * + * Provides a base implementation for creating immutable, read-only projections of data structures. It acts as a + * controlled delegation layer over an underlying data structure instance, exposing only permitted read operations + * while blocking all mutation capabilities. Designed to standardize snapshot behavior across all FireHub data + * structures, ensuring consistent immutability semantics and controlled API exposure. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +abstract readonly class Snapshot { + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\Contracts\DataStructure As parameter. + * + * @param \FireHub\Core\Support\Contracts\DataStructure $data_structure

+ * The data structure to be encapsulated by the snapshot. + *

+ * + * @return void + */ + public function __construct( + protected DataStructure $data_structure + ) {} + + /** + * ### List of allowed snapshot methods + * @since 1.0.0 + * + * @return list + */ + abstract protected function allowedMethods ():array; + + /** + * ### List of method aliases + * @since 1.0.0 + * + * @return array + */ + protected function methodAliases ():array { + + return []; + + } + + /** + * ### Invoking inaccessible methods on snapshot + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::inArray() To check if method is allowed. + * @uses \FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot::methodAliases() To get method alias if + * exists. + * @uses \FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot::allowedMethods() To check if method name + * in allowed list. + * + * @param string $name

+ * Method name. + *

+ * @param array $arguments>

+ * Method arguments. + *

+ * + * @throws \LogicException If method is not allowed. + * + * @return mixed Method return value. + */ + final public function __call (string $name, array $arguments):mixed { + + $method = $this->methodAliases()[$name] ?? $name; + + if (!Arr::inArray($this->allowedMethods(), $method)) + throw new LogicException( + "Method $name is not allowed on snapshot." + ); + + return $this->data_structure->$method(...$arguments); // @phpstan-ignore method.dynamicName + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php b/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php new file mode 100644 index 00000000..c010781c --- /dev/null +++ b/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php @@ -0,0 +1,76 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Structure\Snapshot; + +use FireHub\Core\Support\DataStructure\Structure\Vector; +use Traversable; + +/** + * ### Vector Snapshot + * @since 1.0.0 + * + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot + * + * @method int count() Element Count Retrieval + * @method Traversable iterate() Retrieve an external iterator + */ +final readonly class VectorSnapshot extends Snapshot { + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Structure\Vector As parameter. + * + * @param \FireHub\Core\Support\DataStructure\Structure\Vector $data_structure

+ * The vector to be encapsulated by the snapshot. + *

+ * + * @return void + */ + public function __construct( + Vector $data_structure + ) { + + parent::__construct($data_structure); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + protected function allowedMethods ():array { + + return ['count', 'getIterator']; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + protected function methodAliases ():array { + + return [ + 'iterate' => 'getIterator' + ]; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/type/firehub.Linear.php b/src/support/datastructure/type/firehub.Linear.php new file mode 100644 index 00000000..3b81ce00 --- /dev/null +++ b/src/support/datastructure/type/firehub.Linear.php @@ -0,0 +1,28 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Type; + +/** + * ### Linear Data Structure Type + * + * Represents a data topology where elements are organized in a sequential, ordered manner, forming a single logical + * line of accessibility. Linear type structures define adjacency-based relationships between elements (previous/next) + * and serve as the foundation for sequential data models such as stacks, queues, deque, and vectors, independent of + * heir storage or abstraction layer. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +interface Linear {} \ No newline at end of file diff --git a/src/throwable/exception/support/datastructure/firehub.FrozenDataStructureException.php b/src/throwable/exception/support/datastructure/firehub.FrozenDataStructureException.php new file mode 100644 index 00000000..fc4f9f6b --- /dev/null +++ b/src/throwable/exception/support/datastructure/firehub.FrozenDataStructureException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### Data Structure is frozen + * @since 1.0.0 + */ +class FrozenDataStructureException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'Data Structure is frozen.'; + +} \ No newline at end of file diff --git a/src/throwable/exception/support/datastructure/firehub.InvalidCowStateException.php b/src/throwable/exception/support/datastructure/firehub.InvalidCowStateException.php new file mode 100644 index 00000000..c8c6facc --- /dev/null +++ b/src/throwable/exception/support/datastructure/firehub.InvalidCowStateException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### Invalid COW state exception + * @since 1.0.0 + */ +class InvalidCowStateException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'Invalid COW state.'; + +} \ No newline at end of file From dd2dfb9cbb6d6e969a0e22e253a1ec0c3fa4e2f2 Mon Sep 17 00:00:00 2001 From: Riddick Date: Mon, 25 May 2026 13:23:02 +0200 Subject: [PATCH 66/79] chore: update changelog to include release notes for v0.3.1 **Detailed Description:** - Added release notes for version v0.3.1 to `CHANGELOG.md`. - Highlights the introduction of an extensible data structure framework with granular capabilities and runtime state management. - References linked issue, pull request, and specific commit for further context. **Key Benefits:** - Keeps the changelog up-to-date for better transparency and project documentation. - Provides a clear summary of changes and their implications for users and contributors. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22ad681c..a9da8d64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [v0.3.1](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.3.0...v0.3.1) – 2026-05-25 + +### Added +- introduce extensible data structure framework with granular capabilities and runtime state management (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`0400d2e`](https://github.com/The-FireHub-Project/Core-Foundation/commit/0400d2e)) + ## [v0.3.0](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.2.0...v0.3.0) – 2026-05-19 ### Added From 1117c8b251da8b2d4d8242664d9b210c30692017 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 26 May 2026 09:48:25 +0200 Subject: [PATCH 67/79] introduce Data Transfer Object and Rehydratable capabilities for structured data management --- dist/core.min.phar | Bin 250590 -> 254585 bytes dist/core.phar | Bin 794942 -> 805462 bytes .../contracts/firehub.DataTransferObject.php | 33 ++++++++ src/support/autoload/classmap.php | 5 ++ .../loader/firehub.CompiledClassmap.php | 20 +++++ .../capability/firehub.Rehydratable.php | 73 ++++++++++++++++++ .../dto/firehub.DehydratedState.php | 57 ++++++++++++++ .../datastructure/dto/firehub.StateHeader.php | 53 +++++++++++++ .../structure/firehub.Vector.php | 61 +++++++++++++-- .../structure/snapshot/firehub.Snapshot.php | 6 +- .../snapshot/firehub.VectorSnapshot.php | 6 +- .../firehub.InvalidDataStructureException.php | 31 ++++++++ 12 files changed, 334 insertions(+), 11 deletions(-) create mode 100644 src/shared/contracts/firehub.DataTransferObject.php create mode 100644 src/support/datastructure/capability/firehub.Rehydratable.php create mode 100644 src/support/datastructure/dto/firehub.DehydratedState.php create mode 100644 src/support/datastructure/dto/firehub.StateHeader.php create mode 100644 src/throwable/exception/support/datastructure/firehub.InvalidDataStructureException.php diff --git a/dist/core.min.phar b/dist/core.min.phar index 6ae48f2ff5927272f56a928d7022df1d9c1a4e8f..9d60c712684543cd9e42113148fdf17d955f485a 100644 GIT binary patch delta 5192 zcma)9c|cUv8lQ6q7&e_@SY+q249w`T2?8<xS)ulI53wj)|o*xA0p+JiHO%c zV(zKArI;yJ>eF&TEe$hEbI%o1M9Zwy-dTnv>-C<0_~Se0TYuko&OLKwqxjb&;>8)J z+EjtyL1WfP5Zt)cU-&Z3zVV_G18)K31Ve#>;1m!=a1DqgcnQQ1bY~K*k$&-q0)fD_ zuD+9RG_~a)2&Md)jy{qDXc2E>becI~EI-A>jh6_`1LHIXO@>ZWrqAbe>AA&Ro*|&3 zu%gJQj*(wF)^9IBf1rOdK8SIJALxL!C>|~0^xBz364nRF$zF<19+QQdEFJt?}6YW)fk|ZaWQEiM3$6J5kC-+gpN}Qb z*Y_PmDjbZOwDZW#U|!>5w?rID_QJ(9-x=a$BDacZJz@!MaGr$b|B)n}?3>w)B$#DG z*SFfx_2)LxiqTx*bgd4}UTz782hN>xSBz2ExO86Ezzya-B~Gw;5wL~Z76Xao3azdf zqj+le1HMG!6`?hh2j&;)xWcO3fHL{YX{IrQ-;8N=MO|KuVRB6`6=JFTTRomuxoKP9*q? z?F6E<8l|0bvo4um=d9*e*x8cJX1h#+miChf7TZ&!R{Lxs`#DS`#_N#r+u!ceFR@ee zryT6a+Ag%Fy4=43JA^7*AQnADE4csB{iv6f{W6K>Q?&lUeC78fbd)0vJ=!ssglKUb zPf+T_5q#Z=rgG6~GLcoz69_JM&La4evxeY!7ux#mF0|EuxX|M})|DQ^HLe*%@2P76 z!6|N~1ix~tBpByT<&WIUh%ED{Cb-5UQ6jdWZNoU@r7)IXC-s6U+kp!#@dVbA(`Z6* zS2517{_1xa3Xmawi|UKEa3j7nlhI_dIN@`E_10$5f4> z5Rc_5DGh;fMtf>G30|T=!9OvfI~Z%SFKy;oUm0I3Gqu8I_h@GPC>dp=QAY3Mo2Vw6 zvrE&Anfee)`uVCzfiF>vQ!$^_Ay0C6Z2&M6IeXF)cwc%GU+@hk7JdBah!p$L(K+cy zM`@s(j>ud&o$_mPI@K|XDa3BQg4+F|pmsU^=_r2EpB|Y2QYn(;;5$Uq~|e-JhP6 ztN?n>o*-ZH-Mhm0!(lQQ7zJ$LN)>RFJfIv!ix9AQZ5Jb6X44Oi!!DqE_nQa`ZIf5S)Y){fm4W>kG z4IWRFu(3zTc?rrRf?pJD#-|LVcfx(N;R9+EB+kmVUU3c%q>MO*P_Czi^tf8sUvQVi zvkRs1l%eBDoa@Nl@%PRiLshBZzvF?u2$PMkm|LOQL<18h?KroWX!J=0_7bB;F~-Pa zGp}REa9bj<5n*rG_QfFDgsd<+4*S9=`8avIqQs{tc@?~W5lFg8stl)h(b;fKchryD z+)Gi^2pEupI)rWUm4I>5=EL!XfNPg~5zrYyFYV;P^j=zL#Ak!)`lv`P;d);rm2Ffs zy9yQM{!118l(|PyERV_{xm-gLXU%MXpA6}$C^59kKs?>1`S2cUI?}JJX$9Y_>A($+ zrVQgwHcJ<|;^E~FMbqj1F`CXqdJIizZw#H{zC%WnkoXIjaCe3!DpCfUvw$5;e*mQ2 zF%J%*{5r?dWB7&<+hfZ~h1o-2BY1Ksy@4Z#(HnjBFv>3OT&tvc5pwSeC;tQjMMie{ zNpUo>LvcC8gI7Go+41ySaxb1H8kmrJij&(6kSrH-STZhvI`6cC%VD(8<{xOMuaKhzNo)Bk23F&M5Dv^6r--X7}S4Yb@>l`aWi7@Rg-Q_-mYa_uRZ` z3$1%=yb}oIP+SS5(%!4|UA?5kclXPV1Sj*Zw-5j55etVn0(<=uXAYEouub<{26noD5c}RHJzKLpfIsY547^$% zSb)trqNK8^nvx?=pX!FY=73;0(g37?UhbF! z6#S#d68>d}81CE+++k2PaBM+8AU3**j66Wr0Q$pOON=~pF9+!mmt8#ALZty&cWdF- zVBD+RG&h16hu($ua07QN0qR$Hsap%8{tGW)6Nqd9ri-3%bB&>f9 zQd$r%@s7TKZWCcx#TJzrI9F58dzoOEL60Vdh zGw9jB4lJxpVca8FIa^VcTT+zAc8?9GV|@zAD_PmKr_t#&(^;Pi&GeFTjh0ogGhnbA zGfMdXWTois_GVbAW!zD$h`*|2ObPWzl;9}WaKc&g$bt9(KwEA zf(O!>!XD2aBbkNHzHwY-6_;9tT8Z-ZO)ArJ(_-`TIK94Q+eoGZ)N21>Ku}6P=!{lz zdREO&oTOs&%XOS4uaK4d7z&H@tVVC#S9Ix3oP;!~jf&NAh>rK-Q6Wh0(^g22vQCk1a zlF~Oe-+S76`tjq{nevY|XOG_Z?TS68(^fpIJhS1;dut`jR%O+kIT3R6k<*R#!7Gj) z_~yK2e#XYr!9OI|Rh-)Ju|$0Ym~P@s=4to87;Un;nQ^{3_{F(=kJ`Ph8Rn6n96wiH zdr>&NI_GTD&KpUGFA6p?C+=MT@I+4W^E2nKu8P+Fl585BbE;;=(L>HlDq|{L6`7^p z!*6}?dF}YN31{ZE2)Ae&eDX`p*P458zcJ2!_Lf!$VApoH--4Xc?dxt28g{8__K5Zy z$Ftn_ubwdQNrj-qgW2wB-4^S1N%-T(Ki%Is?Quix1*-!;=T6qozh7e&URQl+cff)n zVGkrJ4*oaCO-wzSrh0ZNQZ3yxCo}ETZ_N(AM>|UvYU6(9u7?`Ldxkdn#+c?_)mJlT zB)UPT%xBha2)I)H{$)XV`S7M?$#+^qzsMQmK2>owrSAT_wwYB~R&m9nCy%#2e*ItJ z>Dy;5_bGkuR6BcWvfZ2`tykVVCTiQF_-%4*)0)#o=i#RpREpbgF6?`@EG0Zq6w!b9 z^!f8t~^|G;ivj~@#atCqQhraTW6PX?zN%u1z$7;H@z7*Uh>P=4B+d5T@1sNcin-8-`{-}{5_x97~vZ_1gO%jYify*=XE2|DTwf#B)p zsbeVL&HKEy+PzIS-yX#S(Wl%211S%{d@2%fClwCZPsIS*(#e3c=@=1br|1+21QwOq z6Ui4k2n0b|DS%2XR6M6O7S7h%NH9%14$ix@QvqLUj|WW9LH%!Z65)JZ2lYqlCcrsI zHv+Ix7w_-r%HixOM1PBfkq}TIB@i?(bGc0B8CsCvhposPp*ARf6ovr$=>-ES^pLPk zFCNY>_2PkG7f0}Q^~u9PAl8?P7c7{!KvrH{zLpd4rCO|y5q9dw@`iN=(O@5EfC1GS zq`|r00M(ofL5<8Z#KiX*MuB|LFbgn3gm%>;jIT@N3-=#IGC+4De`dB4Tq}5dC_ZtE zJajZ6l}2`;&}@_h_|zzkSw>Ki$8E3t6G@ygzGIc~L{RE8#&XNV_$;f$7*)489pq95 zqt0ef-p*i@e=(y$K2|aYaJK~SKS=OCWkfW4zn)^4dt5{CjlrXMaqdgfAjLZ0l1>6k zACs|A=M7vr=g%*nOm%HN?petRHm;qKMtYMd6`oky?uxVDZ6X z3g8&aBEX}T7?ruzG&nD{$_Bh;g&zE^3*cODjnyBt#%f2|;HwcEZ1%f06F@J}b~a#> zZ7HC!-F(1Rc6fegR|e;q_7#A4?Nb;JU3?%O18@FNNA61<$w3Dzw#kJOF@0R^`RC(t zMb5KJL~Q2F9`B&Mm}i)qg2(AEjvps49I%l`IpX9OYH+(_7&z;5#EC4>5(v&&bUosl z*28psJU>d>8ZSI{HN3CoM6Rrl2c^&K6r+D0TLLD`Bl#{a>>V{1*(;3=j|OU;LDIrW z@;xc-dhU;j(?dHRwJg8g%`t-1K-i}P5;D#?4qh!vBoNd;&yYni*&xH63UeZ=_dv;|vUN@-?SZ&J*7hGxFNcm^90b$Y0);plmI}wp}2@_P#7D zhWjud93<8!2hxAfk+^rLf=RPa2-_1wnK3WXt%Ao*6PA>6l3-SOjWQR$LJ3j%VjdDd z%%j8)^X&1<2Tp!Ci|eI{d_E-KAHQxJ{jms7{ilEuAH7|`Erz3aVPg|13sN0m0wJ~p zAnkAf=J}Y@ypU3LlBnFdzPioL179$HQh3aA9#}=*`iHWk?r=5ZSvd)j1mVV01Wf{O z54rnazrWVabC5&9maP0Pw|_opczCSsXt_q3Ln7FQbjpO`%ffr$am4Ez|J2y|02!|y z-d*_+@?%0UzlablG#i53jxS$KuVY|d>+9eJjU`jkr<>gB;?ta zgpvH2gkzVVjQC43epuX6@N=$AQ2^hI6yzC`is#N$^y8I=agemxP~>5*A{G1ICliT> z8QGa4VVg@RQ}#_6Whpe~lI4qaBYh@NhG$^e8#C}5qa_c9`$%~p;6gd>HkCXSLy+Tc zlV#$0P9~f?_Ghj!BX?(sI(8S8f5Y0_(0UzP-$h%n3K6xAJ>*0S)!N3?nd$0HWz=;& zkgJC)s7E%uf|QkSp_2K3ED}ML(ZM0CBAaezV?AggJ3WU^XI+zNDSIV?)?@vOxL=vMbTNA-m;PEk zGmm~vsiO<%c1owPU{S$z^@|yF)&G8%6w)%yZ+2@D?Sv}pI*Vv^XOY$nh1&C~R)Sc$ zzsEbV*xus#p5rZxZGG3y^AeVi*dCIdmt{RHUbwflaP#f-LYJCHW2rI5svl|N z<(EWBUZT_sN1D6_OR8P}xM|aDzpGAK?N_agRmvKxW!Ewu_Z60Q-^zYx9i4VeeWztg z!&h#ftiF2dQ1kgq&$68*&1^_z^{+plvfrv~Z~S~>rJ(nc`KJe?mspI>i5y&9k=*9r zQK#F`8@ec->^g5Etus06tG{}GJ^SO5oij-yYkF~&eEsfK@(BG$Zwy*nFa0)fWS^>5 zAnI&$pR6;(Y1Zw2?=rs+|IkT2(e$S6z3Y|GaZabQ?|%C3iF;7iQ{nPk{x7Ea$KIe@ zV{5~dK}i#FY zEhmw+9yfOg^mp8gZ&>KIF#~s2cOLrvdRNO2 z%Pt);H$LnTwz1c>;i%8;);W<0Es^h5+}JaQ>5KDMo?Q|bxG`@q(=5+5ATq(mnK^S= zugZR4?nCD4!1=y}Stm*b28CDpLyxWLJurXoXI=UArM**EOONmUY0-`T;I!^RWnj?i zbzdqsG+CPZoDb_%{B$FH`S8%@#tZLPOe%@iX)T#FH+tW{w|rcX)0ChJ-?z=yJYQu$ em|j+>_xxDRa>n_{?(YTMzbM=nU62x=8UJ4s`Jn~? diff --git a/dist/core.phar b/dist/core.phar index aa7ef50453751d50ced7a7ea34316270becb468f..e87bbf31d2f0b83779b479c494134c1bfc04c78c 100644 GIT binary patch delta 8828 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 WDhp2gb$h@E@?iL%95ofAEB*!DHy>R9 delta 3586 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 A6#xJL diff --git a/src/shared/contracts/firehub.DataTransferObject.php b/src/shared/contracts/firehub.DataTransferObject.php new file mode 100644 index 00000000..72e3e36c --- /dev/null +++ b/src/shared/contracts/firehub.DataTransferObject.php @@ -0,0 +1,33 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Shared + */ + +namespace FireHub\Core\Shared\Contracts; + +/** + * ### Data Transfer Object Contract + * + * Defines a strict boundary object used for transferring structured state between data structures, hydration + * pipelines, codecs, and persistence layers. + * + * A DataTransferObject is an immutable representation of a canonical state snapshot. It contains no business logic and + * must not depend on storage, runtime memory layout, or execution context. + * + * It serves as the bridge between: + * - DataStructure (domain logic) + * - Dehydrated state (canonical representation) + * - Codec layer (serialization/encoding) + * - Persistence layer (storage systems) + * + * @since 1.0.0 + */ +interface DataTransferObject {} \ No newline at end of file diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index bee9c6ea..87d314f3 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -32,6 +32,7 @@ \FireHub\Core\Shared\Contracts\ArrayConvertable::class => __DIR__.'/../../shared/contracts/firehub.ArrayConvertable.php', \FireHub\Core\Shared\Contracts\Arrayable::class => __DIR__.'/../../shared/contracts/firehub.Arrayable.php', \FireHub\Core\Shared\Contracts\Countable::class => __DIR__.'/../../shared/contracts/firehub.Countable.php', + \FireHub\Core\Shared\Contracts\DataTransferObject::class => __DIR__.'/../../shared/contracts/firehub.DataTransferObject.php', \FireHub\Core\Shared\Contracts\Iterator::class => __DIR__.'/../../shared/contracts/firehub.Iterator.php', \FireHub\Core\Shared\Contracts\IteratorAggregate::class => __DIR__.'/../../shared/contracts/firehub.IteratorAggregate.php', \FireHub\Core\Shared\Contracts\JsonSerializable::class => __DIR__.'/../../shared/contracts/firehub.JsonSerializable.php', @@ -86,7 +87,10 @@ \FireHub\Core\Support\DataStructure\Capability\Enumerable::class => __DIR__.'/../../support/datastructure/capability/firehub.Enumerable.php', \FireHub\Core\Support\DataStructure\Capability\Forkable::class => __DIR__.'/../../support/datastructure/capability/firehub.Forkable.php', \FireHub\Core\Support\DataStructure\Capability\Freezable::class => __DIR__.'/../../support/datastructure/capability/firehub.Freezable.php', + \FireHub\Core\Support\DataStructure\Capability\Rehydratable::class => __DIR__.'/../../support/datastructure/capability/firehub.Rehydratable.php', \FireHub\Core\Support\DataStructure\Capability\Snapshotable::class => __DIR__.'/../../support/datastructure/capability/firehub.Snapshotable.php', + \FireHub\Core\Support\DataStructure\DTO\DehydratedState::class => __DIR__.'/../../support/datastructure/dto/firehub.DehydratedState.php', + \FireHub\Core\Support\DataStructure\DTO\StateHeader::class => __DIR__.'/../../support/datastructure/dto/firehub.StateHeader.php', \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::class => __DIR__.'/../../support/datastructure/runtime/firehub.HasCopyOnWriteState.php', \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::class => __DIR__.'/../../support/datastructure/runtime/firehub.HasFreezeState.php', \FireHub\Core\Support\DataStructure\Runtime\StructureState::class => __DIR__.'/../../support/datastructure/runtime/firehub.StructureState.php', @@ -247,6 +251,7 @@ \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.FrozenDataStructureException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidBufferException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidBufferException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidCowStateException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidDataStructureException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\NodeOwnershipException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.NodeOwnershipException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\OutOfBoundsException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.OutOfBoundsException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\SizeException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.SizeException.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index c4eb76bb..a0735422 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -60,6 +60,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../shared/contracts/firehub.Countable.php'; return; + case \FireHub\Core\Shared\Contracts\DataTransferObject::class: + require __DIR__.'/../../../shared/contracts/firehub.DataTransferObject.php'; + return; + case \FireHub\Core\Shared\Contracts\Iterator::class: require __DIR__.'/../../../shared/contracts/firehub.Iterator.php'; return; @@ -276,10 +280,22 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/capability/firehub.Freezable.php'; return; + case \FireHub\Core\Support\DataStructure\Capability\Rehydratable::class: + require __DIR__.'/../../../support/datastructure/capability/firehub.Rehydratable.php'; + return; + case \FireHub\Core\Support\DataStructure\Capability\Snapshotable::class: require __DIR__.'/../../../support/datastructure/capability/firehub.Snapshotable.php'; return; + case \FireHub\Core\Support\DataStructure\DTO\DehydratedState::class: + require __DIR__.'/../../../support/datastructure/dto/firehub.DehydratedState.php'; + return; + + case \FireHub\Core\Support\DataStructure\DTO\StateHeader::class: + require __DIR__.'/../../../support/datastructure/dto/firehub.StateHeader.php'; + return; + case \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::class: require __DIR__.'/../../../support/datastructure/runtime/firehub.HasCopyOnWriteState.php'; return; @@ -920,6 +936,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidCowStateException.php'; return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidDataStructureException.php'; + return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\NodeOwnershipException::class: require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.NodeOwnershipException.php'; return; diff --git a/src/support/datastructure/capability/firehub.Rehydratable.php b/src/support/datastructure/capability/firehub.Rehydratable.php new file mode 100644 index 00000000..10abcc4d --- /dev/null +++ b/src/support/datastructure/capability/firehub.Rehydratable.php @@ -0,0 +1,73 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability; + +use FireHub\Core\Support\DataStructure\DTO\DehydratedState; + +/** + * ### Rehydratable Capability + * + * Defines a reversible lifecycle contract for objects that can be converted into a canonical dehydrated state and + * reconstructed back into their original form. + * + * This contract guarantees that a data structure can: + * - Be safely serialized into a deterministic state representation + * - Be fully restored without loss of structural integrity + * - Participate in persistence, transport, and transformation pipelines + * + * It forms the foundation of FireHub's DS lifecycle model. + * @since 1.0.0 + * + * @template TStructure of \FireHub\Core\Support\Contracts\DataStructure + * @template TStorage of \FireHub\Core\Support\DataStructure\Storage + * @template TArray of array + */ +interface Rehydratable { + + /** + * ### Extract the canonical structural state representation + * + * Exports the logical contents and structural metadata of the data structure into a deterministic, lossless, and + * implementation-independent format. + * + * The resulting state must contain enough information to fully reconstruct the structure through the + * corresponding hydration process. + * @since 1.0.0 + * + * @return \FireHub\Core\Support\DataStructure\DTO\DehydratedState Canonical dehydrated + * structure state. + */ + public function dehydrate ():DehydratedState; + + /** + * ### Reconstruct structure from a canonical state + * + * Reconstructs a fully functional data structure instance from a canonical DehydratedState snapshot. + * Hydration is a deterministic reverse lifecycle operation that restores the original structural identity of a + * data structure without altering its semantic meaning or introducing runtime-specific side effects. + * @since 1.0.0 + * + * @template TNewStructure of TStructure + * @template TNewStorage of TStorage + * @template TNewArray of TArray + * + * @param \FireHub\Core\Support\DataStructure\DTO\DehydratedState $state

+ * Canonical state snapshot. + *

+ * + * @return static Fully reconstructed data structure. + */ + public static function hydrate (DehydratedState $state):static; + +} \ No newline at end of file diff --git a/src/support/datastructure/dto/firehub.DehydratedState.php b/src/support/datastructure/dto/firehub.DehydratedState.php new file mode 100644 index 00000000..cdf2df96 --- /dev/null +++ b/src/support/datastructure/dto/firehub.DehydratedState.php @@ -0,0 +1,57 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\DTO; + +use FireHub\Core\Shared\Contracts\DataTransferObject; + +/** + * ### Dehydrated State + * + * Immutable canonical snapshot of a DataStructure at a specific point in time. + * + * It represents a transportable, storage-independent representation of a data + * structure, used for: + * - Hydration (reconstruction of the same structure) + * - Persistence (storage encoding) + * - Transformation (forge pipelines) + * + * The state is NOT tied to memory layout, runtime behavior, or storage engine. + * It is a pure structural representation of data and relationships. + * @since 1.0.0 + * + * @template TStructure of \FireHub\Core\Support\Contracts\DataStructure + * @template TStorage of \FireHub\Core\Support\DataStructure\Storage + * @template TArray of array + */ +final readonly class DehydratedState implements DataTransferObject { + + /** + * ### Constructor + * @since 1.0.0 + * + * @param \FireHub\Core\Support\DataStructure\DTO\StateHeader $header

+ * Header of the state. + *

+ * @param TArray $payload

+ * Payload of the state. + *

+ * + * @return void + */ + public function __construct ( + public StateHeader $header, + public array $payload + ) {} + +} \ No newline at end of file diff --git a/src/support/datastructure/dto/firehub.StateHeader.php b/src/support/datastructure/dto/firehub.StateHeader.php new file mode 100644 index 00000000..8c7bbd0d --- /dev/null +++ b/src/support/datastructure/dto/firehub.StateHeader.php @@ -0,0 +1,53 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\DTO; + +use FireHub\Core\Shared\Contracts\DataTransferObject; + +/** + * ### State Header + * + * Immutable metadata describing a dehydrated data structure state. + * + * Contains only structural identity and compatibility information, not runtime or business logic. + * @since 1.0.0 + * + * @template TStructure of \FireHub\Core\Support\Contracts\DataStructure + * @template TStorage of \FireHub\Core\Support\DataStructure\Storage + */ +final readonly class StateHeader implements DataTransferObject { + + /** + * ### Constructor + * @since 1.0.0 + * + * @param positive-int $version

+ * Version of the data structure hydration. + *

+ * @param class-string $structure

+ * Name of the data structure. + *

+ * @param class-string $storage

+ * Name of the storage. + *

+ * + * @return void + */ + public function __construct ( + public int $version, + public string $structure, + public string $storage + ) {} + +} \ No newline at end of file diff --git a/src/support/datastructure/structure/firehub.Vector.php b/src/support/datastructure/structure/firehub.Vector.php index 59e29289..3af6640b 100644 --- a/src/support/datastructure/structure/firehub.Vector.php +++ b/src/support/datastructure/structure/firehub.Vector.php @@ -18,15 +18,19 @@ use FireHub\Core\Support\DataStructure\Abstraction\Collection; use FireHub\Core\Support\DataStructure\Type\Linear; use FireHub\Core\Support\DataStructure\Capability\ { - Copyable, Countable, Forkable, Freezable, Snapshotable + Copyable, Countable, Forkable, Freezable, Rehydratable, Snapshotable }; use FireHub\Core\Support\DataStructure\Runtime\ { HasCopyOnWriteState, HasFreezeState, StructureState }; +use FireHub\Core\Support\DataStructure\DTO\ { + DehydratedState, StateHeader +}; use FireHub\Core\Support\DataStructure\Storage; use FireHub\Core\Support\DataStructure\Storage\Capability\ { - Cloneable, StorageMetricsAware + Cloneable, DequeMutation, IndexAccess, StorageMetricsAware }; +use FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException; use Traversable; /** @@ -46,9 +50,12 @@ * @implements \FireHub\Core\Support\DataStructure\Abstraction\Collection * @implements \FireHub\Core\Support\DataStructure\Type\Linear * @implements \FireHub\Core\Support\DataStructure\Capability\Snapshotable + * @implements \FireHub\Core\Support\DataStructure\Capability\Rehydratable, StorageType, array{values: array}> + * + * @phpstan-type StorageType = (Storage&Cloneable&StorageMetricsAware&DequeMutation&IndexAccess) */ final class Vector implements DataStructure, Collection, Linear, Copyable, Forkable, Snapshotable, Freezable, - Countable { + Rehydratable, Countable { /** * ### Copy-On-Write State Management @@ -68,14 +75,14 @@ final class Vector implements DataStructure, Collection, Linear, Copyable, Forka * * @uses \FireHub\Core\Support\DataStructure\Storage As parameter. * - * @param Storage&Cloneable&StorageMetricsAware $storage

+ * @param StorageType $storage

* The storage backend for the data structure. *

* * @return void */ public function __construct ( - protected Storage&Cloneable&StorageMetricsAware $storage + protected Storage&Cloneable&StorageMetricsAware&DequeMutation&IndexAccess $storage ) { $this->state = new StructureState(); @@ -150,6 +157,50 @@ public function freeze ():void { } + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function dehydrate ():DehydratedState { + + $values = []; + + foreach ($this as $value) + $values[] = $value; + + /** @var DehydratedState, StorageType, array{values: array}> */ + return new DehydratedState( + new StateHeader(1, self::class, $this->storage::class), + ['values' => $values] + ); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\FrontInsertion::addFirst() To add the first element + * to the storage. + * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException If the data + * structure is not of the expected type + */ + public static function hydrate (DehydratedState $state):static { + + if ($state->header->structure !== self::class) + throw new InvalidDataStructureException; + + $storage = new $state->header->storage(); + + $storage->addFirst(...$state->payload['values']); + + return new self($storage); + + } + /** * @inheritDoc * diff --git a/src/support/datastructure/structure/snapshot/firehub.Snapshot.php b/src/support/datastructure/structure/snapshot/firehub.Snapshot.php index de153801..78e307e9 100644 --- a/src/support/datastructure/structure/snapshot/firehub.Snapshot.php +++ b/src/support/datastructure/structure/snapshot/firehub.Snapshot.php @@ -37,14 +37,14 @@ * * @uses \FireHub\Core\Support\Contracts\DataStructure As parameter. * - * @param \FireHub\Core\Support\Contracts\DataStructure $data_structure

+ * @param \FireHub\Core\Support\Contracts\DataStructure $structure

* The data structure to be encapsulated by the snapshot. *

* * @return void */ public function __construct( - protected DataStructure $data_structure + protected DataStructure $structure ) {} /** @@ -97,7 +97,7 @@ final public function __call (string $name, array $arguments):mixed { "Method $name is not allowed on snapshot." ); - return $this->data_structure->$method(...$arguments); // @phpstan-ignore method.dynamicName + return $this->structure->$method(...$arguments); // @phpstan-ignore method.dynamicName } diff --git a/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php b/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php index c010781c..5a386528 100644 --- a/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php +++ b/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php @@ -35,17 +35,17 @@ * * @uses \FireHub\Core\Support\DataStructure\Structure\Vector As parameter. * - * @param \FireHub\Core\Support\DataStructure\Structure\Vector $data_structure

+ * @param \FireHub\Core\Support\DataStructure\Structure\Vector $structure

* The vector to be encapsulated by the snapshot. *

* * @return void */ public function __construct( - Vector $data_structure + Vector $structure ) { - parent::__construct($data_structure); + parent::__construct($structure); } diff --git a/src/throwable/exception/support/datastructure/firehub.InvalidDataStructureException.php b/src/throwable/exception/support/datastructure/firehub.InvalidDataStructureException.php new file mode 100644 index 00000000..b60e6292 --- /dev/null +++ b/src/throwable/exception/support/datastructure/firehub.InvalidDataStructureException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### Data Structure is invalid + * @since 1.0.0 + */ +class InvalidDataStructureException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'Invalid Data Structure type.'; + +} \ No newline at end of file From cc098de6515efb529d7c91ca902ec3b4ff620591 Mon Sep 17 00:00:00 2001 From: Riddick Date: Tue, 26 May 2026 15:20:17 +0200 Subject: [PATCH 68/79] Add Rebuildable and Convertible capabilities to data structures --- CHANGELOG.md | 10 ++- dist/core.min.phar | Bin 254585 -> 259747 bytes dist/core.phar | Bin 805462 -> 818519 bytes src/support/autoload/classmap.php | 5 ++ .../loader/firehub.CompiledClassmap.php | 20 ++++++ .../capability/firehub.Rebuildable.php | 67 ++++++++++++++++++ .../capability/firehub.Convertible.php | 47 ++++++++++++ .../storage/firehub.ArrListStorage.php | 34 ++++++++- .../storage/firehub.ArrMapStorage.php | 47 +++++++++++- .../storage/firehub.GeneratorStorage.php | 23 +++++- .../structure/firehub.Vector.php | 37 +++++++++- .../firehub.InvalidKeyException.php | 31 ++++++++ .../firehub.InvalidStorageException.php | 31 ++++++++ .../firehub.InvalidValueException.php | 31 ++++++++ 14 files changed, 371 insertions(+), 12 deletions(-) create mode 100644 src/support/datastructure/capability/firehub.Rebuildable.php create mode 100644 src/support/datastructure/storage/capability/firehub.Convertible.php create mode 100644 src/throwable/exception/support/datastructure/firehub.InvalidKeyException.php create mode 100644 src/throwable/exception/support/datastructure/firehub.InvalidStorageException.php create mode 100644 src/throwable/exception/support/datastructure/firehub.InvalidValueException.php diff --git a/CHANGELOG.md b/CHANGELOG.md index a9da8d64..76f02889 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,15 +5,21 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.3.1...feature/support-high-level-api) + +### Added +- Introduce Data Transfer Object and Rehydratable capabilities for structured data management (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`1117c8b`](https://github.com/The-FireHub-Project/Core-Foundation/commit/1117c8b)) +- Add Rebuildable and Convertible capabilities to data structures (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`1117c8b`](https://github.com/The-FireHub-Project/Core-Foundation/commit/1117c8b)) + ## [v0.3.1](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.3.0...v0.3.1) – 2026-05-25 ### Added -- introduce extensible data structure framework with granular capabilities and runtime state management (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`0400d2e`](https://github.com/The-FireHub-Project/Core-Foundation/commit/0400d2e)) +- Introduce an extensible data structure framework with granular capabilities and runtime state management (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`0400d2e`](https://github.com/The-FireHub-Project/Core-Foundation/commit/0400d2e)) ## [v0.3.0](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.2.0...v0.3.0) – 2026-05-19 ### Added -- redesign and expand data structure capabilities with flexible abstraction contracts (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`ce61610`](https://github.com/The-FireHub-Project/Core-Foundation/commit/ce61610)) +- Redesign and expand data structure capabilities with flexible abstraction contracts (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`ce61610`](https://github.com/The-FireHub-Project/Core-Foundation/commit/ce61610)) ## [v0.2.0](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.1.1...v0.2.0) – 2026-03-23 diff --git a/dist/core.min.phar b/dist/core.min.phar index 9d60c712684543cd9e42113148fdf17d955f485a..ef041f3c2d05ecd8e9a2c7c21b855486f50e68d1 100644 GIT binary patch delta 5005 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 kBermwDGlRJp8XJ{*RBBnv|9FZ#DK=i2wiq delta 3361 zcmYjTd0bOh7S4MiA()VbBgKS}w0Fr=|iXezMsFi}C)}^fwZE4lIfZmoX z@^fLNE*%+d9Zl_`IMssELUoi@?Wo|6OR=`JYNdVWJf|K0;QO6>&iT%A?>R3!?<*dk zP&DL;$}9rG{fz~+?67s?g>l?}B4G>wkxURk2@?;njfn-g#3TZYWX%9`Sd{j#86Z7k zO#o5CbbwkRnsf+rLGp4y%VLLQkXjtj;hsYtNXa6!Tq~Lc(peE&YQ(7^6^i2kHjDA_ zqSykG!4V@Ya*US^Team;j6ksCHGMa!l6sJ%!(L?2(E-ec9HRlkBu0RF5@gyfNdf5| z58+Oj&tfMG{h3n|=ze#?Iub`5()^~JXBS~`1 z+$Nt2Cf~}jY2y^w*OdxPFlX?C%L_o1sz%!P)EKf~jUf%1 zd~|N+OmEfv{Z(>R6G4t@T*0ANgXsimi$GefoepqATL_TkIt~4rxS+jjmJ|@i4a>`S zL*qkk#i;&>Q)@$7hDfPfJWcRmRN@vs>4omd*5i(BV?EGojR#LU#M!j14!%Tw(8iM> zPc;NIdHxNc)w2NLch5NhbG>E&ba<5j1bQRqTi(do=RFHkxX+Qjl#+dn>TS1#}(eR2))R>`09cq@-!hqdK^ zt-IRdNR|#?);isbkkK{WO8^$1`2e5$ECdK2g;L9?Dv(@8F9TRNI^9F@JRiW-pr z6Goqm_Z2S_2pX@7j7V+?VPs^59@oO#dK}?XdR%B?e;jtRe=K?lxEs3Tqmn^jnjOYS z#9LjE_P9T+!A$`;iU|RDJGBA0mD&Sv1|0(9kYbo~=ra9#C6NaP%J_D8jz*3ZfwZvJ~QPB-?j9Pq)JLX)A$IS$WW8;w4BZQxi8=SK4xcL;hYIY;rBjh9} z)S2uL@dVSZ5S+u&p*RFJq4VJIb|}tQT38Xre8l+&9{g|u$q6&kg6|kNB@79yIKcIJ z%PKj|1iC7PaTh;84Vf8^$+w4N@?H^GSS=5I5%~}#CKAh}kp&n8lJtq}RdQ5%qKwqg z57HT}_%2VE6NNngh~f*n#+{xvuQ*Cd4SF)u=t|dRGFm0H29g4_j=Av$X^D)c$NISL z05=!0eLM#Cn85F_KJK(*=h-iTg$`yhW0gNYX8>$C*m9QSM90!L3!@Q33pj>wBbK$% zh(rTMY+710zr3Isrnm<^SOJ$68Hjen(x3>pM+Fb?*3KVkQ!L+pzf`FqZM<}>*L zcr9F0)%3Ng+)jnUxndIHW}}f4w>O+)4-WllbUObpqv1Gwn#J*WS)at?H$j?!P?W$& zxytdas2$ji1Zxu%G6>7|JiMx!V*V-)-_+_R!$|usLvYjOl~xqSomHdr$kGoN0Dh ze|}Tt8++~yb$0*weqGSh`t_Y1%Eqk)H9e;yuMc|k4@}&0 z^7He(Bj)72-yMD}b7gf`>k(!A2}ZPQw!^Bj&z|KvY&*buUZ42v+#Da<;m$ls%qJb^ zs%#g9=}Sw_Htp}vIDS#^K6~m`-$$oP%75$Wy|Oi-?3YYYcu7~ymXqzCn--WBcpLI7 z{nBr=ePNq+rm*L2yKrx5{g^qGk{uGief?9lb$dHq8O@p7Zts-j4z%1HpYr|Uy2%6m z9R(vl+g2Fys9I3r!|od`JCii>d*Qt!Ki%EG?8kcB1?lHM&ziAl_1zk&apltXgCXxE zPPnhkavgVl>U7IVYwWLGG4U>k-paRjJvrd&fAV3)y0X-tXZJY_?u==&j=tr_ z?0qXXkE#64!&bK>Q}fn|&dWQ$bUd@y@MK0()AsIpz4X%yv4)#(u9KggpJg;VMhB(8 zx_VXJ<#*3NvmahQC%B+Y;+`<|)cj}lrW>x=PjBah&v@@}>l0Ve_JjYqAU&5~@Xz%d zcZN1Ti1X?TK3;R-r}gU JU{1Cq{{a?x4Tk^# diff --git a/dist/core.phar b/dist/core.phar index e87bbf31d2f0b83779b479c494134c1bfc04c78c..2448531b4516587e341761a07ddeb1d251155b35 100644 GIT binary patch delta 7668 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 delta 3607 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 F{V$%ZWJdr1 diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index 87d314f3..51a8b27d 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -87,6 +87,7 @@ \FireHub\Core\Support\DataStructure\Capability\Enumerable::class => __DIR__.'/../../support/datastructure/capability/firehub.Enumerable.php', \FireHub\Core\Support\DataStructure\Capability\Forkable::class => __DIR__.'/../../support/datastructure/capability/firehub.Forkable.php', \FireHub\Core\Support\DataStructure\Capability\Freezable::class => __DIR__.'/../../support/datastructure/capability/firehub.Freezable.php', + \FireHub\Core\Support\DataStructure\Capability\Rebuildable::class => __DIR__.'/../../support/datastructure/capability/firehub.Rebuildable.php', \FireHub\Core\Support\DataStructure\Capability\Rehydratable::class => __DIR__.'/../../support/datastructure/capability/firehub.Rehydratable.php', \FireHub\Core\Support\DataStructure\Capability\Snapshotable::class => __DIR__.'/../../support/datastructure/capability/firehub.Snapshotable.php', \FireHub\Core\Support\DataStructure\DTO\DehydratedState::class => __DIR__.'/../../support/datastructure/dto/firehub.DehydratedState.php', @@ -101,6 +102,7 @@ \FireHub\Core\Support\DataStructure\Storage\Capability\BackMutation::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.BackMutation.php', \FireHub\Core\Support\DataStructure\Storage\Capability\BackRemoval::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.BackRemoval.php', \FireHub\Core\Support\DataStructure\Storage\Capability\Cloneable::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.Cloneable.php', + \FireHub\Core\Support\DataStructure\Storage\Capability\Convertible::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.Convertible.php', \FireHub\Core\Support\DataStructure\Storage\Capability\CyclicTraversal::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.CyclicTraversal.php', \FireHub\Core\Support\DataStructure\Storage\Capability\DequeMutation::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.DequeMutation.php', \FireHub\Core\Support\DataStructure\Storage\Capability\FrontInsertion::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.FrontInsertion.php', @@ -252,6 +254,9 @@ \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidBufferException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidBufferException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidCowStateException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidDataStructureException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidKeyException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidStorageException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidStorageException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidValueException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidValueException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\NodeOwnershipException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.NodeOwnershipException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\OutOfBoundsException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.OutOfBoundsException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\SizeException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.SizeException.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index a0735422..1f88a22b 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -280,6 +280,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/capability/firehub.Freezable.php'; return; + case \FireHub\Core\Support\DataStructure\Capability\Rebuildable::class: + require __DIR__.'/../../../support/datastructure/capability/firehub.Rebuildable.php'; + return; + case \FireHub\Core\Support\DataStructure\Capability\Rehydratable::class: require __DIR__.'/../../../support/datastructure/capability/firehub.Rehydratable.php'; return; @@ -336,6 +340,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/storage/capability/firehub.Cloneable.php'; return; + case \FireHub\Core\Support\DataStructure\Storage\Capability\Convertible::class: + require __DIR__.'/../../../support/datastructure/storage/capability/firehub.Convertible.php'; + return; + case \FireHub\Core\Support\DataStructure\Storage\Capability\CyclicTraversal::class: require __DIR__.'/../../../support/datastructure/storage/capability/firehub.CyclicTraversal.php'; return; @@ -940,6 +948,18 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidDataStructureException.php'; return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidKeyException.php'; + return; + + case \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidStorageException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidStorageException.php'; + return; + + case \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidValueException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidValueException.php'; + return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\NodeOwnershipException::class: require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.NodeOwnershipException.php'; return; diff --git a/src/support/datastructure/capability/firehub.Rebuildable.php b/src/support/datastructure/capability/firehub.Rebuildable.php new file mode 100644 index 00000000..8035b040 --- /dev/null +++ b/src/support/datastructure/capability/firehub.Rebuildable.php @@ -0,0 +1,67 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Capability; + +/** + * ### Rebuildable Capability + * + * Defines the ability to rebuild a data structure using the same semantic structure while allowing internal + * implementation changes. + * + * Rebuilding preserves: + * - Structural meaning + * - Ordering semantics + * - Key/value relationships + * - Behavioral contracts + * + * But may change: + * - Storage backend + * - Memory layout + * - Internal optimization strategy + * - Capacity model + * + * Rebuild is considered an implementation-level lifecycle operation. + * @since 1.0.0 + * + * @template TStorage of \FireHub\Core\Support\DataStructure\Storage + */ +interface Rebuildable { + + /** + * ### Rebuild structure using a different implementation strategy + * + * Reconstructs the same logical structure using another storage backend, memory strategy, or internal + * optimization model while preserving the exact semantic behavior of the original structure. + * + * This operation MUST NOT change: + * - Structural category + * - Public semantics + * - Key/value meaning + * - Traversal behavior + * + * It MAY change: + * - Runtime performance characteristics + * - Storage representation + * - Internal indexing layout + * @since 1.0.0 + * + * @param class-string $storage

+ * Target storage implementation. + *

+ * + * @return static Rebuilt structure instance. + */ + public function rebuild (string $storage):static; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/capability/firehub.Convertible.php b/src/support/datastructure/storage/capability/firehub.Convertible.php new file mode 100644 index 00000000..75f540b8 --- /dev/null +++ b/src/support/datastructure/storage/capability/firehub.Convertible.php @@ -0,0 +1,47 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Capability; + +use FireHub\Core\Support\DataStructure\Storage; + +/** + * ### Storage Convertible Capability + * + * Defines a contract for storage implementations that can be constructed from another storage instance. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +interface Convertible { + + /** + * ### Create from another storage + * + * Creates a new storage instance from an existing storage. + * @since 1.0.0 + * + * @template TStorageKey of TKey + * @template TStorageValue of TValue + * @template TStorage of \FireHub\Core\Support\DataStructure\Storage + * + * @param TStorage $storage

+ * Provided storage. + *

+ * + * @return static New storage from provided storage. + */ + public static function fromStorage (Storage $storage):static; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.ArrListStorage.php b/src/support/datastructure/storage/firehub.ArrListStorage.php index e06c0593..61604859 100644 --- a/src/support/datastructure/storage/firehub.ArrListStorage.php +++ b/src/support/datastructure/storage/firehub.ArrListStorage.php @@ -15,8 +15,9 @@ use FireHub\Core\Support\DataStructure\Storage; use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; +use FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer; use FireHub\Core\Support\DataStructure\Storage\Capability\ { - Cloneable, DequeMutation, IndexAccess, IndexMutation, LinearBoundaryAccess, StorageMetricsAware + Cloneable, Convertible, DequeMutation, IndexAccess, IndexMutation, LinearBoundaryAccess, StorageMetricsAware }; use FireHub\Core\Shared\Type\Maybe; use FireHub\Core\Shared\Enums\MutationOutcome; @@ -36,13 +37,14 @@ * @template TValue * * @implements \FireHub\Core\Support\DataStructure\Storage + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\Convertible * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\LinearBoundaryAccess * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\DequeMutation * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\IndexAccess * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\IndexMutation */ -final class ArrListStorage implements Storage, Cloneable, StorageMetricsAware, LinearBoundaryAccess, DequeMutation, - IndexAccess, IndexMutation { +final class ArrListStorage implements Storage, Convertible, Cloneable, StorageMetricsAware, LinearBoundaryAccess, + DequeMutation, IndexAccess, IndexMutation { /** * ### Underlying data storage @@ -71,6 +73,32 @@ public function __construct (?ArrStorageInitializer $initializer = null) { } + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer To + * convert the storage to an array. + * @uses \FireHub\Core\Support\DataStructure\Storage::iterate() To retrieve an iterable of the elements in the + * storage. + */ + public static function fromStorage (Storage $storage):static { + + return new self( + new ArrCallbackInitializer(function () use ($storage) { + + $values = []; + foreach ($storage->iterate() as $value) + $values[] = $value; + + return $values; + + }) + ); + + } + /** * @inheritDoc * diff --git a/src/support/datastructure/storage/firehub.ArrMapStorage.php b/src/support/datastructure/storage/firehub.ArrMapStorage.php index 1d0fb60b..674b9ac4 100644 --- a/src/support/datastructure/storage/firehub.ArrMapStorage.php +++ b/src/support/datastructure/storage/firehub.ArrMapStorage.php @@ -15,12 +15,16 @@ use FireHub\Core\Support\DataStructure\Storage; use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; +use FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer; use FireHub\Core\Support\DataStructure\Storage\Capability\ { - Cloneable, KeyAccess, KeyMutation, StorageMetricsAware + Cloneable, Convertible, KeyAccess, KeyMutation, StorageMetricsAware }; use FireHub\Core\Shared\Type\Maybe; use FireHub\Core\Shared\Enums\MutationOutcome; -use FireHub\Core\Support\LowLevel\Arr; +use FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException; +use FireHub\Core\Support\LowLevel\ { + Arr, DataIs +}; /** * ### Array-Based Map Storage @@ -35,10 +39,11 @@ * @template TValue * * @implements \FireHub\Core\Support\DataStructure\Storage + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\Convertible * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\KeyAccess * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\KeyMutation */ -final class ArrMapStorage implements Storage, Cloneable, StorageMetricsAware, KeyAccess, KeyMutation { +final class ArrMapStorage implements Storage, Convertible, Cloneable, StorageMetricsAware, KeyAccess, KeyMutation { /** * ### Underlying data storage @@ -66,6 +71,42 @@ public function __construct (?ArrStorageInitializer $initializer = null) { } + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer To + * convert the storage to an array. + * @uses \FireHub\Core\Support\DataStructure\Storage::iterate() To retrieve an iterable of the elements in the + * storage. + */ + public static function fromStorage (Storage $storage):static { + + return new self( + new ArrCallbackInitializer(function () use ($storage) { + + $values = []; + foreach ($storage->iterate() as $key => $value) { + + if (!DataIs::int($key) && !DataIs::string($key)) + throw InvalidKeyException::builder() + ->withContext([ + 'key' => $key + ]) + ->build(); + + $values[$key] = $value; + + } + + return $values; + + }) + ); + + } + /** * @inheritDoc * diff --git a/src/support/datastructure/storage/firehub.GeneratorStorage.php b/src/support/datastructure/storage/firehub.GeneratorStorage.php index 9a58af44..81d8f9c5 100644 --- a/src/support/datastructure/storage/firehub.GeneratorStorage.php +++ b/src/support/datastructure/storage/firehub.GeneratorStorage.php @@ -15,6 +15,8 @@ use FireHub\Core\Support\DataStructure\Storage; use FireHub\Core\Support\DataStructure\Storage\Initialization\GeneratorStorageInitializer; +use FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\GeneratorCallbackInitializer; +use FireHub\Core\Support\DataStructure\Storage\Capability\Convertible; /** * ### Lazy Generator-Based Storage @@ -28,8 +30,9 @@ * @template TValue * * @implements \FireHub\Core\Support\DataStructure\Storage + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\Convertible */ -final readonly class GeneratorStorage implements Storage { +final readonly class GeneratorStorage implements Storage, Convertible { /** * ### Constructor @@ -47,6 +50,24 @@ public function __construct ( private GeneratorStorageInitializer $initializer ) {} + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\GeneratorCallbackInitializer To + * convert the storage to a generator. + * @uses \FireHub\Core\Support\DataStructure\Storage::iterate() To retrieve an iterable of the elements in the + * storage. + */ + public static function fromStorage (Storage $storage):static { + + return new self( + new GeneratorCallbackInitializer(fn() => yield from $storage->iterate()) + ); + + } + /** * @inheritDoc * diff --git a/src/support/datastructure/structure/firehub.Vector.php b/src/support/datastructure/structure/firehub.Vector.php index 3af6640b..86889799 100644 --- a/src/support/datastructure/structure/firehub.Vector.php +++ b/src/support/datastructure/structure/firehub.Vector.php @@ -18,7 +18,7 @@ use FireHub\Core\Support\DataStructure\Abstraction\Collection; use FireHub\Core\Support\DataStructure\Type\Linear; use FireHub\Core\Support\DataStructure\Capability\ { - Copyable, Countable, Forkable, Freezable, Rehydratable, Snapshotable + Copyable, Countable, Forkable, Freezable, Rebuildable, Rehydratable, Snapshotable }; use FireHub\Core\Support\DataStructure\Runtime\ { HasCopyOnWriteState, HasFreezeState, StructureState @@ -30,7 +30,10 @@ use FireHub\Core\Support\DataStructure\Storage\Capability\ { Cloneable, DequeMutation, IndexAccess, StorageMetricsAware }; -use FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException; +use FireHub\Core\Throwable\Exception\Support\DataStructure\ { + InvalidDataStructureException, InvalidStorageException +}; +use FireHub\Core\Support\LowLevel\ClsObj; use Traversable; /** @@ -51,11 +54,12 @@ * @implements \FireHub\Core\Support\DataStructure\Type\Linear * @implements \FireHub\Core\Support\DataStructure\Capability\Snapshotable * @implements \FireHub\Core\Support\DataStructure\Capability\Rehydratable, StorageType, array{values: array}> + * @implements \FireHub\Core\Support\DataStructure\Capability\Rebuildable * * @phpstan-type StorageType = (Storage&Cloneable&StorageMetricsAware&DequeMutation&IndexAccess) */ final class Vector implements DataStructure, Collection, Linear, Copyable, Forkable, Snapshotable, Freezable, - Rehydratable, Countable { + Rehydratable, Rebuildable, Countable { /** * ### Copy-On-Write State Management @@ -201,6 +205,33 @@ public static function hydrate (DehydratedState $state):static { } + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\ClsObj::ofClass() To check if storage has Convertible interface. + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\Convertible::fromStorage() To create a new + * instance of the storage. + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidStorageException If the storage is not + * convertible. + */ + public function rebuild (string $storage):static { + + $new_storage = ClsObj::ofClass($storage, Storage\Capability\Convertible::class) + ? $storage::fromStorage($this->storage) + : throw InvalidStorageException::builder() + ->withContext( + ['storage' => $storage] + ) + ->build(); + + return new self($new_storage); + + } + /** * @inheritDoc * diff --git a/src/throwable/exception/support/datastructure/firehub.InvalidKeyException.php b/src/throwable/exception/support/datastructure/firehub.InvalidKeyException.php new file mode 100644 index 00000000..ae416e87 --- /dev/null +++ b/src/throwable/exception/support/datastructure/firehub.InvalidKeyException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### DataStructure key is invalid + * @since 1.0.0 + */ +class InvalidKeyException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'Invalid Data Structure key.'; + +} \ No newline at end of file diff --git a/src/throwable/exception/support/datastructure/firehub.InvalidStorageException.php b/src/throwable/exception/support/datastructure/firehub.InvalidStorageException.php new file mode 100644 index 00000000..5425ccae --- /dev/null +++ b/src/throwable/exception/support/datastructure/firehub.InvalidStorageException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### DataStructure storage is invalid + * @since 1.0.0 + */ +class InvalidStorageException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'Invalid Data Structure storage.'; + +} \ No newline at end of file diff --git a/src/throwable/exception/support/datastructure/firehub.InvalidValueException.php b/src/throwable/exception/support/datastructure/firehub.InvalidValueException.php new file mode 100644 index 00000000..370e5dcb --- /dev/null +++ b/src/throwable/exception/support/datastructure/firehub.InvalidValueException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### DataStructure value is invalid + * @since 1.0.0 + */ +class InvalidValueException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'Invalid Data Structure value.'; + +} \ No newline at end of file From 16353ce906b3ff017b3326a040e305afd00a6c8c Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 27 May 2026 09:08:35 +0200 Subject: [PATCH 69/79] Correct documentation and improve mutation outcome handling in BackInsertion and ArrListStorage --- .../storage/capability/firehub.BackInsertion.php | 2 +- .../storage/firehub.ArrListStorage.php | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/support/datastructure/storage/capability/firehub.BackInsertion.php b/src/support/datastructure/storage/capability/firehub.BackInsertion.php index b0c56143..d76a04a9 100644 --- a/src/support/datastructure/storage/capability/firehub.BackInsertion.php +++ b/src/support/datastructure/storage/capability/firehub.BackInsertion.php @@ -25,7 +25,7 @@ interface BackInsertion { /** - * ### Prepend values to the back + * ### Append values to the back * @since 1.0.0 * * @param TValue ...$values

diff --git a/src/support/datastructure/storage/firehub.ArrListStorage.php b/src/support/datastructure/storage/firehub.ArrListStorage.php index 61604859..131be8da 100644 --- a/src/support/datastructure/storage/firehub.ArrListStorage.php +++ b/src/support/datastructure/storage/firehub.ArrListStorage.php @@ -300,12 +300,14 @@ public function get (int $index):Maybe { */ public function set (int $index, mixed $value):MutationOutcome { - $this->data[$index] = $value; - - return $this->has($index) + $outcome = $this->has($index) ? MutationOutcome::UPDATED : MutationOutcome::CREATED; + $this->data[$index] = $value; + + return $outcome; + } /** @@ -317,12 +319,14 @@ public function set (int $index, mixed $value):MutationOutcome { */ public function remove (int $index):MutationOutcome { - unset($this->data[$index]); - - return $this->has($index) + $outcome = $this->has($index) ? MutationOutcome::REMOVED : MutationOutcome::NOT_FOUND; + unset($this->data[$index]); + + return $outcome; + } } \ No newline at end of file From a8db5c599a212aa3e1086b7018815283e28a8f80 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 27 May 2026 12:29:32 +0200 Subject: [PATCH 70/79] Enhance `Vector` capabilities with advanced index-based operations and PHP 8.1 support **Detailed Description:** 1. **Upgraded PHP Version Compatibility:** - Updated `Vector`, `ArrListStorage`, and `ArrMapStorage` to require PHP 8.1 for modern language features and improved compatibility. 2. **Extended `Vector`'s Capability Support:** - Added support for new capabilities including `IndexMutation`, `LinearBoundaryAccess`, `FrontInsertion`, `BackInsertion`, `FrontRemoval`, and `BackRemoval`. - Integrated operations for advanced index-based data access and mutation: - `first()`, `last()`, `has(int $index)`, `get(int $index)`, `set(int $index, mixed $value)`, `remove(int $index)` methods. - Array-like operations for structural modification, including `prepend` (addFirst), `append` (addLast), `shift` (removeFirst), and `pop` (removeLast). 3. **Improved Structural Snapshot Handling:** - Enhanced `VectorSnapshot` with new snapshot capabilities, including `first`, `last`, `has`, and `get`. 4. **Runtime State Management Enhancements:** - Added safeguards for frozen structures and copy-on-write state during mutation operations: - Ensures proper detachment and immutability handling with added exception management (`FrozenDataStructureException`, `InvalidCowStateException`). 5. **PHAR Builds Updated:** - Updated `core.phar` and `core.min.phar` builds to reflect enhancements. **Key Benefits:** - Improves `Vector`'s usability with robust and flexible index-based operations. - Ensures compatibility with modern PHP versions for optimized performance. - Enhances safety and consistency in runtime behavior with clear safeguards and error handling. - Expands snapshot functionality for immutable state projections. --- dist/core.min.phar | Bin 259747 -> 261185 bytes dist/core.phar | Bin 818519 -> 831063 bytes .../storage/firehub.ArrListStorage.php | 2 +- .../storage/firehub.ArrMapStorage.php | 2 +- .../structure/firehub.Vector.php | 298 +++++++++++++++++- .../snapshot/firehub.VectorSnapshot.php | 8 +- 6 files changed, 303 insertions(+), 7 deletions(-) diff --git a/dist/core.min.phar b/dist/core.min.phar index ef041f3c2d05ecd8e9a2c7c21b855486f50e68d1..d8c7645c8bc818990aafd02cfbea6af5f02dc2bc 100644 GIT binary patch delta 4092 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 diff --git a/dist/core.phar b/dist/core.phar index 2448531b4516587e341761a07ddeb1d251155b35..3f755529737e689c5dbe535a412cea34f7a21354 100644 GIT binary patch delta 6605 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 delta 3669 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 C, StorageType, array{values: array}> * @implements \FireHub\Core\Support\DataStructure\Capability\Rebuildable * - * @phpstan-type StorageType = (Storage&Cloneable&StorageMetricsAware&DequeMutation&IndexAccess) + * @phpstan-type StorageType = (Storage&Cloneable&StorageMetricsAware&LinearBoundaryAccess&DequeMutation&IndexAccess&IndexMutation) */ final class Vector implements DataStructure, Collection, Linear, Copyable, Forkable, Snapshotable, Freezable, Rehydratable, Rebuildable, Countable { @@ -86,7 +88,7 @@ final class Vector implements DataStructure, Collection, Linear, Copyable, Forka * @return void */ public function __construct ( - protected Storage&Cloneable&StorageMetricsAware&DequeMutation&IndexAccess $storage + protected Storage&Cloneable&StorageMetricsAware&LinearBoundaryAccess&DequeMutation&IndexAccess&IndexMutation $storage ) { $this->state = new StructureState(); @@ -246,6 +248,294 @@ public function count ():int { } + /** + * ### Retrieve the first element + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Type\Maybe As return. + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\LinearBoundaryAccess::first() To retrieve the first + * element from the storage. + * + * @return \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe Maybe with first element + * of the structure, or Maybe with null if structure is empty. + */ + public function first ():Maybe { + + return $this->storage->first(); + + } + + /** + * ### Retrieve the last element + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Type\Maybe As return. + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\LinearBoundaryAccess::last() To retrieve the last + * element from the storage. + * + * @return \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe Maybe with last element + * of the structure, or Maybe with null if structure is empty. + */ + public function last ():Maybe { + + return $this->storage->last(); + + } + + /** + * ### Check Index Existence + * + * Determines whether a valid element exists at the given positional index. This operation does not retrieve the + * value and is optimized for fast boundary or presence checks within indexed structures. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\IndexAccess::get() To check if index exists. + * + * @param int $index

+ * The key to check for existence. + *

+ * + * @return bool True if the key exists, false otherwise. + */ + public function has (int $index):bool { + + return $this->storage->has($index); + + } + + /** + * ### Retrieve Value by Index + * + * Returns the value located at the specified positional index within the structure. If the index does not exist or + * is out of bounds, an empty Maybe is returned. This operation provides safe, read-only access to ordered structure + * without exposing internal structure or requiring direct array access. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Type\Maybe As return. + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\IndexAccess::get() Get Value by Index from storage. + * + * @param int $index

+ * The key to retrieve value by index. + *

+ * + * @return \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe Maybe with element at index + * position of the structure, or Maybe with null if element at index position of the storage doesn't exist. + */ + public function get (int $index):Maybe { + + return $this->storage->get($index); + + } + + /** + * ### Set Value at Index + * + * Assigns a value to the specified positional index in the structure. If the index already contains a value, it is + * overwritten according to the structure’s mutation semantics. This operation assumes a valid index-based + * addressing model and does not perform key resolution or structural lookup. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\MutationOutcome As return. + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\IndexMutation::set() To set Value at Index to + * storage. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::assertNotFrozen() To check if structure is + * frozen. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::detachIfNeeded() To performe a + * copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * @param int $index

+ * The key where the value will be added. + *

+ * @param TValue $value

+ * Value to add to the index. + *

+ * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * + * @return \FireHub\Core\Shared\Enums\MutationOutcome::CREATED|\FireHub\Core\Shared\Enums\MutationOutcome::UPDATED + * An enum indicating the result of the mutation operation. + */ + public function set (int $index, mixed $value):MutationOutcome { + + $this->assertNotFrozen(); + $this->detachIfNeeded(); + + return $this->storage->set($index, $value); + + } + + /** + * ### Remove Value by Index + * + * Removes the element located at the specified index. The behavior after removal depends on the structure + * implementation (e.g., shifting in lists, pulling in fixed structure, or logical repositioning in ring buffers). + * This operation affects structural layout but not value semantics directly. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\MutationOutcome As return. + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\IndexMutation::remove() To remove Value at Index to + * storage. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::assertNotFrozen() To check if structure is + * frozen. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::detachIfNeeded() To performe a + * copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * @param int $index

+ * The key of the value to remove. + *

+ * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * + * @return \FireHub\Core\Shared\Enums\MutationOutcome::REMOVED|\FireHub\Core\Shared\Enums\MutationOutcome::NOT_FOUND + * An enum indicating the result of the mutation operation. + */ + public function remove (int $index):MutationOutcome { + + $this->assertNotFrozen(); + $this->detachIfNeeded(); + + return $this->storage->remove($index); + + } + + /** + * ### Prepend values to the front + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\FrontInsertion::addFirst() To prepend values to + * the front of the storage. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::assertNotFrozen() To check if structure is + * frozen. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::detachIfNeeded() To performe a + * copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * @param TValue ...$values

+ * List of values to add to the front of the structure. + *

+ * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * + * @return static The modified structure. + */ + public function prepend (mixed ...$values):static { + + $this->assertNotFrozen(); + $this->detachIfNeeded(); + + $this->storage->addFirst(...$values); + + return $this; + + } + + /** + * ### Append values to the back + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\BackInsertion::addLast() To append values to + * the back of the storage. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::assertNotFrozen() To check if structure is + * frozen. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::detachIfNeeded() To performe a + * copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * @param TValue ...$values

+ * List of values to add to the back of the structure. + *

+ * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * + * @return static The modified structure. + */ + public function append (mixed ...$values):static { + + $this->assertNotFrozen(); + $this->detachIfNeeded(); + + $this->storage->addLast(...$values); + + return $this; + + } + + /** + * ### Removes values from the front + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\FrontRemoval::removeFirst() To remove values from + * the front of the storage. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::assertNotFrozen() To check if structure is + * frozen. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::detachIfNeeded() To performe a + * copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * @param int $items [optional]

+ * Number of values to remove from the front of the structure. + *

+ * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * + * @return static The modified structure. + */ + public function shift (int $items = 1):static { + + $this->assertNotFrozen(); + $this->detachIfNeeded(); + + $this->storage->removeFirst($items); + + return $this; + + } + + /** + * ### Removes values from the back + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\BackRemoval::removeLast() To remove values from + * the back of the storage. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::assertNotFrozen() To check if structure is + * frozen. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::detachIfNeeded() To performe a + * copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * @param int $items [optional]

+ * Number of values to remove from the back of the structure. + *

+ * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * + * @return static The modified structure. + */ + public function pop (int $items = 1):static { + + $this->assertNotFrozen(); + $this->detachIfNeeded(); + + $this->storage->removeLast($items); + + return $this; + + } + /** * @inheritDoc * diff --git a/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php b/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php index 5a386528..b8cac18d 100644 --- a/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php +++ b/src/support/datastructure/structure/snapshot/firehub.VectorSnapshot.php @@ -26,6 +26,12 @@ * * @method int count() Element Count Retrieval * @method Traversable iterate() Retrieve an external iterator + * @method \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe last () Retrieve the first + * element + * @method \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe first () Retrieve the last + * element + * @method bool has (int $index) Check Index Existence + * @method \FireHub\Core\Shared\Type\Maybe get (int $index) Retrieve Value by Index */ final readonly class VectorSnapshot extends Snapshot { @@ -56,7 +62,7 @@ public function __construct( */ protected function allowedMethods ():array { - return ['count', 'getIterator']; + return ['count', 'getIterator', 'first', 'last', 'has', 'get']; } From 0c6eb1d9447bf6b468e574d434c6a2bed75bd6ac Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 27 May 2026 12:30:40 +0200 Subject: [PATCH 71/79] Update CHANGELOG for v0.3.2 release with new features and fixes --- CHANGELOG.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76f02889..3539add9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.3.1...feature/support-high-level-api) +## [v0.3.2](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.3.1...v0.3.2) – 2026-05-27 ### Added - Introduce Data Transfer Object and Rehydratable capabilities for structured data management (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`1117c8b`](https://github.com/The-FireHub-Project/Core-Foundation/commit/1117c8b)) -- Add Rebuildable and Convertible capabilities to data structures (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`1117c8b`](https://github.com/The-FireHub-Project/Core-Foundation/commit/1117c8b)) +- Add Rebuildable and Convertible capabilities to data structures (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`cc098de`](https://github.com/The-FireHub-Project/Core-Foundation/commit/cc098de)) +- Enhance `Vector` capabilities with advanced index-based operations and PHP 8.1 support (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`a8db5c5`](https://github.com/The-FireHub-Project/Core-Foundation/commit/a8db5c5)) + +### Fixed +- Correct documentation and improve mutation outcome handling in BackInsertion and ArrListStorage (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`16353ce`](https://github.com/The-FireHub-Project/Core-Foundation/commit/16353ce)) ## [v0.3.1](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.3.0...v0.3.1) – 2026-05-25 From 377be90e0c318e10ccc5dc79695d8e908e5f0c82 Mon Sep 17 00:00:00 2001 From: Riddick Date: Wed, 27 May 2026 14:32:41 +0200 Subject: [PATCH 72/79] Replace `addFirst` with `addLast` in `Vector` initialization logic **Detailed Description:** - Updated `Vector` initialization to correctly use `BackInsertion::addLast` instead of `FrontInsertion::addFirst` for adding payload values to storage. - Modified relevant docblock in `firehub.Vector.php` to reflect the correct method usage. - Ensured consistency between the `Vector` initialization logic and its intended design for element insertion. **Key Benefits:** - Fixes incorrect method reference, ensuring proper functionality aligned with `BackInsertion` capability. - Improves documentation accuracy for better readability and developer understanding. - Updated PHAR builds (`core.phar` and `core.min.phar`) to integrate the corrected changes. --- dist/core.min.phar | Bin 261185 -> 261184 bytes dist/core.phar | Bin 831063 -> 831167 bytes .../structure/firehub.Vector.php | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/core.min.phar b/dist/core.min.phar index d8c7645c8bc818990aafd02cfbea6af5f02dc2bc..9ccaf4722b4d7277ef3ba11bf6b92cad5ed3dfdc 100644 GIT binary patch delta 2975 zcmYLKc~n#963-0~0wg4aumpr)G;FdYpa$8AK-dz3q7)GY3W^8ajFRA8HjvEnsT}-m~rsa;yvXXh0EhLHeweSD*Oq%(ZR)$nVVe&HQHhX6AN{3p&RI zwYS)ZFW24ir~gSV;R6s%_yQ~@A^^T3!T|0P(Ex624ZspMN(b19AiZQq0Zcbb0N7-P zD(B7SfaGe9n%U-Rkc{SN@XS0NB(()7I4A=>N$AW$I*i1V~HMC zSw`>=Ux0PnEI>y;36kMXB*Y*xg?M*Fh;Ao@ zdbrcurC~KXSuB=z6URjA>}8aRM@Tuf^a-u-n;q)Ki_rK>(Oj^4!9c7%QhjcZZU*ep zjgL438TZij9je&3o-~Pr$TMO`u)8Tn7GH;jAXPhL0Sr1U0ElsX4`7cYO20cU0x81@ zHNSJpM$Y4OOb!9YF*4UFf{K(7b{r!UUKusX%e*BE_n~F#%P@*)qZ!$7Y-4m zuZukpN4dNY(CCs0@YZDsz*1Lqdfs(0NZyl>bK4~3?4Oi}WY1}`!r7@Eq+TQ=qn){= zhdY;YHxeSwJR2<7Kity5`k5QkrS8~tJKg8O;RE+V0IhTdz>m_E07?&(j2@*Ri6*ZD z*f}{tGAaN<$0ER%m4iRG(iMeY1Zig{As5SBsbi-Ip70u*Q3I@A+jE!faGFYW`w(1G zD6=Cs$guLC%5Yll%4Pz){S<`cDWM=$O<^V?*NnxwAUQig)=lwooU0BfD=agA#|?P4 z{$(wF;W5FYMEY=q$3l)-U0|*{jDaS$mSdK$=QI0EyaF_o$yxSYKrr0w#AS^Crq$2!srCvlS(?ukw>oEmfQaHN=^4K7Fh zYcpx6pbV5b$*Bx_b%cCJeTxJf9NILZ%LmMS$4{y5f-P{?os6yBCTf zslsrP)P&7L&%e;>Id5!_LATIFwWl`BrtBMz@JXSQyE8G0}XLo1Qcw!H!4)H7ARHx<`x`UKBpv(kRUGLKJqEXEa7@ zh{is>6OHW=9>c`LrsHYZt~31At_HP$8vQT*3h?f9;ICuwE2CF4O`*nDu$+y9Rm#Av z*=5jUiLu21ZLzpQz2fpf+QGn!I5ba+N9RZ4adHG2gmMk8|C^fmU=Wb79AHlZn!jbF z;zXqGOGLNoB;4GGlS)9-H5tt-lb3=toLm5)PeIN0lzfofwOH2*E!qufRdDE`n*ora z!|n6AZWc&Ax@df+m2~ofLDvSz2Aw(yEoa5)kNsgfbqH|Zc*;iPb`0k%d~v>nb#|_)uUzkm}G)96xk@v*v7suM~3&V z$cQv{ZfmP*nXk>~r~KCZ+^G9$&L>x@ZtSacHR!CaP()dqqHOWjp^5?VL9#3OR)%ZC zhsPx?kCwk_5Bas`8=>g_uKjuZ!W^06`e6Jk0WWDVac5_@-$z^bvv?<&(XHgL=1@r1#@fQ|&zsd#YsLdV%&oidaCA%9#nw9A{CyEK+yc7> my0!Ib&(;Y?zq;0!9%|)re49{OrTdIUcMJW=VrkS`_5T5-Te~d) delta 2974 zcmYLKX;@Qd7S0VJf+Qq_gb+}cXdo=ImmoV45)iW>yMls<3sq5E;ZXt|6s-)Px6V}@ z1sq1~SS*!R)J_3gWYHP5J{>n&3tC)|0(GG(Q=NOxb=v&M`<(AP=RM1J&beJL1s7fl zYHzY<_w2hphyEum2oHcj!V_RA5dmIwE!#FD4k#@fb@(V1rTHw4^V1` zD!pb4L2~4vW;RC+QX>ZqMmZ@Usm)PyuX!9u*UeE=%#8(U5jPy*AQunsaCIPgOhXSF zr$z8)_t+H#5iC|iiQ)=bXeA>%-Z+vI(>S0uIV}Xh&q4*T+5(xHE#`qV%7DKm#D+Dq}`Im0K<|+05NtM0Eg{R`qgd;Na<44 z{6dyW5VZjc~OaklCnM{{DVbfJPrNZHTr&Rzt=XC&IITr!=yP(wQQV5dBbsIpH zYrO0i0T9|10P+e`x1XUa3cm=_#zsail{-?c=Lnwg3Y$>_+`aYM0NE*>OPl=e*+v>^}Ic zmcDY6t=VW;Rsgs4?*asD3`{8`g>DLJT?ZZ0*gHGG>FwqtWRjc0J~nq#E||qwFaZOa zIaD{%qzWNiCTxW3Tjp3tLZQZjNAOszzYLnIkX+|O@W?U+4(cui4pqMbR}9w;$4~1P zhE^;ti}l#qh6j!*gCAkRJt9Kd3vMt=``vM@Bi(TlOWko#bh+cyaFpRl@rE|I9QAcM zX{}W9m~uF{B1f4Lw@i;R0Lu4TiG7mpfz8wIfvx21iJiXD6PxxD}Q?{+8Z-S}Hd4xT83~$IBe+<6MAA@%cz{E-!7z#)SC!v9uCKZ^8 zP9R9v=BVtbs`-RO2&I9b z0QIwnKOh?eL#WOnx;ns3d+d4-9m|554Kzfb_Wtd953o=Z3kWaai+2owwQY^pNn=PD z)uJQBTqps};IG28_NkC)M1@7ugfQC&iV+n)b`>+AqasH_q?j5cAzrPW#DM%B5gclJ z5+V41R7>XKI_aFtED-Q??pvp|n42)rmU4SS*bA9D*cAX~pSTc*R6joXBe%Pu7?LUs z7fE$kDti8&R?qp(x)r*GE~+h6l148@NSsb4GCUuZEa|<$4{MwJUFlN#A4+e+u{Eh9XgVgMd0FC0kRB)I0~i;e=Gg_yL2}YzU3civ?x9Wvhc5c}0Mhli zeGcg7f^C+{0@bHHOL>1JPb%U`ym?n$<;> z$2YLsk8d!m-fg<*{=Kc|B~jdI$GFnG1-d!CHJ!J@@BVj;&^^*RN;jNeCAt0GiiM_Y z{TY4LQ<>XOr6^u@b55j*6X!OZ=u#b#d%s`NeY;NP|D_}#`sdhw|36mGCXiU(Ft^uMIhPen@$& zto+5<&j%LA-`?-toOYmTeSBBqnZGOhzWvbpRR5;@Eh}Q$$`vZgbeb~2Jih>Jv9wPEzGzY(Ve);JMV&xu9 zq%8Xz`M;E#t;_1R7B?Kt$qU(7eux__a=p9Us1*DEbUn4{X;OK^L*l}zZC_@!J`i5y zdhZ(JH!bf792aLf`<#4Le|JmUr^T)8;u!ly^2&r;D(Ba=Q4=d%)|sB}Z+PIv8Tm+R zxy`lV*9>R&zVVbhnzG;@YC?J}zFK$xmzwjsvl;SD!P?mk0us66k1WS48jiz3ar<7ZR@GO13X4d>5zZG5`ZuXuQK k1$&&o?yv172g;vQ{S|S?gp0<$C}GjfLVvMXTD4C7KLaZ=t^fc4 diff --git a/dist/core.phar b/dist/core.phar index 3f755529737e689c5dbe535a412cea34f7a21354..8cac66c1f8ecf4a38496011f2847e5074a290433 100644 GIT binary patch delta 3094 zcmY*b2~<;A5)D7ehd_XYgs{rmfrNdJvIPQ$9pZ|jY%Yx=t_a%Nf@4pMjE@6 zh`8?~_UMS(fI7IL2qDw!Me}KNGTZ&RvH-!@B@j?$7B*%N`1_buOB8n z+$zgmt3UjbHC zAix4H2_j){On|3}FvOH)hVkI+HpCDoBMg~uguKH>;jlMglmZYeL_(<$)BYs%1?NYh zH-M`#7LjF)S6XGP1!tdeGJwhitzwhuV0D_{)p(lX?fu0R6E&MAz@C{1iM`EyC!#kz6q;VmwUT3QLr_Yl&ocD`b^g z%|KSUfWvVw+ZaL(nTOHGXu_1-$kfKL)Yfw$$pPz`0Ato)1LW9X=Ib_@U@2@-_Yag%^LIF9XGJ8Z)(cGJN5!fpXT zlKm2Zf7!19@O40|+F>bJW{#@?wm8OGy+{N>SuWuAXJ_or>v8a37$p{4QJGFQbX+P| zD9RVIVSv24#rjmE#aHyb1BAOMn<*3o0I59V4r-4RHdVJ%5af_JBP2KngH__pzLat? zhf{FxY7n)}SxJ}G6Qt;SV^#+6$HgmeFgq?*dHE@Ga-mb)6WCqAoP9rip+qindQUo2 zSoiNdz=~?KR%()q+%h_QWj4_Comm>7+BJ5F5tY+}8C*lM&<1uWJ-G&N+g{7Co9Gp& z8=u7$QtRdTXgA97f!&nj&>>y$DaN>jAS;9siLHIlft)5u*((=7&bsNSeANYRVY@57 z@^Dvtm_@EQJg&InBjPDS+1^RzaAsfdOr}f}3gHwDXv7~xjr9r~JuM19xVvEm_DQM| zo2NmEtz_?p?Vj(3oqgLa9U?v4vjNK7kud0vghUT)!FrEbnDq?7;beIGdr>|Sa@wbW zE2eK;ASC1g#?4UEJ+nZe(Gz8@yx1<^%WNiHo5!PiV=SmDKNCvlZA_i?vWC!BFKk6e zZ|vfA-V4Fm?~SiS>oXg3o@V%^-|hKK>3meQwvn(9)nYnXF5u3rX&KB;5dEf+uq5kn zhsyHB;;;B(@iu;Vup$|}_xg}aY4QgTYdW@Cj0>&O*+d)}c zCS+gy&U?QLSkuRD5@HdY6P^U%C9_%~r5hhYS*R>Qz*mI_+NMICUsQNq+VSl0sbL6P zJJRg1cBtphcCJLk)-KBh^mi)OKt1$HiYp=Etc+&H1RNxd6WGyllJRa2@Abo?ME(+5 zeUGsGzpMUtj5ZKeX3_ssc^Zr*sX}myYz>))*SU!iYit@Kpih|Vl+ZVKGcys+%_I&F zosU8H8M833`EP#)ooXlk3>po^rc4jR&-BkQ9Oy>j2(!c4ETFgFHToEK ze6`(d8lf7$T8lb(W&(MCxkOu!ODG! z#9tVlhV2Cneggd{d{0YR=!{whA1f|851=6$ho|erIbdyOVQ3=Kh z7@YbYG58be6}t#{m9a=4W39Y6lztqCX*KaUvya6uhDe(Pq_0oN0c#*(K7cL}BQGS* z1IsQ6FLhlK^7@ig;B-h11V~NBp;M7O0jzt;5%`U6GCyOdOM)D!s$@GVI7JM5NhvUp zzAH;9DNE5~7Qrkovv>_vi=!h1+lBJ6Pu$Vz zC{yRV))$++J>A*6_FYiH&-}YvHdseByty^O{jb;BPX*Yl+B9HU@Z0OizBGy8fgvqEuMR(tom6a5QRLy1d%LqxcdMLVlf5Exl4VO;`nG9ZO$EZ!KMp){uX^XS zTs>;2-kwM1RfWv#dOi8WqP;q0eQW0B@GJQVgW9!2n&t&PyDG_vywb^asRJ_#<~^$w zPq*5!YR&Y5oK97bXK}RP?Xpe$4a2dwMt?q3UNyJoqd{MfVh%B?S6poW&0?q2R)u43 zoBV$Ky7J)@1BT7^?*-@HQ11^ef7O=OHcpzjD)e%9{AkS4)vq%O+TS{ML>~E^CHRt0 z-kv-4`M$G{#KDU`3F1RyUr7gLJ_RZ1S8e>}JId~h`cJvE`F|PN>~W%~vOD0+xA%Jk ly2cs28nMwlcA2Vc-}uzJM07~1F5)on)QtHnBu0~@`7ig*=sN%a delta 3081 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 diff --git a/src/support/datastructure/structure/firehub.Vector.php b/src/support/datastructure/structure/firehub.Vector.php index e9b4e395..837d0346 100644 --- a/src/support/datastructure/structure/firehub.Vector.php +++ b/src/support/datastructure/structure/firehub.Vector.php @@ -188,7 +188,7 @@ public function dehydrate ():DehydratedState { * * @since 1.0.0 * - * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\FrontInsertion::addFirst() To add the first element + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\BackInsertion::addLast() To add the last element * to the storage. * * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException If the data @@ -201,7 +201,7 @@ public static function hydrate (DehydratedState $state):static { $storage = new $state->header->storage(); - $storage->addFirst(...$state->payload['values']); + $storage->addLast(...$state->payload['values']); return new self($storage); From 15b5c3afdcedb8ba8ebd1cf60ce75eb3f2f2c4df Mon Sep 17 00:00:00 2001 From: Riddick Date: Thu, 28 May 2026 08:36:16 +0200 Subject: [PATCH 73/79] Add `Map` and `Associative` data structures with advanced capabilities **Detailed Description:** 1. **Introduced `Map` Data Structure:** - Implemented `Map`, a key-value associative data structure enabling efficient key-based operations like `get`, `set`, `has`, `remove`, and `replace`. - Designed with support for advanced capabilities: - Copy-on-write state handling via `HasCopyOnWriteState`. - Immutability control through `HasFreezeState`. - Snapshot creation for immutable state projections with `snapshot()`. - Serialization and deserialization operations using `hydrate` and `dehydrate`. 2. **Added `Associative` Interface:** - Created a logically distinct `Associative` type, representing data structures indexed via explicit keys instead of positional indices. - Ensures semantic capabilities for key-driven lookups and mappings. 3. **Enhanced Snapshot Functionality:** - Introduced `MapSnapshot` class for read-only, immutable versions of `Map` containing delegated access to core methods like `count`, `has`, and `get`. 4. **Extended `Vector` Capabilities:** - Added new methods (`replace`, `delete`) to ensure flexibility for index-specific mutations. 5. **Autoload and Builds:** - Updated `classmap.php` and `firehub.CompiledClassmap.php` for seamless class autoloading of newly introduced components. - Revised PHAR builds (`core.phar` and `core.min.phar`) to integrate new data structures and enhanced functionality. **Key Benefits:** - Introduces highly flexible, key-oriented `Map` data structures with advanced runtime safety features. - Extends the framework's abstraction capabilities with `Associative` for semantic richness. - Improves structural immutability with robust snapshot capabilities. - Updates PHAR for consistent developer experience with prepackaged dependencies. --- dist/core.min.phar | Bin 261184 -> 267204 bytes dist/core.phar | Bin 831167 -> 855938 bytes src/support/autoload/classmap.php | 3 + .../loader/firehub.CompiledClassmap.php | 12 + .../datastructure/structure/firehub.Map.php | 499 ++++++++++++++++++ .../structure/firehub.Vector.php | 79 ++- .../snapshot/firehub.MapSnapshot.php | 79 +++ .../type/firehub.Associative.php | 29 + 8 files changed, 699 insertions(+), 2 deletions(-) create mode 100644 src/support/datastructure/structure/firehub.Map.php create mode 100644 src/support/datastructure/structure/snapshot/firehub.MapSnapshot.php create mode 100644 src/support/datastructure/type/firehub.Associative.php diff --git a/dist/core.min.phar b/dist/core.min.phar index 9ccaf4722b4d7277ef3ba11bf6b92cad5ed3dfdc..07198dd916139a7c6df0edf81ea07be78525e897 100644 GIT binary patch delta 4639 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 VQ+cFfr40Y*;*NiQFU&8>{}-A+VL$)? delta 3273 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 diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index 51a8b27d..d5da6107 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -129,9 +129,12 @@ \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrRangeInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php', \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\GeneratorCallbackInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php', \FireHub\Core\Support\DataStructure\Storage\Node::class => __DIR__.'/../../support/datastructure/storage/firehub.Node.php', + \FireHub\Core\Support\DataStructure\Structure\Map::class => __DIR__.'/../../support/datastructure/structure/firehub.Map.php', + \FireHub\Core\Support\DataStructure\Structure\Snapshot\MapSnapshot::class => __DIR__.'/../../support/datastructure/structure/snapshot/firehub.MapSnapshot.php', \FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot::class => __DIR__.'/../../support/datastructure/structure/snapshot/firehub.Snapshot.php', \FireHub\Core\Support\DataStructure\Structure\Snapshot\VectorSnapshot::class => __DIR__.'/../../support/datastructure/structure/snapshot/firehub.VectorSnapshot.php', \FireHub\Core\Support\DataStructure\Structure\Vector::class => __DIR__.'/../../support/datastructure/structure/firehub.Vector.php', + \FireHub\Core\Support\DataStructure\Type\Associative::class => __DIR__.'/../../support/datastructure/type/firehub.Associative.php', \FireHub\Core\Support\DataStructure\Type\Linear::class => __DIR__.'/../../support/datastructure/type/firehub.Linear.php', \FireHub\Core\Support\LowLevel::class => __DIR__.'/../../support/firehub.LowLevel.php', \FireHub\Core\Support\LowLevel\Arr::class => __DIR__.'/../../support/lowlevel/firehub.Arr.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 1f88a22b..14c3eb31 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -448,6 +448,14 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/storage/firehub.Node.php'; return; + case \FireHub\Core\Support\DataStructure\Structure\Map::class: + require __DIR__.'/../../../support/datastructure/structure/firehub.Map.php'; + return; + + case \FireHub\Core\Support\DataStructure\Structure\Snapshot\MapSnapshot::class: + require __DIR__.'/../../../support/datastructure/structure/snapshot/firehub.MapSnapshot.php'; + return; + case \FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot::class: require __DIR__.'/../../../support/datastructure/structure/snapshot/firehub.Snapshot.php'; return; @@ -460,6 +468,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/structure/firehub.Vector.php'; return; + case \FireHub\Core\Support\DataStructure\Type\Associative::class: + require __DIR__.'/../../../support/datastructure/type/firehub.Associative.php'; + return; + case \FireHub\Core\Support\DataStructure\Type\Linear::class: require __DIR__.'/../../../support/datastructure/type/firehub.Linear.php'; return; diff --git a/src/support/datastructure/structure/firehub.Map.php b/src/support/datastructure/structure/firehub.Map.php new file mode 100644 index 00000000..48bb0dd7 --- /dev/null +++ b/src/support/datastructure/structure/firehub.Map.php @@ -0,0 +1,499 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.1 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Structure; + +use FireHub\Core\Support\Contracts\DataStructure; +use FireHub\Core\Support\DataStructure\Structure\Snapshot\MapSnapshot; +use FireHub\Core\Support\DataStructure\Abstraction\Collection; +use FireHub\Core\Support\DataStructure\Type\Associative; +use FireHub\Core\Support\DataStructure\Capability\ { + Copyable, Countable, Forkable, Freezable, Rebuildable, Rehydratable, Snapshotable +}; +use FireHub\Core\Support\DataStructure\Runtime\ { + HasCopyOnWriteState, HasFreezeState, StructureState +}; +use FireHub\Core\Support\DataStructure\DTO\ { + DehydratedState, StateHeader +}; +use FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Support\DataStructure\Storage\Capability\ { + Cloneable, KeyAccess, KeyMutation, StorageMetricsAware +}; +use FireHub\Core\Shared\Type\Maybe; +use FireHub\Core\Shared\Enums\MutationOutcome; +use FireHub\Core\Throwable\Exception\Support\DataStructure\ { + InvalidDataStructureException, InvalidKeyException, InvalidStorageException +}; +use FireHub\Core\Support\LowLevel\ClsObj; +use Traversable; + +/** + * ### Map — Key-Value Associative Data Structure + * + * A map is an associative data structure that stores values indexed by unique keys. + * It provides fast lookup, insertion, and deletion by key rather than position. + * + * Unlike linear collections (Vector, List), Map does not expose positional ordering semantics as its primary model + * but may optionally preserve insertion order depending on implementation. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @implements \FireHub\Core\Support\Contracts\DataStructure + * @implements \FireHub\Core\Support\DataStructure\Abstraction\Collection + * @implements \FireHub\Core\Support\DataStructure\Type\Associative + * @implements \FireHub\Core\Support\DataStructure\Capability\Snapshotable + * @implements \FireHub\Core\Support\DataStructure\Capability\Rehydratable, StorageType, array{entries: array}> + * @implements \FireHub\Core\Support\DataStructure\Capability\Rebuildable + * + * @phpstan-type StorageType = (Storage&Cloneable&StorageMetricsAware&KeyAccess&KeyMutation) + */ +final class Map implements DataStructure, Collection, Associative, Copyable, Forkable, Snapshotable, Freezable, + Rehydratable, Rebuildable, Countable { + + /** + * ### Copy-On-Write State Management + * @since 1.0.0 + */ + use HasCopyOnWriteState; + + /** + * ### Mutation Freeze Control + * @since 1.0.0 + */ + use HasFreezeState; + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage As parameter. + * + * @param StorageType $storage

+ * The storage backend for the data structure. + *

+ * + * @return void + */ + public function __construct ( + protected Storage&Cloneable&StorageMetricsAware&KeyAccess&KeyMutation $storage + ) { + + $this->state = new StructureState(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function copy ():static { + + $copy = new self($this->storage->copy()); + + $copy->frozen = $this->frozen; + + return $copy; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::increaseRef() To increse shared + * ownership reference. + */ + public function fork ():static { + + $this->increaseRef(); + + return clone $this; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @return \FireHub\Core\Support\DataStructure\Structure\Snapshot\MapSnapshot Immutable snapshot of + * current state. + */ + public function snapshot ():MapSnapshot { + + $copy = new self($this->storage->copy()); + + $copy->frozen = true; + + return new MapSnapshot($copy); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::detachIfNeeded() To performe a + * copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + */ + public function freeze ():void { + + $this->detachIfNeeded(); + + $this->frozen = true; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function dehydrate ():DehydratedState { + + $entries = []; + + foreach ($this as $key => $value) + $entries[$key] = $value; + + /** @var DehydratedState, StorageType, array{entries: array}> */ + return new DehydratedState( + new StateHeader(1, self::class, $this->storage::class), + ['entries' => $entries] + ); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\KeyMutation::set() To set the value of a key. + * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException If the data + * structure is not of the expected type + */ + public static function hydrate (DehydratedState $state):static { + + if ($state->header->structure !== self::class) + throw new InvalidDataStructureException; + + $storage = new $state->header->storage(); + + foreach ($state->payload['entries'] as $key => $value) $storage->set($key, $value); + + return new self($storage); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\ClsObj::ofClass() To check if storage has Convertible interface. + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\Convertible::fromStorage() To create a new + * instance of the storage. + * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidStorageException If the storage is not + * convertible. + */ + public function rebuild (string $storage):static { + + $new_storage = ClsObj::ofClass($storage, Storage\Capability\Convertible::class) + ? $storage::fromStorage($this->storage) + : throw InvalidStorageException::builder() + ->withContext( + ['storage' => $storage] + ) + ->build(); + + return new self($new_storage); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\StorageMetricsAware::size() To retrieve the number + * of elements in the storage. + */ + public function count ():int { + + return $this->storage->size(); + + } + + /** + * ### Check Key Existence + * + * Determines whether a value exists for the specified key in the structure. Provides a fast existence check + * without retrieving the underlying value, enabling safe conditional access patterns. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\KeyAccess::has() To check Key Existence in the + * storage. + * + * @param TKey $key

+ * The key to check for existence. + *

+ * + * @return bool True if the key exists, false otherwise. + */ + public function has (int|string $key):bool { + + return $this->storage->has($key); + + } + + /** + * ### Retrieve Value by Key + * + * Retrieves the value associated with the given key from an associative structure. If the key does not exist, an + * empty Maybe is returned instead of null, ensuring explicit handling of missing entries. This operation + * does not modify the structure and is designed for safe, read-only access to key-based data mappings such as + * dictionaries, maps, and registries. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Type\Maybe As return. + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\KeyAccess::get() To retrieve Value by Key in the + * storage. + * + * @param TKey $key

+ * The key to retrieve value by key. + *

+ * + * @return \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe Maybe with element at key + * position of the structure, or Maybe with null if element at key position of the structure doesn't exist. + */ + public function get (int|string $key):Maybe { + + return $this->storage->get($key); + + } + + /** + * ### Set Value by Key + * + * AAssigns a value to the specified key in the associative storage. If the key already exists, the existing + * value is overwritten. If it does not exist, a new entry is created. This operation is fundamental for + * key-value-based structures and does not involve positional logic or traversal. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\MutationOutcome As return. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::assertNotFrozen() To check if structure is + * frozen. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::detachIfNeeded() To performe a + * copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * @param TKey $key

+ * The key where the value will be added. + *

+ * @param TValue $value

+ * Value to add to the key. + *

+ * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * + * @return \FireHub\Core\Shared\Enums\MutationOutcome::CREATED|\FireHub\Core\Shared\Enums\MutationOutcome::UPDATED + * An enum indicating the result of the mutation operation. + */ + public function set (int|string $key, mixed $value):MutationOutcome { + + $this->assertNotFrozen(); + $this->detachIfNeeded(); + + return $this->storage->set($key, $value); + + } + + /** + * ### Set Value by Key if exists + * + * AAssigns a value to the specified key in the associative storage. If the key already exists, the existing + * value is overwritten. If it does not exist, a new entry is created. This operation is fundamental for + * key-value-based structures and does not involve positional logic or traversal. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Structure\Map::has() To check if value exists. + * @uses \FireHub\Core\Support\DataStructure\Structure\Map::set() To set Value at Key. + * + * @param TKey $key

+ * The key where the value will be added. + *

+ * @param TValue $value

+ * Value to add to the key. + *

+ * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException If the value does not exist. + * + * @return void + */ + public function replace (int|string $key, mixed $value):void { + + $this->has($key) + ? $this->set($key, $value) + : throw InvalidKeyException::builder() + ->withContext([ + 'key' => $key + ]) + ->build(); + + } + + /** + * ### Set Value by Key if key doesn't exist + * + * AAssigns a value to the specified key in the associative storage. If the key already exists, the existing + * value is overwritten. If it does not exist, a new entry is created. This operation is fundamental for + * key-value-based structures and does not involve positional logic or traversal. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Structure\Map::has() To check if value exists. + * @uses \FireHub\Core\Support\DataStructure\Structure\Map::set() To set Value at Key. + * + * @param TKey $key

+ * The key where the value will be added. + *

+ * @param TValue $value

+ * Value to add to the key. + *

+ * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException If the value does not exist. + * + * @return void + */ + public function add (int|string $key, mixed $value):void { + + !$this->has($key) + ? $this->set($key, $value) + : throw InvalidKeyException::builder() + ->withContext([ + 'key' => $key + ]) + ->build(); + + } + + /** + * ### Remove Value by Key + * + * Removes the entry associated with the specified key from the storage. If the key does not exist, the operation + * has no effect. This mutation affects only the associative mapping layer and does not depend on element ordering + * or structural position. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\MutationOutcome As return. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::assertNotFrozen() To check if structure is + * frozen. + * @uses \FireHub\Core\Support\DataStructure\Runtime\HasCopyOnWriteState::detachIfNeeded() To performe a + * copy-on-write operation if the current storage is shared between multiple data structure instances. + * + * @param TKey $key

+ * The key of the value to remove. + *

+ * + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * + * @return \FireHub\Core\Shared\Enums\MutationOutcome::REMOVED|\FireHub\Core\Shared\Enums\MutationOutcome::NOT_FOUND + * An enum indicating the result of the mutation operation. + */ + public function remove (int|string $key):MutationOutcome { + + $this->assertNotFrozen(); + $this->detachIfNeeded(); + + return $this->storage->remove($key); + + } + + /** + * ### Remove Value by Key if exists + * + * Removes the entry associated with the specified key from the storage. If the key does not exist, the operation + * has no effect. This mutation affects only the associative mapping layer and does not depend on element ordering + * or structural position. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Structure\Vector::has() To check if value exists. + * @uses \FireHub\Core\Support\DataStructure\Structure\Vector::remove() To remove Value at Index. + * + * @param TKey $key

+ * The key of the value to remove. + *

+ * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException If the value does not exist. + * + * @return void + */ + public function delete (int|string $key):void { + + $this->has($key) + ? $this->remove($key) + : throw InvalidKeyException::builder() + ->withContext([ + 'key' => $key + ]) + ->build(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage::iterate() To retrieve an iterable of the elements in the + * storage. + */ + public function getIterator ():Traversable { + + yield from $this->storage->iterate(); + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/structure/firehub.Vector.php b/src/support/datastructure/structure/firehub.Vector.php index 837d0346..175bba11 100644 --- a/src/support/datastructure/structure/firehub.Vector.php +++ b/src/support/datastructure/structure/firehub.Vector.php @@ -33,7 +33,7 @@ use FireHub\Core\Shared\Type\Maybe; use FireHub\Core\Shared\Enums\MutationOutcome; use FireHub\Core\Throwable\Exception\Support\DataStructure\ { - InvalidDataStructureException, InvalidStorageException + InvalidDataStructureException, InvalidKeyException, InvalidStorageException }; use FireHub\Core\Support\LowLevel\ClsObj; use Traversable; @@ -58,7 +58,7 @@ * @implements \FireHub\Core\Support\DataStructure\Capability\Rehydratable, StorageType, array{values: array}> * @implements \FireHub\Core\Support\DataStructure\Capability\Rebuildable * - * @phpstan-type StorageType = (Storage&Cloneable&StorageMetricsAware&LinearBoundaryAccess&DequeMutation&IndexAccess&IndexMutation) + * @phpstan-type StorageType = (Storage&Cloneable&StorageMetricsAware&LinearBoundaryAccess&DequeMutation&IndexAccess&IndexMutation) */ final class Vector implements DataStructure, Collection, Linear, Copyable, Forkable, Snapshotable, Freezable, Rehydratable, Rebuildable, Countable { @@ -367,6 +367,45 @@ public function set (int $index, mixed $value):MutationOutcome { } + /** + * ### Set Value at Index if exists + * + * Assigns a value to the specified positional index in the structure. If the index already contains a value, it is + * overwritten according to the structure’s mutation semantics. This operation assumes a valid index-based + * addressing model and does not perform key resolution or structural lookup. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Structure\Vector::has() To check if index exists. + * @uses \FireHub\Core\Support\DataStructure\Structure\Vector::set() To set Value at Index. + * + * @param int $index

+ * The key where the value will be added. + *

+ * @param TValue $value

+ * Value to add to the index. + *

+ * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException If the value does not exist. + * + * @return void + */ + public function replace (int $index, mixed $value):void { + + $this->has($index) + ? $this->set($index, $value) + : throw InvalidKeyException::builder() + ->withContext([ + 'index' => $index + ]) + ->build(); + + } + /** * ### Remove Value by Index * @@ -404,6 +443,42 @@ public function remove (int $index):MutationOutcome { } + /** + * ### Remove Value by Index if exists + * + * Removes the element located at the specified index. The behavior after removal depends on the structure + * implementation (e.g., shifting in lists, pulling in fixed structure, or logical repositioning in ring buffers). + * This operation affects structural layout but not value semantics directly. + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Structure\Vector::has() To check if index exists. + * @uses \FireHub\Core\Support\DataStructure\Structure\Vector::remove() To remove Value at Index. + * + * @param int $index

+ * The key of the value to remove. + *

+ * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\FrozenDataStructureException If the structure is + * frozen. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException If the reference counter + * drops bellow 1. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException If the value does not exist. + * + * @return void + */ + public function delete (int $index):void { + + $this->has($index) + ? $this->remove($index) + : throw InvalidKeyException::builder() + ->withContext([ + 'index' => $index + ]) + ->build(); + + } + /** * ### Prepend values to the front * @since 1.0.0 diff --git a/src/support/datastructure/structure/snapshot/firehub.MapSnapshot.php b/src/support/datastructure/structure/snapshot/firehub.MapSnapshot.php new file mode 100644 index 00000000..4e3b8af7 --- /dev/null +++ b/src/support/datastructure/structure/snapshot/firehub.MapSnapshot.php @@ -0,0 +1,79 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Structure\Snapshot; + +use FireHub\Core\Support\DataStructure\Structure\Map; +use Traversable; + +/** + * ### Map Snapshot + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @extends \FireHub\Core\Support\DataStructure\Structure\Snapshot\Snapshot + * + * @method int count() Element Count Retrieval + * @method Traversable iterate() Retrieve an external iterator + * @method bool has (int|string $key) Check Key Existence + * @method \FireHub\Core\Shared\Type\Maybe get (int|string $key) Retrieve Value by Key + */ +final readonly class MapSnapshot extends Snapshot { + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Structure\Vector As parameter. + * + * @param \FireHub\Core\Support\DataStructure\Structure\Map $structure

+ * The map to be encapsulated by the snapshot. + *

+ * + * @return void + */ + public function __construct( + Map $structure + ) { + + parent::__construct($structure); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + protected function allowedMethods ():array { + + return ['count', 'getIterator', 'has', 'get']; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + protected function methodAliases ():array { + + return [ + 'iterate' => 'getIterator' + ]; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/type/firehub.Associative.php b/src/support/datastructure/type/firehub.Associative.php new file mode 100644 index 00000000..ec4c04b2 --- /dev/null +++ b/src/support/datastructure/type/firehub.Associative.php @@ -0,0 +1,29 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 7.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Type; + +/** + * ### Associative Data Structure Type + * + * Represents a key-addressable data structure where values are associated with explicit logical keys instead of + * positional indexes. + * + * Associative structures provide deterministic key-to-value relationships and are optimized for semantic lookup, + * mapping, and keyed access operations rather than sequential traversal semantics. + * @since 1.0.0 + * + * @template TKey + * @template TValue + */ +interface Associative {} \ No newline at end of file From 0c8970b1092784a99bd9797a56dcc191e333c451 Mon Sep 17 00:00:00 2001 From: Riddick Date: Thu, 28 May 2026 13:12:59 +0200 Subject: [PATCH 74/79] **Replace `ArrMapStorage` with new `HashStorage` abstraction; introduce pluggable `HashEngine` and remove outdated array-based initializers** **Detailed Description:** 1. **Migration to `HashStorage`:** - Removed the legacy `ArrMapStorage` implementation and replaced it with `HashStorage`, a new key-value abstraction leveraging a pluggable hash engine for implementation flexibility. - `HashStorage` decouples storage APIs from internal logic, enabling runtime adaptability with interchangeable hash engines. 2. **New Components Introduced:** - **`HashEngine` Interface**: Defined the contract for hash-based storage engines. - **`ArrHashEngine`**: Added a PHP array-backed implementation of `HashEngine` for fast and memory-resident key-value management. - **`InvalidEngineException`**: Introduced an exception for invalid engine handling during runtime assignments. 3. **Changes to Initializers:** - Replaced array-specific `ArrStorageInitializer` and related strategies (`ArrCallbackInitializer`, `ArrFillInitializer`, etc.) with their generic `ListStorageInitializer` counterparts to align with broader list-based operations. 4. **Updated Classmap Configuration:** - Modified `classmap.php` and `firehub.CompiledClassmap.php` to reflect the removal of old structures and the addition of new components (`HashStorage`, `ArrHashEngine`, etc.). 5. **Deprecations and Cleanup:** - Removed outdated components: - `ArrMapStorage` - `ArrStorageInitializer` - Refactored relevant docblocks and file paths to improve consistency. **Key Benefits:** - Enhances modularity and scalability with runtime engine pluggability. - Simplifies the framework by removing tightly coupled array-based initializers. - Introduces a unified abstraction (`HashStorage`) for key-value structures with dynamic behaviors. - Improves long-term maintainability by migrating to a flexible, engine-driven architecture. --- dist/core.min.phar | Bin 267204 -> 269999 bytes dist/core.phar | Bin 855938 -> 865575 bytes src/support/autoload/classmap.php | 15 +- .../loader/firehub.CompiledClassmap.php | 48 ++-- .../storage/engine/firehub.ArrHashEngine.php | 129 ++++++++++ .../storage/firehub.ArrMapStorage.php | 237 ------------------ .../storage/firehub.HashEngine.php | 123 +++++++++ .../storage/firehub.HashStorage.php | 227 +++++++++++++++++ ...istStorage.php => firehub.ListStorage.php} | 22 +- ...php => firehub.ListStorageInitializer.php} | 6 +- ...hp => firehub.ListCallbackInitializer.php} | 8 +- ...er.php => firehub.ListFillInitializer.php} | 6 +- ...r.php => firehub.ListRangeInitializer.php} | 6 +- .../firehub.InvalidEngineException.php | 31 +++ 14 files changed, 573 insertions(+), 285 deletions(-) create mode 100644 src/support/datastructure/storage/engine/firehub.ArrHashEngine.php delete mode 100644 src/support/datastructure/storage/firehub.ArrMapStorage.php create mode 100644 src/support/datastructure/storage/firehub.HashEngine.php create mode 100644 src/support/datastructure/storage/firehub.HashStorage.php rename src/support/datastructure/storage/{firehub.ArrListStorage.php => firehub.ListStorage.php} (89%) rename src/support/datastructure/storage/initialization/{firehub.ArrStorageInitializer.php => firehub.ListStorageInitializer.php} (89%) rename src/support/datastructure/storage/initialization/strategy/{firehub.ArrCallbackInitializer.php => firehub.ListCallbackInitializer.php} (80%) rename src/support/datastructure/storage/initialization/strategy/{firehub.ArrFillInitializer.php => firehub.ListFillInitializer.php} (90%) rename src/support/datastructure/storage/initialization/strategy/{firehub.ArrRangeInitializer.php => firehub.ListRangeInitializer.php} (93%) create mode 100644 src/throwable/exception/support/datastructure/firehub.InvalidEngineException.php diff --git a/dist/core.min.phar b/dist/core.min.phar index 07198dd916139a7c6df0edf81ea07be78525e897..58e5fac38995a1bd596b8b47263104acfea61692 100644 GIT binary patch delta 5413 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 sUPaLsiEU@Fc5ckNHK)EAU0d%VyKO3L*s>(wh delta 4585 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 diff --git a/dist/core.phar b/dist/core.phar index e60fd6bdf7107fb805d6cbb687f078b67b0586d6..1af25c374f64200b0b30ce71d4a24c8726769fc6 100644 GIT binary patch delta 7445 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 delta 5361 zcmZ8l2~<;88cyEJO#%r?*g>{{Y_jhvO4va_ARsEM5<-9=B#;D@Dxy|&v}!3&xmvV> z7OP!Qr?shVtzgyTSX%9j>o}glc5JoOq8+!H>M-}+8?csh-ud|N{r>g-cY$|)idnZe zrmF}jlpM~ZH%eC1W4D~&_BW5NGu){ zreOJ=Fa=w=WOFj6afsllK(gf-PQ{Rd63rE0YzA)c^GVimisN#@DcB%&_s zENt%|)`T`)glSBTh-Ch*C;`v^B+A1$M@;lKi%EQ^#SwV?i8u^npiPu4Xd8B2&tiE# zKb@(!iN=$CHt87e*ksAnUl9_EUx|D7G076LhHE4XG3lCw)H+N`)?}TOM08e~jpyxU zB;ryTnIDvq2q$Fuc)q|^i7PaN$KmLE3;9f+rw=2ybAWxZv`8RAqilH|*%Ef99kJ4D zSBSOm+ZAH%F~my?iu@PWZnB?_CwuHk2;bY25P}>QVe*hQhvWa~%{$DfLlpCcgA*oS zbs(059m}x1$*~mU4~`{R=|h^sv2WkHhspN{g32V?9!k0?8^H)50q%Ax!Stt26&Q=1 ziJ6a`%dz@tq}~^NjmM~*6PPj=M@%xh5FZy^h;oQ4QQGXf7%O#IaX7)RZs?Q_#_b)*X{jWHc6i}?eCB18QO-1KZNu(sw;M`PA1WZ97Jn^p5poGc!1G@V0J{%~&%Z6yoNAu}x2zV+pA%wT{YO#FZn%Whb7 zSlrQX_Z8C|;3rK}nN+Mn!E~&~sQk&<(dVCx^Y+R>M6VI_;T(XUN9ji3QjReQyy!{V3ID}l4sg9i-SVSyV23oG5 zKypyu3?v7q#|%>Wr8CI!wSNYgzhyzMAaZ4Bf+BJGb_J20^*E>kNAw}Z;TW&kuV5-s z+j~Vzn4}Of(-j#=P^U!{%D@ui47s;nDbRgCC0E&V)(UCvX#d| z@eXG)!b-8DKO-AU!lT2O;hBCg|8vR~Ug)6h1#hEavf6*dG%qF}|vq>3l&n5@>K4fRxl~PZXDeKo6uG&r8$@W_O zvKZ~tk%Ik}??DSP>Gyd&If|FeAxAG;#%{%E6psJ?oN!!5wrJ-wGh(s2u>W`J?Q=;u zSLPPsGKD4-VU0f_jgzOxDbxnDVB9szR?vk;*bcavP>mUXMRIHGna!B7?fUN+dlV$) zX9`mCl0lT3>C(p zOoH1oiJ!ZfB*6Le$VM8ppe&2rxGh=a-Sc%;J=TxUCi-t>6Iql){Iul||F?2#F)wF+ z174QzP<+1%1t*!{T+(10b89f+er`3!#d$>WWS$z!e)(jz*5?yLzvRc^@c?BE#wAK} zQtejG!tzxmImuiLW?_e`M95*y&JUSUr4vm5FXb+{M=rxxdkQx86mZQw1(d%6W^#cH z4)jrp0(7;p&j7gkbxHwU|HqT!VLlp0x4jvSel9Wp{Vghr3x`$!DV1!13H_8BUvta$ zQN{445V%2QKXnvd>;yty`Q*(C@9d*WrtVo-v7gFkeX-Xlyt$96o)V7qQw3Ppiq$Pt z>1s8YFnN<^!uzX$Gt4Wdec|{%YQWrcfLfjllU(>>Sn_YGh-u1|!GvF_45)knWaif& zQCsJc{Av>Dc~kElZ0_fBx{f6I(wrq*c)y&khWEEqBB=1M90C_D3e3cAD| zqB1zcWeIfZlu>i;0y^WR%1ncMO6gMkma#_ZSl%*FRz@$MDwW^`hkdWep}dT4dQqxn z#kAptBq^m^rfOALOt<4HaT&c{I90BxVf65D#MaFD#k7EHE~=p88cC@(kI;>5sWwVR zXtQL5cRv^^Ne zI>FIG;0Wntuo0_lO9n@$IGH*kkX;(?e(T@8ogQO|aJqr~40<4NGNc;L{XoTrqlj7Gg$t1@X@HFA}~plS<~ zD-HTqZMDWIuTdFI@@1N~&?=QtQ*C1{50b0YYK_qtBG>AS8iPrz*M-Pcx@vi2iwT*~ z>*UMpv<(`0lR<-~TeZ5{7eu+

r6o@-&T6TdUJl%WE?92D#B>Xi=M5(5pyZjowm5 zjmd~?Xbc*;ra{xF(V2|IEgB%M5wTUPlDFuz%`F->I3qlNoafPje1*yLn@rk9^m<0d zk!`hJSEH?MF_6ggRrMOR359OZ)S}IA&}xh!#5Rh*R-@AxR1Kj`Eruq&5&8OERn+>1 z2Be9yL!oI+b!>LkTD3`4g)(i>>zB1O$(#5Z19I62xil?@$`wElrwM=&ezOZi!mb^Z zJ(T%^PN=Bm@h3Olpa2BG3%(!(ish(h#C~8Jd@m7X!Q2di2=*56Y~jU4d;uK4Mhl=z z64*Y~W2g`Pdd>?R;F=^5!j9e+f^hg*GFU%FnQX&E8(-~c0 z>d$7V3Tf0@IlYtt(Vq0(RY6F;rdx z4&7P_%=-ZC6Ilr0VP&{w4E67+0pKQ+r&to+7 zc?M`<{dRKd0c93B9EA|u;h>bXTZnl>1o0X)q+GQn{Q-hIXkfo=~$fH~4)FCylrr;{BiOr?!BJ|;6eM|LyFreN$Dj| z{`D|$2mDK0Zuil2m;SrbYuir-IAlKI-Q0O`q-wKtY|E~*oYUG*HsILF=M@O@A|fv)*^>)f%Xf6GKj*Zv#c|iDI&knm zkDGmBW`uNnc3ji+$fGUkBk#+yS)s8&R?4IYwW>Yy(hlBP#L-X z`{Bb?tB22Q-T3yGpWG?F>KHZg=BUY(_^NH^>N#g;a>wO9nOhX<+& zZ+)*Hw2vj$ruZ!vec|4}bMb1O`Qd=1@R$AFV=XI9m!pEU6CEA`zkD~RO{1r`s`Ad4 zO>7yx(%$ghjbrN)76#6AZ|FX7LwCxx_B#FRCTRE1B@<)49HWEH?%?sVj&mQJvHO|7 z@R(vSvMB#AHy?!-Z1F$QZ&kHwTbnrRwc;&#J9>_PXV^KEzVOWj{H+T!f!AT-hR&_2 ki=wE;X%8M11dKhe>noF0o>;PpgWha*=zkNLDY+^C2j!yrD*ylh diff --git a/src/support/autoload/classmap.php b/src/support/autoload/classmap.php index d5da6107..3344c1a1 100644 --- a/src/support/autoload/classmap.php +++ b/src/support/autoload/classmap.php @@ -96,8 +96,6 @@ \FireHub\Core\Support\DataStructure\Runtime\HasFreezeState::class => __DIR__.'/../../support/datastructure/runtime/firehub.HasFreezeState.php', \FireHub\Core\Support\DataStructure\Runtime\StructureState::class => __DIR__.'/../../support/datastructure/runtime/firehub.StructureState.php', \FireHub\Core\Support\DataStructure\Storage::class => __DIR__.'/../../support/datastructure/interface.Storage.php', - \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrListStorage.php', - \FireHub\Core\Support\DataStructure\Storage\ArrMapStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ArrMapStorage.php', \FireHub\Core\Support\DataStructure\Storage\Capability\BackInsertion::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.BackInsertion.php', \FireHub\Core\Support\DataStructure\Storage\Capability\BackMutation::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.BackMutation.php', \FireHub\Core\Support\DataStructure\Storage\Capability\BackRemoval::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.BackRemoval.php', @@ -120,14 +118,18 @@ \FireHub\Core\Support\DataStructure\Storage\Capability\NodeMutation::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.NodeMutation.php', \FireHub\Core\Support\DataStructure\Storage\Capability\NodeRemoval::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.NodeRemoval.php', \FireHub\Core\Support\DataStructure\Storage\Capability\StorageMetricsAware::class => __DIR__.'/../../support/datastructure/storage/capability/firehub.StorageMetricsAware.php', + \FireHub\Core\Support\DataStructure\Storage\Engine\ArrHashEngine::class => __DIR__.'/../../support/datastructure/storage/engine/firehub.ArrHashEngine.php', \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.GeneratorStorage.php', \FireHub\Core\Support\DataStructure\Storage\Handle\NodeHandle::class => __DIR__.'/../../support/datastructure/storage/handle/firehub.NodeHandle.php', - \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\HashEngine::class => __DIR__.'/../../support/datastructure/storage/firehub.HashEngine.php', + \FireHub\Core\Support\DataStructure\Storage\HashStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.HashStorage.php', \FireHub\Core\Support\DataStructure\Storage\Initialization\GeneratorStorageInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/firehub.GeneratorStorageInitializer.php', - \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php', - \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrFillInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php', - \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrRangeInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/firehub.ListStorageInitializer.php', \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\GeneratorCallbackInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ListCallbackInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ListCallbackInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ListFillInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ListFillInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ListRangeInitializer::class => __DIR__.'/../../support/datastructure/storage/initialization/strategy/firehub.ListRangeInitializer.php', + \FireHub\Core\Support\DataStructure\Storage\ListStorage::class => __DIR__.'/../../support/datastructure/storage/firehub.ListStorage.php', \FireHub\Core\Support\DataStructure\Storage\Node::class => __DIR__.'/../../support/datastructure/storage/firehub.Node.php', \FireHub\Core\Support\DataStructure\Structure\Map::class => __DIR__.'/../../support/datastructure/structure/firehub.Map.php', \FireHub\Core\Support\DataStructure\Structure\Snapshot\MapSnapshot::class => __DIR__.'/../../support/datastructure/structure/snapshot/firehub.MapSnapshot.php', @@ -257,6 +259,7 @@ \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidBufferException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidBufferException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidCowStateException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidCowStateException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidDataStructureException.php', + \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidEngineException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidEngineException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidKeyException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidStorageException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidStorageException.php', \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidValueException::class => __DIR__.'/../../throwable/exception/support/datastructure/firehub.InvalidValueException.php', diff --git a/src/support/autoload/loader/firehub.CompiledClassmap.php b/src/support/autoload/loader/firehub.CompiledClassmap.php index 14c3eb31..85c60654 100644 --- a/src/support/autoload/loader/firehub.CompiledClassmap.php +++ b/src/support/autoload/loader/firehub.CompiledClassmap.php @@ -316,14 +316,6 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/interface.Storage.php'; return; - case \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::class: - require __DIR__.'/../../../support/datastructure/storage/firehub.ArrListStorage.php'; - return; - - case \FireHub\Core\Support\DataStructure\Storage\ArrMapStorage::class: - require __DIR__.'/../../../support/datastructure/storage/firehub.ArrMapStorage.php'; - return; - case \FireHub\Core\Support\DataStructure\Storage\Capability\BackInsertion::class: require __DIR__.'/../../../support/datastructure/storage/capability/firehub.BackInsertion.php'; return; @@ -412,6 +404,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/storage/capability/firehub.StorageMetricsAware.php'; return; + case \FireHub\Core\Support\DataStructure\Storage\Engine\ArrHashEngine::class: + require __DIR__.'/../../../support/datastructure/storage/engine/firehub.ArrHashEngine.php'; + return; + case \FireHub\Core\Support\DataStructure\Storage\GeneratorStorage::class: require __DIR__.'/../../../support/datastructure/storage/firehub.GeneratorStorage.php'; return; @@ -420,28 +416,40 @@ public function __invoke (string $class):void { require __DIR__.'/../../../support/datastructure/storage/handle/firehub.NodeHandle.php'; return; - case \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer::class: - require __DIR__.'/../../../support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php'; + case \FireHub\Core\Support\DataStructure\Storage\HashEngine::class: + require __DIR__.'/../../../support/datastructure/storage/firehub.HashEngine.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\HashStorage::class: + require __DIR__.'/../../../support/datastructure/storage/firehub.HashStorage.php'; return; case \FireHub\Core\Support\DataStructure\Storage\Initialization\GeneratorStorageInitializer::class: require __DIR__.'/../../../support/datastructure/storage/initialization/firehub.GeneratorStorageInitializer.php'; return; - case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer::class: - require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php'; + case \FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/firehub.ListStorageInitializer.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\GeneratorCallbackInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php'; return; - case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrFillInitializer::class: - require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php'; + case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ListCallbackInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.ListCallbackInitializer.php'; return; - case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrRangeInitializer::class: - require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php'; + case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ListFillInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.ListFillInitializer.php'; return; - case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\GeneratorCallbackInitializer::class: - require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.GeneratorCallbackInitializer.php'; + case \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ListRangeInitializer::class: + require __DIR__.'/../../../support/datastructure/storage/initialization/strategy/firehub.ListRangeInitializer.php'; + return; + + case \FireHub\Core\Support\DataStructure\Storage\ListStorage::class: + require __DIR__.'/../../../support/datastructure/storage/firehub.ListStorage.php'; return; case \FireHub\Core\Support\DataStructure\Storage\Node::class: @@ -960,6 +968,10 @@ public function __invoke (string $class):void { require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidDataStructureException.php'; return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidEngineException::class: + require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidEngineException.php'; + return; + case \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException::class: require __DIR__.'/../../../throwable/exception/support/datastructure/firehub.InvalidKeyException.php'; return; diff --git a/src/support/datastructure/storage/engine/firehub.ArrHashEngine.php b/src/support/datastructure/storage/engine/firehub.ArrHashEngine.php new file mode 100644 index 00000000..25d5099e --- /dev/null +++ b/src/support/datastructure/storage/engine/firehub.ArrHashEngine.php @@ -0,0 +1,129 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.1 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage\Engine; + +use FireHub\Core\Support\DataStructure\Storage\HashEngine; +use FireHub\Core\Shared\Type\Maybe; +use FireHub\Core\Shared\Enums\MutationOutcome; +use FireHub\Core\Support\LowLevel\Arr; + +/** + * ### Array HashEngine + * + * Simple PHP array-backed hash table engine.
+ * Fast, memory-resident, no collision strategy beyond PHP array behavior. + * @since 1.0.0 + * + * @template TKey of array-key + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Storage\HashEngine + */ +final class ArrHashEngine implements HashEngine { + + /** + * ### Underlying data + * @since 1.0.0 + * + * @var array + */ + private array $data = []; + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function iterate ():iterable { + + return $this->data; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::count() To count the number of elements in the storage. + */ + public function size ():int { + + return Arr::count($this->data); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\LowLevel\Arr::keyExists() To check if a key exists in the hash engine. + */ + public function has (int|string $key):bool { + + return Arr::keyExists($key, $this->data); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\ArrMapStorage::has() To check if key exists. + */ + public function get (int|string $key):Maybe { + + return $this->has($key) + ? Maybe::some($this->data[$key]) // @phpstan-ignore offsetAccess.notFound + : Maybe::none(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. + */ + public function set (int|string $key, mixed $value):MutationOutcome { + + $this->data[$key] = $value; + + return $this->has($key) + ? MutationOutcome::UPDATED + : MutationOutcome::CREATED; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. + */ + public function remove (int|string $key):MutationOutcome { + + unset($this->data[$key]); + + return $this->has($key) + ? MutationOutcome::REMOVED + : MutationOutcome::NOT_FOUND; + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.ArrMapStorage.php b/src/support/datastructure/storage/firehub.ArrMapStorage.php deleted file mode 100644 index 7aeef107..00000000 --- a/src/support/datastructure/storage/firehub.ArrMapStorage.php +++ /dev/null @@ -1,237 +0,0 @@ - - * @copyright 2026 The FireHub Project - All rights reserved - * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 - * - * @php-version 8.1 - * @package Core\Support - */ - -namespace FireHub\Core\Support\DataStructure\Storage; - -use FireHub\Core\Support\DataStructure\Storage; -use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; -use FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer; -use FireHub\Core\Support\DataStructure\Storage\Capability\ { - Cloneable, Convertible, KeyAccess, KeyMutation, StorageMetricsAware -}; -use FireHub\Core\Shared\Type\Maybe; -use FireHub\Core\Shared\Enums\MutationOutcome; -use FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException; -use FireHub\Core\Support\LowLevel\ { - Arr, DataIs -}; - -/** - * ### Array-Based Map Storage - * - * A mutable key-value storage implementation backed by a native PHP associative array. Provides fast key-based - * access, insertion, and mutation while preserving insertion order. Designed for structured datasets where elements - * are accessed via unique keys rather than positional indexing. Optimized for configuration objects, registries, - * and general-purpose associative collections with predictable lookup performance. - * @since 1.0.0 - * - * @template TKey of array-key - * @template TValue - * - * @implements \FireHub\Core\Support\DataStructure\Storage - * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\Convertible - * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\KeyAccess - * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\KeyMutation - */ -final class ArrMapStorage implements Storage, Convertible, Cloneable, StorageMetricsAware, KeyAccess, KeyMutation { - - /** - * ### Underlying data storage - * @since 1.0.0 - * - * @var array - */ - private array $data = []; - - /** - * ### Constructor - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer As parameter. - * - * @param null|\FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer $initializer [optional]

- * Initial data to store. - *

- * - * @return void - */ - public function __construct (?ArrStorageInitializer $initializer = null) { - - if ($initializer !== null) $this->data = $initializer(); - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer To - * convert the storage to an array. - * @uses \FireHub\Core\Support\DataStructure\Storage::iterate() To retrieve an iterable of the elements in the - * storage. - */ - public static function fromStorage (Storage $storage):static { - - return new self( - new ArrCallbackInitializer(function () use ($storage) { - - $values = []; - foreach ($storage->iterate() as $key => $value) { - - if (!DataIs::int($key) && !DataIs::string($key)) - throw InvalidKeyException::builder() - ->withContext([ - 'key' => $key - ]) - ->build(); - - $values[$key] = $value; - - } - - return $values; - - }) - ); - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function iterate ():iterable { - - return $this->data; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function copy ():static { - - $clone = new static(); - - $clone->data = []; - - foreach ($this->data as $key => $value) - $clone->data[$key] = $value; - - /** @var static */ - return $clone; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function capacity ():null { - - return null; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - */ - public function availableCapacity ():null { - - return null; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Arr::count() To count the number of elements in the storage. - */ - public function size ():int { - - return Arr::count($this->data); - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\LowLevel\Arr::keyExists() To check if a key exists in the storage. - */ - public function has (int|string $key):bool { - - return Arr::keyExists($key, $this->data); - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage\ArrMapStorage::has() To check if key exists. - */ - public function get (int|string $key):Maybe { - - return $this->has($key) - ? Maybe::some($this->data[$key]) // @phpstan-ignore offsetAccess.notFound - : Maybe::none(); - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. - */ - public function set (int|string $key, mixed $value):MutationOutcome { - - $this->data[$key] = $value; - - return $this->has($key) - ? MutationOutcome::UPDATED - : MutationOutcome::CREATED; - - } - - /** - * @inheritDoc - * - * @since 1.0.0 - * - * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. - */ - public function remove (int|string $key):MutationOutcome { - - unset($this->data[$key]); - - return $this->has($key) - ? MutationOutcome::REMOVED - : MutationOutcome::NOT_FOUND; - - } - -} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.HashEngine.php b/src/support/datastructure/storage/firehub.HashEngine.php new file mode 100644 index 00000000..dd857d64 --- /dev/null +++ b/src/support/datastructure/storage/firehub.HashEngine.php @@ -0,0 +1,123 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.0 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Shared\Type\Maybe; +use FireHub\Core\Shared\Enums\MutationOutcome; + +/** + * ### Hash Engine Contract + * + * Low-level storage strategy for HashStorage.
+ * Responsible for actual key-value persistence logic. + * + * @template TKey of int|string + * @template TValue + */ +interface HashEngine { + + /** + * ### Traverses Hash Engine data + * + * Provides a unified, read-only traversal contract for accessing all elements within a Hash Engine implementation. + * @since 1.0.0 + * + * @return iterable + */ + public function iterate ():iterable; + + /** + * ### Retrieve the number of elements stored in the hash engine + * @since 1.0.0 + * + * @return non-negative-int The number of elements stored in the hash engine. + */ + public function size ():int; + + /** + * ### Check Key Existence + * + * Determines whether a value exists for the specified key in the hash engine. Provides a fast existence check + * without retrieving the underlying value, enabling safe conditional access patterns. + * @since 1.0.0 + * + * @param TKey $key

+ * The key to check for existence. + *

+ * + * @return bool True if the key exists, false otherwise. + */ + public function has (int|string $key):bool; + + /** + * ### Retrieve Value by Key + * + * Retrieves the value associated with the given key from an associative hash engine. If the key does not + * exist, an empty Maybe is returned instead of null, ensuring explicit handling of missing entries. This operation + * does not modify the hash engine and is designed for safe, read-only access to key-based data mappings such as + * dictionaries, maps, and registries. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Type\Maybe As return. + * + * @param TKey $key

+ * The key to retrieve value by key. + *

+ * + * @return \FireHub\Core\Shared\Type\Maybe|\FireHub\Core\Shared\Type\Maybe Maybe with element at key + * position of the hash engine, or Maybe with null if element at key position of the hash engine doesn't exist. + */ + public function get (int|string $key):Maybe; + + /** + * ### Set Value by Key + * + * AAssigns a value to the specified key in the associative hash engine. If the key already exists, the existing + * value is overwritten. If it does not exist, a new entry is created. This operation is fundamental for + * key-value-based structures and does not involve positional logic or traversal. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\MutationOutcome As return. + * + * @param TKey $key

+ * The key where the value will be added. + *

+ * @param TValue $value

+ * Value to add to the key. + *

+ * + * @return \FireHub\Core\Shared\Enums\MutationOutcome::CREATED|\FireHub\Core\Shared\Enums\MutationOutcome::UPDATED + * An enum indicating the result of the mutation operation. + */ + public function set (int|string $key, mixed $value):MutationOutcome; + + /** + * ### Remove Value by Key + * + * Removes the entry associated with the specified key from the hash engine. If the key does not exist, the operation + * has no effect. This mutation affects only the associative mapping layer and does not depend on element ordering + * or structural position. + * @since 1.0.0 + * + * @uses \FireHub\Core\Shared\Enums\MutationOutcome As return. + * + * @param TKey $key

+ * The key of the value to remove. + *

+ * + * @return \FireHub\Core\Shared\Enums\MutationOutcome::REMOVED|\FireHub\Core\Shared\Enums\MutationOutcome::NOT_FOUND + * An enum indicating the result of the mutation operation. + */ + public function remove (int|string $key):MutationOutcome; + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.HashStorage.php b/src/support/datastructure/storage/firehub.HashStorage.php new file mode 100644 index 00000000..e99a1bd1 --- /dev/null +++ b/src/support/datastructure/storage/firehub.HashStorage.php @@ -0,0 +1,227 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.2 + * @package Core\Support + */ + +namespace FireHub\Core\Support\DataStructure\Storage; + +use FireHub\Core\Support\DataStructure\Storage; +use FireHub\Core\Support\DataStructure\Storage\Capability\ { + Cloneable, Convertible, KeyAccess, KeyMutation, StorageMetricsAware +}; +use FireHub\Core\Shared\Type\Maybe; +use FireHub\Core\Shared\Enums\MutationOutcome; +use FireHub\Core\Throwable\Exception\Support\DataStructure\ { + InvalidEngineException, InvalidKeyException +}; +use FireHub\Core\Support\LowLevel\ { + ClsObj, DataIs +}; + +/** + * ### Hash-based Key-Value Storage with Pluggable Engine Architecture + * + * A key-value storage abstraction that provides associative data management using a pluggable hashing engine. It + * decouples the storage API from the underlying implementation (such as array-based maps, HAMT, open addressing, or + * Robin Hood hashing), allowing runtime strategy switching while preserving consistent Map/Set semantics. + * + * @template TKey of array-key + * @template TValue + * + * @implements \FireHub\Core\Support\DataStructure\Storage + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\Convertible + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\KeyAccess + * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\KeyMutation + */ +final readonly class HashStorage implements Storage, Convertible, Cloneable, StorageMetricsAware, KeyAccess, + KeyMutation { + + /** + * ### Constructor + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\HashEngine As parameter. + * + * @param \FireHub\Core\Support\DataStructure\Storage\HashEngine $engine

+ * Hash Engine. + *

+ * + * @return void + */ + public function __construct( + private HashEngine $engine + ) {} + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage::iterate() To retrieve an iterable of the elements in the + * storage. + * + * @param class-string<\FireHub\Core\Support\DataStructure\Storage\HashEngine> $engine [optional]

+ * Hash engine to use. + *

+ * + * @throws \FireHub\Core\Shared\Contracts\Throwable + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidKeyException If key is invalid. + * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidEngineException If engine is invalid. + */ + public static function fromStorage (Storage $storage, string $engine = Storage\Engine\ArrHashEngine::class):static { + + $engine = ClsObj::ofClass($engine, HashEngine::class) + ? new $engine + : throw InvalidEngineException::builder() + ->withContext([ + 'engine' => $engine + ]) + ->build(); + + foreach ($storage->iterate() as $key => $value) { + + if (!DataIs::int($key) && !DataIs::string($key)) + throw InvalidKeyException::builder() + ->withContext([ + 'key' => $key + ]) + ->build(); + + $engine->set($key, $value); + + } + + + return new self($engine); // @phpstan-ignore return.type + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\HashEngine::iterate() To traverse Hash Engine data. + */ + public function iterate ():iterable { + + return $this->engine->iterate(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\HashEngine::iterate() To traverse hash engine data. + * @uses \FireHub\Core\Support\DataStructure\Storage\HashEngine::set() To set Value by Key in the engine. + */ + public function copy ():static { + + $engine = new $this->engine; + + foreach ($this->engine->iterate() as $key => $value) + $engine->set($key, $value); + + return new self($engine); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function capacity ():null { + + return null; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + */ + public function availableCapacity ():null { + + return null; + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\HashEngine::size() To get number of elements stored in the + * hash engine. + */ + public function size ():int { + + return $this->engine->size(); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\HashEngine::has() To check Key existence in the engine. + */ + public function has (int|string $key):bool { + + return $this->engine->has($key); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\HashStorage::get() To check if key exists in the engine. + */ + public function get (int|string $key):Maybe { + + return $this->engine->get($key); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\HashStorage::set() To set Value by Key in the engine. + */ + public function set (int|string $key, mixed $value):MutationOutcome { + + return $this->engine->set($key, $value); + + } + + /** + * @inheritDoc + * + * @since 1.0.0 + * + * @uses \FireHub\Core\Support\DataStructure\Storage\HashEngine::remove() To remove Value by Key in the engine. + */ + public function remove (int|string $key):MutationOutcome { + + return $this->engine->remove($key); + + } + +} \ No newline at end of file diff --git a/src/support/datastructure/storage/firehub.ArrListStorage.php b/src/support/datastructure/storage/firehub.ListStorage.php similarity index 89% rename from src/support/datastructure/storage/firehub.ArrListStorage.php rename to src/support/datastructure/storage/firehub.ListStorage.php index 464fe306..437df400 100644 --- a/src/support/datastructure/storage/firehub.ArrListStorage.php +++ b/src/support/datastructure/storage/firehub.ListStorage.php @@ -14,8 +14,8 @@ namespace FireHub\Core\Support\DataStructure\Storage; use FireHub\Core\Support\DataStructure\Storage; -use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; -use FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer; +use FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer; +use FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ListCallbackInitializer; use FireHub\Core\Support\DataStructure\Storage\Capability\ { Cloneable, Convertible, DequeMutation, IndexAccess, IndexMutation, LinearBoundaryAccess, StorageMetricsAware }; @@ -43,7 +43,7 @@ * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\IndexAccess * @implements \FireHub\Core\Support\DataStructure\Storage\Capability\IndexMutation */ -final class ArrListStorage implements Storage, Convertible, Cloneable, StorageMetricsAware, LinearBoundaryAccess, +final class ListStorage implements Storage, Convertible, Cloneable, StorageMetricsAware, LinearBoundaryAccess, DequeMutation, IndexAccess, IndexMutation { /** @@ -58,16 +58,16 @@ final class ArrListStorage implements Storage, Convertible, Cloneable, StorageMe * ### Constructor * @since 1.0.0 * - * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer As parameter. + * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer As parameter. * @uses \FireHub\Core\Support\LowLevel\Arr::values() To convert the array keys to integers. * - * @param null|\FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer $initializer [optional]

+ * @param null|\FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer $initializer [optional]

* Initial data to store. *

* * @return void */ - public function __construct (?ArrStorageInitializer $initializer = null) { + public function __construct (?ListStorageInitializer $initializer = null) { if ($initializer !== null) $this->data = Arr::values($initializer()); @@ -78,7 +78,7 @@ public function __construct (?ArrStorageInitializer $initializer = null) { * * @since 1.0.0 * - * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ArrCallbackInitializer To + * @uses \FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy\ListCallbackInitializer To * convert the storage to an array. * @uses \FireHub\Core\Support\DataStructure\Storage::iterate() To retrieve an iterable of the elements in the * storage. @@ -86,7 +86,7 @@ public function __construct (?ArrStorageInitializer $initializer = null) { public static function fromStorage (Storage $storage):static { return new self( - new ArrCallbackInitializer(function () use ($storage) { + new ListCallbackInitializer(function () use ($storage) { $values = []; foreach ($storage->iterate() as $value) @@ -281,7 +281,7 @@ public function has (int $index):bool { * * @since 1.0.0 * - * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. + * @uses \FireHub\Core\Support\DataStructure\Storage\ListStorage::has() To check if index exists. */ public function get (int $index):Maybe { @@ -296,7 +296,7 @@ public function get (int $index):Maybe { * * @since 1.0.0 * - * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. + * @uses \FireHub\Core\Support\DataStructure\Storage\ListStorage::has() To check if index exists. */ public function set (int $index, mixed $value):MutationOutcome { @@ -315,7 +315,7 @@ public function set (int $index, mixed $value):MutationOutcome { * * @since 1.0.0 * - * @uses \FireHub\Core\Support\DataStructure\Storage\ArrListStorage::has() To check if index exists. + * @uses \FireHub\Core\Support\DataStructure\Storage\ListStorage::has() To check if index exists. */ public function remove (int $index):MutationOutcome { diff --git a/src/support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php b/src/support/datastructure/storage/initialization/firehub.ListStorageInitializer.php similarity index 89% rename from src/support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php rename to src/support/datastructure/storage/initialization/firehub.ListStorageInitializer.php index dfda8f54..2e418885 100644 --- a/src/support/datastructure/storage/initialization/firehub.ArrStorageInitializer.php +++ b/src/support/datastructure/storage/initialization/firehub.ListStorageInitializer.php @@ -14,9 +14,9 @@ namespace FireHub\Core\Support\DataStructure\Storage\Initialization; /** - * ### Array Storage Initializer + * ### List Storage Initializer * - * Provides a strategy for initializing the internal array of an ArrStorage instance during construction. Enables + * Provides a strategy for initializing the internal array of an ListStorage instance during construction. Enables * controlled, potentially lazy, or computed population of the underlying data structure while preserving encapsulation * and avoiding direct array injection. Suitable for large datasets, dynamic generation, or deferred materialization * patterns. @@ -25,7 +25,7 @@ * @template TKey of array-key * @template TValue */ -interface ArrStorageInitializer { +interface ListStorageInitializer { /** * ### Invoke Initializer diff --git a/src/support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php b/src/support/datastructure/storage/initialization/strategy/firehub.ListCallbackInitializer.php similarity index 80% rename from src/support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php rename to src/support/datastructure/storage/initialization/strategy/firehub.ListCallbackInitializer.php index 46dfc3a0..ff938623 100644 --- a/src/support/datastructure/storage/initialization/strategy/firehub.ArrCallbackInitializer.php +++ b/src/support/datastructure/storage/initialization/strategy/firehub.ListCallbackInitializer.php @@ -13,13 +13,13 @@ namespace FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy; -use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; +use FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer; use Closure; /** * ### Initialize an array using a value-generating callback * - * A concrete ArrStorageInitializer implementation that delegates array creation to a user-provided callback. + * A concrete ListStorageInitializer implementation that delegates array creation to a user-provided callback. * Executes the callback during initialization to produce the underlying dataset, enabling flexible, dynamic, or * computed data generation while preserving a consistent initialization contract. * @since 1.0.0 @@ -27,9 +27,9 @@ * @template TKey of array-key * @template TValue * - * @implements \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer + * @implements \FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer */ -final readonly class ArrCallbackInitializer implements ArrStorageInitializer { +final readonly class ListCallbackInitializer implements ListStorageInitializer { /** * ### Constructor diff --git a/src/support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php b/src/support/datastructure/storage/initialization/strategy/firehub.ListFillInitializer.php similarity index 90% rename from src/support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php rename to src/support/datastructure/storage/initialization/strategy/firehub.ListFillInitializer.php index 8a287b09..7b2816da 100644 --- a/src/support/datastructure/storage/initialization/strategy/firehub.ArrFillInitializer.php +++ b/src/support/datastructure/storage/initialization/strategy/firehub.ListFillInitializer.php @@ -13,7 +13,7 @@ namespace FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy; -use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; +use FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer; use FireHub\Core\Support\LowLevel\Arr; /** @@ -27,9 +27,9 @@ * * @template TValue * - * @implements \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer + * @implements \FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer */ -final readonly class ArrFillInitializer implements ArrStorageInitializer { +final readonly class ListFillInitializer implements ListStorageInitializer { /** * ### Constructor diff --git a/src/support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php b/src/support/datastructure/storage/initialization/strategy/firehub.ListRangeInitializer.php similarity index 93% rename from src/support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php rename to src/support/datastructure/storage/initialization/strategy/firehub.ListRangeInitializer.php index 36b6a321..8deb8c1b 100644 --- a/src/support/datastructure/storage/initialization/strategy/firehub.ArrRangeInitializer.php +++ b/src/support/datastructure/storage/initialization/strategy/firehub.ListRangeInitializer.php @@ -13,7 +13,7 @@ namespace FireHub\Core\Support\DataStructure\Storage\Initialization\Strategy; -use FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer; +use FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer; use FireHub\Core\Throwable\Exception\Support\DataStructure\OutOfBoundsException; use FireHub\Core\Throwable\Error\LowLevel\Arr\OutOfRangeError; use FireHub\Core\Support\LowLevel\Arr; @@ -29,9 +29,9 @@ * * @template TValue of float|int|string * - * @implements \FireHub\Core\Support\DataStructure\Storage\Initialization\ArrStorageInitializer + * @implements \FireHub\Core\Support\DataStructure\Storage\Initialization\ListStorageInitializer */ -final readonly class ArrRangeInitializer implements ArrStorageInitializer { +final readonly class ListRangeInitializer implements ListStorageInitializer { /** * ### Constructor diff --git a/src/throwable/exception/support/datastructure/firehub.InvalidEngineException.php b/src/throwable/exception/support/datastructure/firehub.InvalidEngineException.php new file mode 100644 index 00000000..726d3afb --- /dev/null +++ b/src/throwable/exception/support/datastructure/firehub.InvalidEngineException.php @@ -0,0 +1,31 @@ + + * @copyright 2026 The FireHub Project - All rights reserved + * @license https://opensource.org/license/Apache-2-0 Apache License, Version 2.0 + * + * @php-version 8.3 + * @package Core\Throwable + */ + +namespace FireHub\Core\Throwable\Exception\Support\DataStructure; + +use FireHub\Core\Throwable\Exception; + +/** + * ### Invalid engine exception + * @since 1.0.0 + */ +class InvalidEngineException extends Exception { + + /** + * @inheritdoc + * + * @since 1.0.0 + */ + protected const string DEFAULT_MESSAGE = 'Storage engine is invalid.'; + +} \ No newline at end of file From b430fe064d85d3239e91e151ad598fd911c87941 Mon Sep 17 00:00:00 2001 From: Riddick Date: Thu, 28 May 2026 14:57:59 +0200 Subject: [PATCH 75/79] Add `crc32` checksum calculation to `StrSB` with unit test coverage **Detailed Description:** 1. **New Method in `StrSB`:** - Introduced `crc32(string $string): int` method to calculate the CRC32 checksum of a given string. - Utilizes PHP's built-in `crc32` function to efficiently compute the checksum and return it as an integer. 2. **Unit Test for `crc32`:** - Added a corresponding test case `testCrc32()` in `StrSBTest` to validate the functionality. - Used `TestWith` annotation to provide sample inputs (e.g., "The quick brown fox...") and expected checksum values for assertion. 3. **Documentation Updates:** - Updated docblocks in `StrSB` to describe the new method, including the expected input type, output type, and functionality purpose. 4. **File Name Consistency:** - Renamed internal class comments for better readability (e.g., adjusted spacing in `Array HashEngine`). 5. **Changelog Enhancement:** - Documented the addition of the `crc32` method under the "Unreleased" section, ensuring proper documentation of changes. 6. **Build Updates:** - Regenerated PHAR builds (`core.phar` and `core.min.phar`) to include the new functionality. **Key Benefits:** - Introduces CRC32 checksum capability directly within the framework for improved convenience and reduced dependency on external libraries. - Ensures correctness and reliability with unit test validation. - Maintains clear and up-to-date documentation, supporting seamless developer adoption. --- CHANGELOG.md | 11 +++++++++++ dist/core.min.phar | Bin 269999 -> 270096 bytes dist/core.phar | Bin 865575 -> 865918 bytes .../storage/engine/firehub.ArrHashEngine.php | 2 +- src/support/lowlevel/firehub.StrSB.php | 17 +++++++++++++++++ tests/unit/support/lowlevel/StrSBTest.php | 15 +++++++++++++++ 6 files changed, 44 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3539add9..03b02789 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.3.2...feature/support-high-level-api) + +### Added +- Add `Map` and `Associative` data structures with advanced capabilities (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`15b5c3a`](https://github.com/The-FireHub-Project/Core-Foundation/commit/15b5c3a)) + +### Changed +- Replace `ArrMapStorage` with new `HashStorage` abstraction; introduce pluggable `HashEngine` and remove outdated array-based initializers (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`0c8970b`](https://github.com/The-FireHub-Project/Core-Foundation/commit/0c8970b)) + +### Fixed +- Replace `addFirst` with `addLast` in `Vector` initialization logic (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`377be90`](https://github.com/The-FireHub-Project/Core-Foundation/commit/377be90)) + ## [v0.3.2](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.3.1...v0.3.2) – 2026-05-27 ### Added diff --git a/dist/core.min.phar b/dist/core.min.phar index 58e5fac38995a1bd596b8b47263104acfea61692..5d7c63324c9dbd13fc6107dcf498c1349e43f31e 100644 GIT binary patch delta 2903 zcmYLKc~n#P63z`I1V~80K#*0I2!Wui1_B6#C8De@h#(l;02iQwLUBRsQ$edQzN=oW zQoy5CXkD=dS5#1xs(3tATTvTPN%j(EmvuAp`Is+yE93!2sV9fdK79D1a?n4X~7r(lK^4NQ3MU0AIan02}nsrA2Qh zNY?u3nWnD-sahWcdi7_6q~f6G4o)OU_c`b(=0<>&!VLl_=c4j4Hx?wB0cOZI2ebF!s zY-5J_kWeGc_HU!XQpyXpf86VR&@x4Gf#Gee{BETXv z0_1IA3q*C)#fKKxifG~?> zfCCmNeXvLeX|4o4f0U#l=NUS?`K0P0GD8wfrdpbV%PLD`X|u#Q_wg7|Ha-~xhUkFf zrSf)iz&w~TK1B$*GP*1}D#U6L1Ru7V2QX%}6d=`n-fJftCC=1F55k>0$~?Kl3Ee%Nah1Mwo&v$A8R&Laf+UqP>ykk~>*o084sx+H_M%Mw70_Bv&(F<)oGdO=6kxZ#DIarw{WG1j!VI|WH<3~f4@zi6!kLkAdi?Lj~3>V^$l?B)%9D|f?DdGD5v6%Eo;clBr$ht$ML zNP8a>GE~kdweIfVddVGEz*LTNv|OGB%2s&>fQJXtZ1=!1?D4?ajGUB;q_1hxPxoIm zlUEf|O7kmWO11w+jN^9EYC81OBn>d6O-9;!224HiT4a0TwP^IjIkEP_`P%9=|DRgP z{iSzFt=Cji?k)aD=~{Ps3awO7C)9+5+sCA-^2YTV^~MU*eXzoFK3KhtFG7j$T&Uz% zUwn(7AG&D$Fs`4GqNgz1`GO{GRd2jZj=4#x(0IaK1doI%1B`R-{E7_m^QVU5>34QA z1*9vGy`BM)Kh}}wk6mnIq{#v3QW}8IeHp-<4tPLFP=6c!Bq@1MDIv?0c#^7>Sm1~f zcRno;xBO}#@;U^eZCwx&J_y1!l?Ttk9zCH6HJ?pR(cirLVujo7`n%W~c z2?L{qkg6La%>UORTNRE#p$fmoW7QJ)8e!o$3H!tGnD>VxZFEEm77DEy{+HMj$5j|1 zr0lZ^TS~%Vn;O9?ePo^`h{PMYIucJ%SL6!dofCyO>v|NnO{PZJsYd!g)mXudX*ik3 z84yO}-7Sd5dTvKA2bO^87*{bJC8HTgT{Hvp>1Jes%k-F)0Ow**=@5%7TVpdpIS`9) zOo~I><+#P5bdJX+Z;r?CzIX*FCnop-q$S{DA4muQ>0tscy=7tmb|Z~GC#QbcQB3L* zEU0bk2pjG^`a_-#+`Kn&+ulTi{$tngP1JiM=PX*a$j7_BaD(2M9aVmZEnyVY<%4?m z0<^h0=NGKX&dIF*qC(HRq@<;FB+9aR^|&MC;L1YJgr}oDFZ&+v^sVD}9_Z>h_O*$-X&cSly^ zNS^Aip5HZF<`i!VQy9M~&hB*#KY#ELaj8W(%eG@rhVQNoL#au3tPURUEIBi+c8zv; zz2LCV(|dJ(>`R)Mj@HZ-lA|%Nl-o~~Rrjn+N;RFb@YtH(3oqrH=Vor@Y2GDyG)dk~ zGFdikcz)V@(d!2(%H37t_eq~GYf(3NpL{h|b}OdR)XuVjBvb*uu0yWn>yz*O&`^3} zY5Q88hMDIEwek6!Luz^6fb+W+v(2ME1iX-6(wtq*tRY#lG|j8+p|aZ zFKR1ZpWgU>;J!oOxvZZ}l27KEZ~mj#s!6Nc`dRoY#d^s4_VN=hyYlQ~$|hR>*;-Qg z;q5nqG>c%T^a!Ir9u-&|&e(f_!{4R+zWuwVpFTI(wcaT1dAqAAC5KFS+pb^id%Zil zPPZvTkde(R;uoa-ep6aob6R~xy;3)`@^NF*{>GY4*@BA(wKVwasKblFn t#qGJBvEM6par>Us7w7%zR>=E?3pn=guZa{>7pqwGbkRRREVU|D^*4fUKxzO0 delta 2872 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 V8J7(Bia)aGK{jB~%R`f(`5&-;Y;OPn delta 2977 zcmYLKcT`hp77s5Wlq3*RAWD^*gx-rlAkq;Cb`cOniU@+DBXe{_2gQzYpZbs>Mh0P= zU9pW5*-^3J!L@SO5gRJHG#(|W@jRa`mqVgU$4J3sLW~efW;>SD7 zN~=v+tdYbRf3ku%f$~{J*pk1SaKLZWBn-gMG!$TwDN?nYP66p91O8@M&lEz^-^(V&m3XVxmiysbCWcv52`sv>g^=+Al&4*fds| z*bW7U#j4OvKSB$I_ zyMS%C7!yAcV`7D5HhP{jXR+MhH9jK;B?07Fi8XlkOOR73%?4?cbRNJ{X%;}N^&9}5 zHA;V3=Yllb20c&OHc{j}nG{@>$&lry4C6c}V8G@Hb1*<_#$tKy zsGCfVNTaB24TL4PjxLLiQcWy?;MR$A0mdg50TkO}(jMFSAj$2Jc!M1hKek%{%6R)3 zLJl7&WTk)yvL5%6k1ZtR8T$~-m`d{xwsF>we+VSxOJ^aemvN~KJz*_$vtq&kMIlG; z(Jc%h*ExuRc8>#orXdG>wf>GXLAl9s3BZ`+B7g#?YJdk$RRGf_RRCO^R0$C5jKi|l zc`8UZoUvl13-ckW=rTD6%T35G8&|695MfH@xmZ!ELxhN%Z;H)$;(~F0t~g|0yM_SE zF$SKyMu6nz#tf2{E`CMt`4H0AO<_G z^Tm&3hld-bI!y3|_x~3Ixch+UD!J6d%_1&;c|H)DxL{Rz?#vvxtFf_;3AAfBwG2o^ zafJnC`O69yg8Ppa=^EvUikpt z-bk~>8=vX0H@@9?pLs}noF>in4fG+;hq_T2rwJ?SW(`}+ZKc(8=trMCV94=BS_1=C zez;8*`QbL{^229i>yOW^&OaMzkI?Zy&pbLrYW<^0uK)=ukI~A_wM}ERGL&-dCTzIh zF=_MxIDTIOu)^Fxtgtf>tG5e6s0o@4mD~x!y95WLi#8bJUNcg12s6DTO{yz?sv*af zZe(wSHMN6eONH&2N>&P(bZAvSsR|CG^w$V6cMnrUZYX9jFdz)WS}Mb^lQ$X3Hym9y zh2xcf4QJL%3msqIpXESb3-Z}etDD#&?tX^#Km=C$DFT;6&SYE%=O-iiq)4=_jzrd5 zkvP6yQ8Tewo9Oti?h%6iFkw{49m0yMWf%vd3elmD7QYI%u( zqrx3=h=C6(Op+OcDSwE;0*qs^xT09*+a08d6IVAh;gjfkKv+^^9c(GLfk|(##<#Fi zji2S7x)44~>=b+wd#B*me?0|hljE|mQ0UJ-?LS@d-CD+3QsYB}lybO0m{NW}(ZmLZ zSP+lfbVWSwrlI&UAfB0k%j{AD_Dzw9ussp^pCw`msY&=o4>Mqyj2n7+G8S|#c`>kr zr(oQ^6qL+Uk-9n+^9`n!fJ@5Ma)8dMsGO9BEOlwcpd3lVOU_D1+u8Jmpmfc^F4tyY z_^XUiP`Yb^0dh1r;yO(@Nc|cde_3WYwqrGq#d=fJaDp7vSX1#I2s`d8{0FVwow;#$ zrV)Jz`mhbVGdT(E8wbWX^f9Inmp&%+F{O{0VPMR>-qf(hi1(nyP~K)9VMLwv6NpL8 zN;gWFYMwwjo#F^6%^=TwV_7@TP}a`pZm-GqdsnveQI9aR?ekjQBFXfYB{T>`Yf5zS~AGHT-Uqr(WmAcIUZNV zxlR5x4$n?`dvQy|FQ!WWT9)N912<+x_4kdQ zWZAXOsdaQ;;3ALm?a1RR8drv@){6;DXf*Zo<@4BYU4CiRt8-Q!J8GSHWrJ%WIw#+8@Fxkm`)-2nsqVxdTFFEd-#Ggiyk%+iym-wn)<(s C9MVhx diff --git a/src/support/datastructure/storage/engine/firehub.ArrHashEngine.php b/src/support/datastructure/storage/engine/firehub.ArrHashEngine.php index 25d5099e..1b7ba083 100644 --- a/src/support/datastructure/storage/engine/firehub.ArrHashEngine.php +++ b/src/support/datastructure/storage/engine/firehub.ArrHashEngine.php @@ -19,7 +19,7 @@ use FireHub\Core\Support\LowLevel\Arr; /** - * ### Array HashEngine + * ### Array Hash Engine * * Simple PHP array-backed hash table engine.
* Fast, memory-resident, no collision strategy beyond PHP array behavior. diff --git a/src/support/lowlevel/firehub.StrSB.php b/src/support/lowlevel/firehub.StrSB.php index 8b0fef4a..dab01d87 100644 --- a/src/support/lowlevel/firehub.StrSB.php +++ b/src/support/lowlevel/firehub.StrSB.php @@ -29,6 +29,7 @@ use function addcslashes; use function chunk_split; use function count_chars; +use function crc32; use function explode; use function implode; use function lcfirst; @@ -1236,4 +1237,20 @@ public static function format (string $format, null|bool|float|int|string ...$va } + /** + * ### Calculates the crc32 polynomial of a string + * @since 1.0.0 + * + * @param string $string

+ * The data. + *

+ * + * @return int crc32 checksum of string as an integer. + */ + public static function crc32 (string $string):int { + + return crc32($string); + + } + } \ No newline at end of file diff --git a/tests/unit/support/lowlevel/StrSBTest.php b/tests/unit/support/lowlevel/StrSBTest.php index 3f47d516..3cc07759 100644 --- a/tests/unit/support/lowlevel/StrSBTest.php +++ b/tests/unit/support/lowlevel/StrSBTest.php @@ -961,4 +961,19 @@ public function testFormat (string $expected, string $format, null|bool|float|in } + /** + * @since 1.0.0 + * + * @param int $expected + * @param string $string + * + * @return void + */ + #[TestWith([2191738434, 'The quick brown fox jumped over the lazy dog.'])] + public function testCrc32 (int $expected, string $string):void { + + self::assertSame($expected, StrSB::crc32($string)); + + } + } \ No newline at end of file From 61ae7d5398068d915b2ac0b8423c59813b3d7526 Mon Sep 17 00:00:00 2001 From: Riddick Date: Thu, 28 May 2026 15:16:23 +0200 Subject: [PATCH 76/79] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- dist/core.min.phar | Bin 270096 -> 270096 bytes dist/core.phar | Bin 865918 -> 865918 bytes 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03b02789..a5357385 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add `Map` and `Associative` data structures with advanced capabilities (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`15b5c3a`](https://github.com/The-FireHub-Project/Core-Foundation/commit/15b5c3a)) +- Add `crc32` checksum calculation to `StrSB` with unit test coverage (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`15b5c3a`](https://github.com/The-FireHub-Project/Core-Foundation/commit/15b5c3a)) ### Changed -- Replace `ArrMapStorage` with new `HashStorage` abstraction; introduce pluggable `HashEngine` and remove outdated array-based initializers (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`0c8970b`](https://github.com/The-FireHub-Project/Core-Foundation/commit/0c8970b)) +- Replace `ArrMapStorage` with new `HashStorage` abstraction; introduce pluggable `HashEngine` and remove outdated array-based initializers (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`b430fe0`](https://github.com/The-FireHub-Project/Core-Foundation/commit/b430fe0)) ### Fixed - Replace `addFirst` with `addLast` in `Vector` initialization logic (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`377be90`](https://github.com/The-FireHub-Project/Core-Foundation/commit/377be90)) diff --git a/dist/core.min.phar b/dist/core.min.phar index 5d7c63324c9dbd13fc6107dcf498c1349e43f31e..8f721f9c356d75eb51191d3368878e3cd5fd0508 100644 GIT binary patch delta 2841 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 diff --git a/dist/core.phar b/dist/core.phar index 4ae9602e52807a88e1fc0d7b772a1518f3298523..5f3ca22c7657d1ddddcd46edf4be25789191aee7 100644 GIT binary patch delta 2901 zcmYLKc~lf<5^s8jW?%*whHI1?29Wz4F1b&+K?M;7Wf4(>fC7eHT_%QrNJMa3>=B57 z7ZTTOJQf}r1q2sXUCDajfd~3DcyL5TLez!rs^0hZk8ggju3yzx{Z-A}xaZusXWd=0 zEO6g_C-#>XsMrB`sMrInQ3(Jzq_P-bL?sx&gp2}MPoi{!j0WjF83f?TTLMtVLze;G zQjm=J=$XL}1*w&f0ptATAcd-;=eMd6Al+0&PdzFeq;$$3KuMwU0TmCDof>8+QVS53 z1xh!Ssu9FgRInReAY8yWZzqlDU)A{FH>2hQ;41J2*eF1%HbEFj;~coDV?ibAnENO7 z5U|aw<3)lsFk7ug3@Ar5(8W@SE;&MsYZnHB?UgVQz)yq$yG59`Pvi#58IcQsttJ++ zRuj9~tQiT)G0g-3Z!MG*TB#u2)xxegX=CGdYGa}++Oc4hh_Q&3VziwSW7;`!64;V- zlCd3je1a%wTuRX`rk1q1M2~5a^MsU;)v`|0I_MiIL4pR!GKid#EW^k*tWUVT+jER8 z)U^Uzy)Gtxri+Q~^j4r}j|M^5d}w${kLtP8m-Gz4b65{K?e$lKRHeTP;DvrVK!`ya zK%)UlzZqnLw89WQ|8AIpoc%n4XmPm5r?U(L=v7jEaM>zFmLVy|IV`|{-3!t%piZ42 z9BL~U(^L8Z%pN7FO;xgGu~9(_vmyBC!j%B?3)chW8e!4_qctEcGDhMGVEoq=DF42l7Za0ZP1ne84u$o!)7x3nT|j z@uQ5H;v01{O95q-Sw6t5*+zhD^HP9E=0yNYEeZhoED8bSmN*(;S;m2M!xHPWx8mAf zBq9j@vCV39x1o&bZYKrwS}PqUsGXEhSpvNJGb@a9mElPJQRW3Kr#W~f^8?A+nj4!s zw)m2td%b8EYdeEwq0WUH3M(|ZdjWQBE*@k}Hcaz+p1Rl}ma_on9_sr<|6ps)1f3#9 z;*tNw0M@rkuF+d;t+m3linD-F%?hhpYs0;In^0`5StRS)&uj$}NqA0nUe?x}b>MzZ z3*BY5IAgiCxN?r#24Pe$Yi!OA8iWMWn4*Gwh*)gI)djfZ$TWf3M#;3p@j7gWwowjD?Q!?4vv-GnDedv8e6Y{NGR~3&QFKqYlwO-) zNSk?R(ZP-)y3WA?TrWD{2TQiA2kvhzff~QLzWz}rxC+D@mkl})~ogC=6;w6(5R`8$Pf~x7A4d zH#Yu4%8z4oom(L7=&py#)2woLdDASb^k!uJq#<>LOVi?x<2C1w6=r&1gwa?ca*BA25}ogCvPIVswUn@*Y~ZOna(?9zeFts#KU)+YNq?-Vjv~M4# zgXBI;%XLzhI=~f?>5UmWIS~6`ErmYV$sta1@kN&^U%c{jUv7OIX5;q`r<=0Zf_#R| zjwYUjYUWs5{jk!{emMLYi*ek07bCfaKiYQqBkLW199YMI6l_)%8{geOMY12phw-{c z>QHqY zpeqiQ7V*eZ8J`Qvsd&6(Y699WC9DIbED^h0o`~TSiQb^JNslh><|*fyY1*u!U!DtjpQsIf=D9(DF; zut(TgpDcRxOu;+8G_ozVf8_B~PEcmIU~D z6X&Zu&U|=63{SW7FJJ#!@viyKEf3SfzYw=eU+-CcZ|+9ZpI=@K?okWd-%`ZCul3;R mjQ%%0CmZSWs!yq_EpAte!y?3e(JMv>c7P-VJG7zkq5lP_s1)`9 delta 2901 zcmYLKc~nzp7Js~igpdT1umxFV5dwsL3tJ$v$PNmqP&Sc85n;fsgGwt(-Kyvtd{Ah? zt%|J*+G=rQ81P8ZN{cfnpe-^`Tu^idtp^q7-TQjZ{PE>??)JO)yYIUhvz=DhdC?HWfNk)V8Us4U=%~=Gnm4hxf zIEz6tvE(T0-Q$W&aqvsy&2#^M}(bJF@4pKTV2%w&a%3)qSND4k?sNe^S z&IZa?Z{icgbX2GZRVp;4T`Ng5>II(*ey{od0PZ?|0IPJ6>V(chkfvDh5MV*;1(^Ga zAPj6D1bC59UCg#$HwKg=y69pfM3;Oa#}2oNB`fL$U?+b!|{sywge)lWlJ#fDdQ9F&o2Y;vBA;!#3l};+csFAlP%l! z3K2nYkC*VNP7^!2vz64La%`ovx|Njia&_?PW40LQZigfFv7Illw6pNoE&wEZdvnzv_NVopG?I)u&03 zWaQ5nz`Db-o77(%?DfKP*X05s-xjONS-`&f1sZIuRV3ruLze@IEIdDNO>TMqN^t*9 z58dq?aK;K9aOE6xP-9dVV{Fb-_d)`BOhxHhhzK-e>jGSKbcVp}@ww}Yz<4|j>9QT! z4d#gRf8P;D)?9%bB};+hbwq)-Q5GznaQCcq@`QfXJKhiOv6R(g`y1$BJz&pmMnb5bcIlz$VhO`%1kht^nlB)FxpdW-EbHL_tn^&~4u57Kj(b-ilFtu9+vXr-{Z|kUtV?hzHftvn-`O)wG9SjD_Ps|+ zd9^I#{os6b7+}N=KG%1n!@i;aJ2Zu0&2K}nRm;@46iVU{S?j+?O#Z>Bb`UrdZ538e0S|F>xgT z9dW3fACD|G@r9tAj>k);C7|tE!b(uuC1RJW6EXZ*q8}(1B>4bjCgD&wCaFLgOu~Ve zC#$d>n}r1NpMv`H)M%119WhIq^Pb^9WOZHgXLZS1%psY>VGfr$+RWiGhtC`x<_MUh z%N*gwx@6IVv8wi8R$HXx2gr|b3#Wfw67<|=nfw>uzLvB>!*tc1&c%s+Ztiyq&Rq_i zw4G8ZrFXim{TsF=wmv*}Y2QF|W7g33@s0-HCD{E&bQcW$7FMk0PMAIwU+wwnZ>6I0 zTaB+?Up4+DYpp@bH1+#Wny2!NYwxE&*X`M`{;Xz`_r~qzgV|Ls%5R3=$gybIN4>aLW4I&0&|@+&PD=;fp9 z&_preKX)i>W<}iBE{5A8-u2f0a49a`&+6UeY)xx}#`E{#>v^6$z4Oyk@Hlwr~-FrGGGRv{GJK?xPyY%MrA9EgdRbF+m3HdnQb1Xnv zR9bL5jv9{e>6ch7899>es%mo>+_T3y^abZ+O@`J3HSwDN0ocnfJpcdz From aba8b4cbe6eb240a4495a01a3589d78037ee21b1 Mon Sep 17 00:00:00 2001 From: Riddick Date: Thu, 28 May 2026 15:18:24 +0200 Subject: [PATCH 77/79] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5357385..727024b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.3.2...feature/support-high-level-api) +## [v0.3.3](https://github.com/The-FireHub-Project/Core-Foundation/compare/v0.3.2...v0.3.3) – 2026-05-28 ### Added - Add `Map` and `Associative` data structures with advanced capabilities (issue: [#11](https://github.com/The-FireHub-Project/Core-Foundation/issues/11), pr: [#13](https://github.com/The-FireHub-Project/Core-Foundation/pull/13), commit: [`15b5c3a`](https://github.com/The-FireHub-Project/Core-Foundation/commit/15b5c3a)) From db5b60652d65738ddf4c3fe26412ca31d9501036 Mon Sep 17 00:00:00 2001 From: Riddick Date: Thu, 28 May 2026 15:26:46 +0200 Subject: [PATCH 78/79] Update CHANGELOG.md --- dist/core.min.phar | Bin 270096 -> 270096 bytes dist/core.phar | Bin 865918 -> 865951 bytes src/support/lowlevel/firehub.Data.php | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/core.min.phar b/dist/core.min.phar index 8f721f9c356d75eb51191d3368878e3cd5fd0508..987d26d667a695d300315dfbe62a5253b96ee078 100644 GIT binary patch delta 2841 zcmYLK30PBi63+`HawH@`fFR)}TnTc^eFXw?1_T9>Ac!c301iN?WY!;!;#rwBoX#tqNKcEQ>`bqKF5uZ|3cGzYq9*Gyj?29B*c*?G)D1KR>g} z6bJ9Q(0@rS!U@2Wa0XaI1OXf;0ssbxPylmw6u^2mN~hS-AWgGF0K7Do0qoR3lOB!b zAem{RrCL(~QnMyHjBBQVq~M_CevT5PehylSxDgy}grsV^WuZ2`6wZcIfXTV(>6WXecu`g+d z!P|m1780t1(LUCR0p)-Wn%L-~NvtR=11lYJ;0t|Fj5DRYxLQG47coX$oWAk`SH26$qW4iILX z22gK|(ktUkkWx+1@>>%%a(+!mH(Js>LuQ)Qq%aq)fZk7jCBqao7t%WAA9I?Q! zGHQWC>TbCLlr@$`0JE0)06A9M0UlUw0a$Kb4A5;|0^n_fyHRBm2huGYOwieu>H94< zi&ay0dw{%bVn<6r9@_7_;*SNh)R5C7UkmAEs9xlde)H z<7CB>lDra4nie(*@XFEYTKdVJ(sL)Yg^dE{1+dvOrIU40PlA9f*)bSodiyNkeA0x}2nRt5zHZ_RHVjUUc_y7?lxlZu7W^_JudUg)DSQ{Mh z&YW-vLGxOg_L7tQ1E3YhY$+~+m@F=n6yTVpJ`ZCaxIxEkFhH&~j?B$+#El3n2?s9dSs}aN7l+@ zVEQ*14!yn{C#O)Z24$~28^FZ{X+Cnn!F%e0)2Ljs8cBbrN#FJlUm?4Eq*T^jLZ2GA zM;LNPX*KQoc1ad6s9lk^g8_Xvybt+qcpomi;bfS(<3#Oo&-f!(vaaS9S?eB5$~{DX zC>`6|meNWe>Rc3I!hObsY4X5@n)kpAGd(fG?>#Yli5EhpS1M$3*9&X$_C}LhZ}gjB zr0Av0J`U5Qy-`)2KxYu0)$ZH*l zZ|?^p;hjKSOnJ}>?9m`im^G(&p8g)bRQxMKpZkbOaWE(s4YcV+;|H|QpuzRo{~H_& z#&q8XV~5g0aQja)@FoOGu+s@w>?DHp7;%*oQ%gBS0>ib1ByRFkT<>jtj z^9LF?wJ#j;6Q}lV{LAL@6zw*PoStphwAx(P`mS}qmHmk=udbr$w*qf>&2i6}k&5{b zXRW?dcQkVcH8^U?rMZ?ERiv3vu-3TlW`FM?Z?nt<-BZdnipUi@;t)uk^B#>C%ea)>o>)v2V^!SIk}b)aQb{e7^NToa)%)Ucb_lP5m#XM5C`KK3S+L zRJ?R+{+zN_l8(g|uRA$9I+f>nLC*|?eS7*v?`5oa?QY&ve5dA6_1DF-g5CR*8t#1A zFnwtEnW@B#G=Jr(;`#Ai$5r{wv+t_;PyJ&1OxcDj>*{9G_3M6=J&b+Bnd^-BU6##v z$(nkk6~Apq(hb(;k@4nlPL>R}w8j21VwBpVagVBzcim2Y*Ap3Q&B@(vP%-4$u~!knJpC(bGcz3t>em;uZe^O6Txk delta 2841 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 diff --git a/src/support/lowlevel/firehub.Data.php b/src/support/lowlevel/firehub.Data.php index f3970fed..4f5db9c0 100644 --- a/src/support/lowlevel/firehub.Data.php +++ b/src/support/lowlevel/firehub.Data.php @@ -237,7 +237,7 @@ public static function unserialize (string $data, bool|array $allowed_classes = return ($unserialized_data = unserialize( $data, - ['allowed_classes' => $allowed_classes, 'max_depth' => $max_depth]) + ['allowed_classes' => $allowed_classes, 'max_depth' => $max_depth]) // @phpstan-ignore argument.type ) !== false ? $unserialized_data : throw new UnserializeFailedError; From c1c533083049857848777edd1a0c0f012aadaad4 Mon Sep 17 00:00:00 2001 From: Riddick Date: Fri, 29 May 2026 10:36:13 +0200 Subject: [PATCH 79/79] Correct typos, improve documentation consistency, and enhance mutation outcome handling for `HashStorage` and related components. **Detailed Description:** 1. **Fixed Typographical Errors:** - Corrected repeated typos where "AAssigns" was used instead of "Assigns" in several docblocks across `firehub.Map.php`, `firehub.HashStorage.php`, `firehub.HashEngine.php`, and `firehub.KeyMutation.php`. - Ensured uniform punctuation, such as adding missing periods in method descriptions. 2. **Improved Mutation Outcome Logic:** - Refactored `set` and `remove` methods in `ArrHashEngine` to improve mutation outcome handling by caching the key existence check (`has($key)`) before and after the operation. - Reduces redundant calls to `has($key)` for performance optimization while maintaining correct return values (`CREATED`, `UPDATED`, `REMOVED`, `NOT_FOUND`). 3. **Enhanced Default Behavior for `HashStorage`:** - Introduced `ArrHashEngine` as the default engine in the `HashStorage` constructor, ensuring the class can operate independently if no engine is provided. - Updated relevant docblocks to explain the optional `HashEngine` parameter and clarified behavior when no engine is explicitly set. 4. **Documentation Updates:** - Adjusted docblocks across affected files to match established conventions within the project. This includes improved clarity, consistent formatting, and better readability. 5. **PHAR Build Updates:** - Recompiled `core.phar` and `core.min.phar` to include both the typo corrections and the logic improvements for mutation outcomes. **Key Benefits:** - Enhances code clarity and ensures accurate documentation for developers. - Improves runtime efficiency by optimizing mutation outcome handling. - Provides a seamless and self-contained `HashStorage` setup with sensible defaults. - Ensures PHAR builds reflect all recent improvements for consistency across distributions. --- dist/core.min.phar | Bin 270096 -> 270278 bytes dist/core.phar | Bin 865951 -> 866436 bytes .../capability/firehub.KeyMutation.php | 2 +- .../storage/engine/firehub.ArrHashEngine.php | 8 +++++-- .../storage/firehub.HashEngine.php | 2 +- .../storage/firehub.HashStorage.php | 20 ++++++++++++++---- .../datastructure/structure/firehub.Map.php | 8 +++---- .../structure/firehub.Vector.php | 4 ++-- 8 files changed, 30 insertions(+), 14 deletions(-) diff --git a/dist/core.min.phar b/dist/core.min.phar index 987d26d667a695d300315dfbe62a5253b96ee078..ede0413892b482460e735fc31a13627e278d95e9 100644 GIT binary patch delta 3466 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 delta 3358 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 diff --git a/dist/core.phar b/dist/core.phar index dcac48ae09c8dafa3a06293b7054b993173c3c74..d7f6964cd4d1f01123527dd481ea005bcdd95a04 100644 GIT binary patch delta 3984 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 delta 3915 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 + $this->data[$key] = $value; - return $this->has($key) + return $exists ? MutationOutcome::UPDATED : MutationOutcome::CREATED; @@ -118,9 +120,11 @@ public function set (int|string $key, mixed $value):MutationOutcome { */ public function remove (int|string $key):MutationOutcome { + $exists = $this->has($key); + unset($this->data[$key]); - return $this->has($key) + return $exists ? MutationOutcome::REMOVED : MutationOutcome::NOT_FOUND; diff --git a/src/support/datastructure/storage/firehub.HashEngine.php b/src/support/datastructure/storage/firehub.HashEngine.php index dd857d64..1e149860 100644 --- a/src/support/datastructure/storage/firehub.HashEngine.php +++ b/src/support/datastructure/storage/firehub.HashEngine.php @@ -82,7 +82,7 @@ public function get (int|string $key):Maybe; /** * ### Set Value by Key * - * AAssigns a value to the specified key in the associative hash engine. If the key already exists, the existing + * Assigns a value to the specified key in the associative hash engine. If the key already exists, the existing * value is overwritten. If it does not exist, a new entry is created. This operation is fundamental for * key-value-based structures and does not involve positional logic or traversal. * @since 1.0.0 diff --git a/src/support/datastructure/storage/firehub.HashStorage.php b/src/support/datastructure/storage/firehub.HashStorage.php index e99a1bd1..5992e410 100644 --- a/src/support/datastructure/storage/firehub.HashStorage.php +++ b/src/support/datastructure/storage/firehub.HashStorage.php @@ -17,6 +17,7 @@ use FireHub\Core\Support\DataStructure\Storage\Capability\ { Cloneable, Convertible, KeyAccess, KeyMutation, StorageMetricsAware }; +use FireHub\Core\Support\DataStructure\Storage\Engine\ArrHashEngine; use FireHub\Core\Shared\Type\Maybe; use FireHub\Core\Shared\Enums\MutationOutcome; use FireHub\Core\Throwable\Exception\Support\DataStructure\ { @@ -44,21 +45,32 @@ final readonly class HashStorage implements Storage, Convertible, Cloneable, StorageMetricsAware, KeyAccess, KeyMutation { + /** + * ### Hash Engine + * @since 1.0.0 + * + * @var \FireHub\Core\Support\DataStructure\Storage\HashEngine + */ + private HashEngine $engine; + /** * ### Constructor * @since 1.0.0 * * @uses \FireHub\Core\Support\DataStructure\Storage\HashEngine As parameter. + * @uses \FireHub\Core\Support\DataStructure\Storage\Engine\ArrHashEngine As default hash engine. * - * @param \FireHub\Core\Support\DataStructure\Storage\HashEngine $engine

+ * @param null|\FireHub\Core\Support\DataStructure\Storage\HashEngine $engine [optional]

* Hash Engine. *

* * @return void */ - public function __construct( - private HashEngine $engine - ) {} + public function __construct (?HashEngine $engine = null) { + + $this->engine = $engine ?? new ArrHashEngine(); + + } /** * @inheritDoc diff --git a/src/support/datastructure/structure/firehub.Map.php b/src/support/datastructure/structure/firehub.Map.php index 48bb0dd7..2d35620d 100644 --- a/src/support/datastructure/structure/firehub.Map.php +++ b/src/support/datastructure/structure/firehub.Map.php @@ -191,7 +191,7 @@ public function dehydrate ():DehydratedState { * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\KeyMutation::set() To set the value of a key. * * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException If the data - * structure is not of the expected type + * structure is not of the expected type. */ public static function hydrate (DehydratedState $state):static { @@ -298,7 +298,7 @@ public function get (int|string $key):Maybe { /** * ### Set Value by Key * - * AAssigns a value to the specified key in the associative storage. If the key already exists, the existing + * Assigns a value to the specified key in the associative storage. If the key already exists, the existing * value is overwritten. If it does not exist, a new entry is created. This operation is fundamental for * key-value-based structures and does not involve positional logic or traversal. * @since 1.0.0 @@ -336,7 +336,7 @@ public function set (int|string $key, mixed $value):MutationOutcome { /** * ### Set Value by Key if exists * - * AAssigns a value to the specified key in the associative storage. If the key already exists, the existing + * Assigns a value to the specified key in the associative storage. If the key already exists, the existing * value is overwritten. If it does not exist, a new entry is created. This operation is fundamental for * key-value-based structures and does not involve positional logic or traversal. * @since 1.0.0 @@ -375,7 +375,7 @@ public function replace (int|string $key, mixed $value):void { /** * ### Set Value by Key if key doesn't exist * - * AAssigns a value to the specified key in the associative storage. If the key already exists, the existing + * Assigns a value to the specified key in the associative storage. If the key already exists, the existing * value is overwritten. If it does not exist, a new entry is created. This operation is fundamental for * key-value-based structures and does not involve positional logic or traversal. * @since 1.0.0 diff --git a/src/support/datastructure/structure/firehub.Vector.php b/src/support/datastructure/structure/firehub.Vector.php index 175bba11..09a6df6c 100644 --- a/src/support/datastructure/structure/firehub.Vector.php +++ b/src/support/datastructure/structure/firehub.Vector.php @@ -192,7 +192,7 @@ public function dehydrate ():DehydratedState { * to the storage. * * @throws \FireHub\Core\Throwable\Exception\Support\DataStructure\InvalidDataStructureException If the data - * structure is not of the expected type + * structure is not of the expected type. */ public static function hydrate (DehydratedState $state):static { @@ -289,7 +289,7 @@ public function last ():Maybe { * value and is optimized for fast boundary or presence checks within indexed structures. * @since 1.0.0 * - * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\IndexAccess::get() To check if index exists. + * @uses \FireHub\Core\Support\DataStructure\Storage\Capability\IndexAccess::has() To check if index exists. * * @param int $index

* The key to check for existence.