Skip to content

Latest commit

 

History

History
110 lines (88 loc) · 3.65 KB

File metadata and controls

110 lines (88 loc) · 3.65 KB

Containers-KeyedTree

A hierarchical data structure that provides path-based access to nested elements with dictionary-like functionality. Perfect for configuration management, file system structures & hierarchical data organization.

Pharo Version License: MIT

What is a KeyedTree?

A KeyedTree is a specialized dictionary that allows nested structures where values can be accessed through path-based keys. Each node can contain both direct values and subtrees, enabling hierarchical data organization similar to file systems or nested configurations.

Loading

The following script installs Containers-KeyedTree in Pharo.

Metacello new
  baseline: 'ContainersKeyedTree';
  repository: 'github://pharo-containers/Containers-KeyedTree/src';
  load.

If you want to depend on it

Add the following code to your Metacello baseline or configuration:

spec 
   baseline: 'ContainersKeyedTree' 
   with: [ spec repository: 'github://pharo-containers/Containers-KeyedTree/src' ].

Why use Containers-KeyedTree?

KeyedTrees solve the problem of organizing hierarchical data with efficient path-based access. Perfect for configuration files, menu systems, and any data that naturally forms a tree structure.

Key Benefits

  • Hierarchical Organization: Natural tree structure for nested data
  • Path-based Access: Access deep elements with simple path arrays
  • Flexible Values: Store any object type at any level
  • Merge Capability: Combine trees intelligently
  • Dictionary Compatibility: Inherits from Dictionary for familiar API

Basic Usage

"Create a hierarchical structure"
tree := CTKeyedTree new.

"Add simple values"
tree at: #name put: 'MyApp'.
tree at: #version put: '1.0.0'.

"Create nested structures"
config := CTKeyedTree new.
config at: #host put: 'localhost'.
config at: #port put: 8080.
tree at: #server put: config.

"Access with paths"
tree atPath: #(server host). "=> 'localhost'"
tree atPath: #(server port). "=> 8080"
tree atPath: #(version).     "=> '1.0.0'"

Real-World Use Cases

"Build a hierarchical menu structure for GUI Applications"
mainMenu := CTKeyedTree new.

"File menu"
fileMenu := CTKeyedTree new
    at: #new put: 'Create New Document';
    at: #open put: 'Open Document';
    at: #recent put: (CTKeyedTree new
        at: #doc1 put: '/path/to/recent1.txt';
        at: #doc2 put: '/path/to/recent2.txt';
        yourself);
    at: #save put: 'Save Document';
    at: #exit put: 'Exit Application';
    yourself.

"Edit menu"
editMenu := CTKeyedTree new
    at: #undo put: 'Undo Last Action';
    at: #redo put: 'Redo Last Action';
    at: #copy put: 'Copy Selection';
    at: #paste put: 'Paste Content';
    yourself.

"Tools menu with nested submenus"
toolsMenu := CTKeyedTree new
    at: #preferences put: (CTKeyedTree new
        at: #general put: 'General Settings';
        at: #appearance put: 'Theme & UI';
        at: #shortcuts put: 'Keyboard Shortcuts';
        yourself);
    at: #plugins put: 'Manage Plugins';
    yourself.

mainMenu 
    at: #file put: fileMenu;
    at: #edit put: editMenu;
    at: #tools put: toolsMenu.

"Access menu items by path"
newAction := mainMenu atPath: #(file new).          "=> 'Create New Document'"
recentDoc := mainMenu atPath: #(file recent doc1).  "=> '/path/to/recent1.txt'"
themeSettings := mainMenu atPath: #(tools preferences appearance). "=> 'Theme & UI'"

Contributing

This is part of the Pharo Containers project. Feel free to contribute by implementing additional methods, improving tests, or enhancing documentation.