{"id":19538484,"url":"https://github.com/keyvanakbary/medusa","last_synced_at":"2026-03-14T11:34:33.058Z","repository":{"id":19089509,"uuid":"22317319","full_name":"keyvanakbary/medusa","owner":"keyvanakbary","description":"Immutable and persistent collections for PHP","archived":false,"fork":false,"pushed_at":"2016-05-11T08:26:52.000Z","size":39,"stargazers_count":154,"open_issues_count":0,"forks_count":13,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-04-13T08:44:51.650Z","etag":null,"topics":["immutable-datastructures","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/keyvanakbary.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-07-27T17:41:08.000Z","updated_at":"2024-09-27T06:39:32.000Z","dependencies_parsed_at":"2022-09-22T14:25:42.013Z","dependency_job_id":null,"html_url":"https://github.com/keyvanakbary/medusa","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/keyvanakbary/medusa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/keyvanakbary%2Fmedusa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/keyvanakbary%2Fmedusa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/keyvanakbary%2Fmedusa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/keyvanakbary%2Fmedusa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/keyvanakbary","download_url":"https://codeload.github.com/keyvanakbary/medusa/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/keyvanakbary%2Fmedusa/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261289391,"owners_count":23136068,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["immutable-datastructures","php"],"created_at":"2024-11-11T02:35:00.155Z","updated_at":"2026-03-14T11:34:32.971Z","avatar_url":"https://github.com/keyvanakbary.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Medusa\n\n[![Build Status](https://secure.travis-ci.org/keyvanakbary/medusa.svg?branch=master)](http://travis-ci.org/keyvanakbary/medusa)\n\n*Immutable* and *persistent* collections for PHP.\n\nLife would be a lot simpler if we had *immutable* data structures. Code would be easier to understand, easy to test and free of side-effects. Being *immutable* is not all, these data structures must be efficient. By making them *persistent*, collections reuse internal structure to minimize the number of operations needed to represent altered versions of an instance of a collection.\n\n\n## Installation\n\nTo install this library, run the command below and you will get the latest version\n\n    composer require keyvanakbary/medusa\n\n## Usage\n\n### Persistent Stack\n\n```php\n$s = Medusa\\Stack\\PersistentStack::createEmpty();\n\n$s1 = $s-\u003epush(1);\n$s2 = $s1-\u003epop();\necho $s1-\u003epeek();//1\necho $s2-\u003epeek();//Runtime exception\n```\n\n#### Complexity\noperation | big-O\n----------|------\npush      | O(1)\npeek      | O(1)\npop       | O(1)\nisEmpty   | O(1)\ncount     | O(1)\n\n### Persistent Queue\n\n```php\n$q = Medusa\\Queue\\PersistentQueue::createEmpty();\n\n$q1 = $q-\u003eenqueue(1);\n$q2 = $q1-\u003edequeue();\necho $q1-\u003epeek();//1\necho $q2-\u003epeek();//Runtime exception\n```\n\n#### Complexity\noperation | big-O\n----------|------\nisEmpty   | O(1)\npeek      | O(1)\nenqueue   | O(1)\ndequeue   | O(1) in average, O(n) in some cases\ncount     | O(1)\n\n### Persistent AVL Tree\n\n```php\n$t = Medusa\\Tree\\PersistentAvlTree::createEmpty();\n\n$t1 = $t-\u003eadd(1, 'one');\n$t2 = $t1-\u003eremove(1);\necho $t1-\u003esearch(1)-\u003evalue();//one\necho $t2-\u003elookup(1);//Runtime exception\n```\n\n#### Complexity\noperation | big-O\n----------|------\nisEmpty   | O(1)\nvalue     | O(1)\nkey       | O(1)\nadd       | O(1)\nsearch    | O(log(n))\ncontains  | O(log(n))\nheight    | O(1)\nlookup    | O(log(n))\n\n### Persistent Red-Black Tree\n\n```php\n$t = Medusa\\Tree\\PersistentRedBlackTree::createEmpty();\n\n$t1 = $t-\u003eadd(1, 'one');\n$t2 = $t1-\u003eremove(1);\necho $t1-\u003esearch(1)-\u003evalue();//one\necho $t2-\u003elookup(1);//Runtime exception\n```\n\n#### Complexity\noperation | big-O\n----------|------\nisEmpty   | O(1)\nvalue     | O(1)\nkey       | O(1)\nadd       | O(1)\nsearch    | O(log(n))\ncontains  | O(log(n))\nheight    | O(1)\nlookup    | O(log(n))\nmin       | O(log(n))\nremoveMin | O(log(n))\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkeyvanakbary%2Fmedusa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkeyvanakbary%2Fmedusa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkeyvanakbary%2Fmedusa/lists"}