Psl Noise - 4.1.0
This release introduces two major new data structure components to the PHP Standard Library: Tree and Graph. These additions bring powerful hierarchical and relational data manipulation tools to PHP developers with PSL's signature type-safe API.
What's Changed
- chore: upgrade to mago beta-31 by @azjezz in #538
- chore: upgrade to mago beta-32 by @azjezz in #539
- feat: add reflection-based type functions for class members by @azjezz in #543
- chore: migrate from
maketojustby @azjezz in #544 - chore(ga): bump extractions/setup-just from 2 to 3 by @dependabot[bot] in #545
- feat: add Tree component for hierarchical data structures by @azjezz in #546
- feat: add Graph component with directed and undirected graph support by @azjezz in #547
- chore: add veewee to GitHub sponsors by @azjezz in #548
✨ New Features
🌳 Psl\Tree Component
A comprehensive tree data structure implementation for working with hierarchical data.
Features: Immutable tree nodes, functional operations (map, filter, reduce, fold), traversal algorithms (pre-order, post-order, level-order), search utilities, and conversion functions.
use Psl\Tree;
// Create and manipulate trees
$tree = Tree\tree('root', [
Tree\leaf('child1'),
Tree\tree('child2', [Tree\leaf('grandchild')]),
]);
// Functional operations
$doubled = Tree\map($tree, fn($x) => $x . '!');
$values = Tree\pre_order($tree); // ['root', 'child1', 'child2', 'grandchild']
$count = Tree\count($tree); // 4
// Build from database records
$tree = Tree\from_list(
$records,
fn($r) => $r['id'],
fn($r) => $r['parent_id'],
fn($r) => $r['name']
);Use Cases: File systems, organizational hierarchies, DOM structures, category trees, menu systems.
🕸️ Psl\Graph Component
A robust graph data structure implementation supporting both directed and undirected graphs with algorithms for analysis and pathfinding.
Features: Immutable graphs, weighted/unweighted edges, BFS/DFS traversal, shortest path (Dijkstra/BFS), topological sorting, cycle detection, flexible node types.
use Psl\Graph;
// Create and traverse graphs
$graph = Graph\directed();
$graph = Graph\add_edge($graph, 'A', 'B');
$graph = Graph\add_edge($graph, 'B', 'C');
$path = Graph\shortest_path($graph, 'A', 'C'); // ['A', 'B', 'C']
$sorted = Graph\topological_sort($graph); // ['A', 'B', 'C']
// Weighted graphs
$graph = Graph\add_edge($graph, 'NYC', 'Boston', 215);
$graph = Graph\add_edge($graph, 'NYC', 'Philadelphia', 95);
$graph = Graph\add_edge($graph, 'Philadelphia', 'Boston', 310);
$route = Graph\shortest_path($graph, 'NYC', 'Boston'); // ['NYC', 'Boston']
// Undirected graphs
$social = Graph\undirected();
$social = Graph\add_edge($social, 'Alice', 'Bob');Use Cases: Dependency resolution, route finding, social networks, state machines, task scheduling.
🔍 Reflection-Based Type Functions
New type functions for runtime validation of class members using PHP's reflection API:
Type\constant_name_of()- Validate constant namesType\enum_case_of()- Validate enum case namesType\method_name_of()- Validate method names (case-insensitive)Type\property_name_of()- Validate property names
Each includes visibility-specific variants (public_*, protected_*, private_*).
use Psl\Type;
Type\method_name_of(MyClass::class)->assert('someMethod');
Type\property_name_of(MyClass::class)->assert('someProperty');
Type\public_constant_name_of(MyClass::class)->assert('SOME_CONSTANT');🛠️ Tooling Updates
- Migration to
just: Migrated frommaketojustfor improved cross-platform compatibility and developer experience
⬆️ Dependency Updates
magoupdated to1.0.0-beta.32actions/setup-justbumped from v2 to v3- Various development dependency updates
🤝 Contributors
@veewee has been added to GitHub sponsors
Full Changelog: 4.0.1...4.1.0