{"id":21524183,"url":"https://github.com/alcidesrc/sequence","last_synced_at":"2026-02-28T20:01:24.994Z","repository":{"id":235767502,"uuid":"791189464","full_name":"AlcidesRC/sequence","owner":"AlcidesRC","description":"Sequence your tasks and make complex workflows more readable","archived":false,"fork":false,"pushed_at":"2024-08-25T12:43:14.000Z","size":44,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-05T11:43:05.105Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/AlcidesRC.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-24T08:57:13.000Z","updated_at":"2024-08-25T12:43:17.000Z","dependencies_parsed_at":null,"dependency_job_id":"c6bad3d4-ceb5-4898-b0be-163bd25860db","html_url":"https://github.com/AlcidesRC/sequence","commit_stats":null,"previous_names":["fonil/sequence","alcidesrc/sequence"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/AlcidesRC/sequence","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlcidesRC%2Fsequence","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlcidesRC%2Fsequence/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlcidesRC%2Fsequence/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlcidesRC%2Fsequence/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlcidesRC","download_url":"https://codeload.github.com/AlcidesRC/sequence/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlcidesRC%2Fsequence/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29951039,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T18:42:55.706Z","status":"ssl_error","status_checked_at":"2026-02-28T18:42:48.811Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2024-11-24T01:21:24.346Z","updated_at":"2026-02-28T20:01:24.928Z","avatar_url":"https://github.com/AlcidesRC.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Continuous Integration](https://github.com/fonil/sequence/actions/workflows/ci.yml/badge.svg)](https://github.com/fonil/sequence/actions/workflows/ci.yml)\n\n\n# Sequence\n\n\n\u003e Sequence your tasks and make complex workflows more readable\n\n\n[TOC]\n\n\n## Summary\n\nThis repository contains a [Chain of Responsability](https://refactoring.guru/design-patterns/chain-of-responsibility) design pattern implementation built with PHP.\n\n## Requirements\n\nThis library requires PHP^8.3\n\n## Installation\n\nInstall `Sequence` using Composer:\n\n```bash\ncomposer require fonil/sequence\n```\n\n## Usage\n\nCreate a `Sequence` instance and attach any type of payload through a simple interface:\n\n```php\n$result = Sequence::run(FirstTask::class)\n\t-\u003ethen(SecondTask::class)\n\t...\n\t-\u003ethen(LastTask::class)\n\t-\u003estartWith('payload');\n```\n\n### Tasks\n\n`Sequence` requires at least a task to be run. You can attach any of the following entities as a task:\n\n- [Invokable Class](#invokable-class)\n- [Explicit Task](#explicit-task)\n- [Custom Class](#custom-class)\n- [Static Method](#static-method)\n- [Closure / Callback / Callable](#closure--callback--callable)\n\n#### Invokable Class\n\n```php\nclass InvokableIncrementCounter\n{\n    public function __invoke(array $payload): array\n    {\n        $payload['counter']++;\n        return $payload;\n    }\n}\n\n$result = Sequence::run(InvokableIncrementCounter::class)\n    -\u003estartWith(['counter' =\u003e 0]);\n\necho json_encode($result);\n// {\"counter\":1}\n```\n\n#### Explicit Task\n\n```php\nclass IncrementTask implements TaskInterface\n{\n    //...\n    \n    public function handle(mixed $payload = null): mixed\n    {\n        $payload['counter']++;\n        return $payload;\n    }\n}\n\n$result = Sequence::run(IncrementTask::class)\n    -\u003estartWith(['counter' =\u003e 0]);\n\necho json_encode($result);\n// {\"counter\":1}\n```\n\n#### Custom Class\n\n```php\nclass IncrementCounter\n{\n    public function add(array $payload): array\n    {\n        $payload['counter']++;\n        return $payload;\n    }\n}\n\n$result = Sequence::run([IncrementCounter::class, 'add'])\n    -\u003estartWith(['counter' =\u003e 0]);\n\n// OR\n\n$result = Sequence::run([new IncrementCounter(), 'add'])\n    -\u003estartWith(['counter' =\u003e 0]);\n\necho json_encode($result);\n// {\"counter\":1}\n```\n\n#### Static Method\n\n```php\nclass IncrementCounter\n{\n    public static function add(array $payload): array\n    {\n        $payload['counter']++;\n        return $payload;\n    }\n}\n\n$result = Sequence::run([IncrementCounter::class, 'add'])\n    -\u003estartWith(['counter' =\u003e 0]);\n\necho json_encode($result);\n// {\"counter\":1}\n```\n\n#### Closure / Callback / Callable\n\n```php\n$closure = function (array $payload): array {\n    $payload['counter']++;\n    return $payload;\n};\n\n$result = Sequence::run($closure)\n    -\u003estartWith(['counter' =\u003e 0]);\n\necho json_encode($result);\n// {\"counter\":1}\n```\n\n#### Sequence Instance\n\n```php\n$closure = function (array $payload): array {\n    $payload['counter']++;\n    return $payload;\n};\n\n$sequence = Sequence::run($closure)-\u003ethen($closure);\n\n$result = Sequence::run($sequence)\n    -\u003estartWith(['counter' =\u003e 0]);\n\necho json_encode($result);\n// {\"counter\":2}\n```\n\n### Examples\n\n```php\n$result = Sequence::run($closure)\t\t\t// 1st execution =\u003e $counter is 1\n\t-\u003ethen(InvokableIncrementCounter::class)\t// 2nd execution =\u003e $counter is 2\n\t-\u003ethen([IncrementCounter::class, 'increment'])\t// 3rd execution =\u003e $counter is 3\n\t-\u003ethen(IncrementTask::class)\t\t\t// 4th execution =\u003e $counter is 4\n\t-\u003estartWith(['counter' =\u003e 0]);\n\necho json_encode($result);\n// {\"counter\":4}\n```\n\n\n## Security Vulnerabilities\n\nPlease review our security policy on how to report security vulnerabilities:\n\n**PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY**\n\n### Supported Versions\n\nOnly the latest major version receives security fixes.\n\n### Reporting a Vulnerability\n\nIf you discover a security vulnerability within this project, please [open an issue here](https://github.com/fonil/sequence/issues). All security vulnerabilities will be promptly addressed.\n\n## License\n\nThe MIT License (MIT). Please see [LICENSE](./LICENSE) file for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falcidesrc%2Fsequence","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falcidesrc%2Fsequence","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falcidesrc%2Fsequence/lists"}