{"id":27238147,"url":"https://github.com/wiz-develop/php-monad","last_synced_at":"2025-04-10T19:00:03.344Z","repository":{"id":237939936,"uuid":"795536323","full_name":"wiz-develop/php-monad","owner":"wiz-develop","description":"📦 Implemented the concept of monads in functional programming in PHP.","archived":false,"fork":false,"pushed_at":"2025-04-08T05:05:32.000Z","size":132,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-08T05:30:30.283Z","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/wiz-develop.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-05-03T13:46:54.000Z","updated_at":"2025-04-08T04:59:29.000Z","dependencies_parsed_at":"2025-03-12T17:25:10.762Z","dependency_job_id":"873d98ba-53e4-499a-b79a-7796498ee426","html_url":"https://github.com/wiz-develop/php-monad","commit_stats":null,"previous_names":["endou-mame/php-monad","wiz-develop/php-monad"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wiz-develop%2Fphp-monad","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wiz-develop%2Fphp-monad/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wiz-develop%2Fphp-monad/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wiz-develop%2Fphp-monad/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wiz-develop","download_url":"https://codeload.github.com/wiz-develop/php-monad/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247785951,"owners_count":20995645,"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":[],"created_at":"2025-04-10T19:00:02.760Z","updated_at":"2025-04-10T19:00:03.329Z","avatar_url":"https://github.com/wiz-develop.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# php-monad\n\n[![Latest Stable Version](https://img.shields.io/packagist/v/wiz-develop/php-monad.svg?style=flat-square)](https://packagist.org/packages/wiz-develop/php-monad)\n[![Minimum PHP Version](https://img.shields.io/packagist/php-v/wiz-develop/php-monad.svg?style=flat-square)](https://packagist.org/packages/wiz-develop/php-monad)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/endou-mame/php-monad/ci.yml?branch=main\u0026style=flat-square)](https://github.com/endou-mame/php-monad/actions)\n[![License](https://img.shields.io/github/license/endou-mame/php-monad?style=flat-square)](LICENSE)\n[![Total Downloads](https://img.shields.io/packagist/dt/wiz-develop/php-monad.svg?style=flat-square)](https://packagist.org/packages/wiz-develop/php-monad)\n\n📦 PHP で関数型プログラミングのモナドの概念を実装したライブラリです。\n\n## 目次\n\n- [php-monad](#php-monad)\n  - [目次](#目次)\n  - [Features](#features)\n  - [Installation](#installation)\n  - [プロジェクト構造](#プロジェクト構造)\n  - [Usage](#usage)\n    - [Option Monad](#option-monad)\n    - [Result Monad](#result-monad)\n  - [API Reference](#api-reference)\n    - [Option\\\u003cT\\\u003e](#optiont)\n      - [静的メソッド](#静的メソッド)\n      - [インスタンスメソッド](#インスタンスメソッド)\n    - [Result\\\u003cT, E\\\u003e](#resultt-e)\n      - [静的メソッド](#静的メソッド-1)\n      - [インスタンスメソッド](#インスタンスメソッド-1)\n  - [Contributing](#contributing)\n  - [License](#license)\n  - [References](#references)\n\n## Features\n\n- `Option\u003cT\u003e` - 「値がある」(`Some\u003cT\u003e`)か「値がない」(`None`)かを表現する型\n- `Result\u003cT, E\u003e` - 「成功」(`Ok\u003cT\u003e`)か「失敗」(`Err\u003cE\u003e`)かを表現する型\n\n## Installation\n\n```bash\ncomposer require wiz-develop/php-monad\n```\n\n## プロジェクト構造\n\n以下の図は、php-monadプロジェクトの構造を表しています。コアライブラリ、テスト、ツールとその関連性を視覚的に示しています。\n\n```mermaid\nflowchart TD\n    %% Core Library Subgraph\n    subgraph \"Core Library\"\n        M(\"Monad\"):::core\n        O(\"Option\"):::core\n        R(\"Result\"):::core\n        SF(\"Shared Functions\"):::core\n        S(\"Some\"):::core\n        N(\"None\"):::core\n        OH(\"Option Helpers\"):::core\n        Ok(\"Ok\"):::core\n        Er(\"Err\"):::core\n        RH(\"Result Helpers\"):::core\n    end\n\n    %% Tests Subgraph\n    subgraph \"Tests\"\n        TI(\"Test Infrastructure\"):::test\n        OT(\"Option Tests\"):::test\n        RT(\"Result Tests\"):::test\n    end\n\n    %% Tooling and Configuration Subgraph\n    subgraph \"Tooling and Configuration\"\n        C(\"Composer\"):::tool\n        SA(\"Static Analysis\"):::tool\n        CS(\"Code Style\"):::tool\n        CICD(\"CI/CD\"):::tool\n        DEV(\"Dev Environment\"):::tool\n    end\n\n    %% Relationships within Core Library\n    M --\u003e|\"extends\"| O\n    M --\u003e|\"extends\"| R\n    O --\u003e|\"implements\"| S\n    O --\u003e|\"implements\"| N\n    O --\u003e|\"supports\"| OH\n    R --\u003e|\"implements\"| Ok\n    R --\u003e|\"implements\"| Er\n    R --\u003e|\"supports\"| RH\n    SF --\u003e|\"supports\"| O\n    SF --\u003e|\"supports\"| R\n\n    %% Relationships from Tests to Core Library Components\n    TI --\u003e|\"validates\"| O\n    TI --\u003e|\"validates\"| R\n    OT --\u003e|\"tests\"| O\n    RT --\u003e|\"tests\"| R\n\n    %% Relationships from Tools to Core Library (via Monad as a representative)\n    C --\u003e|\"manages\"| M\n    SA --\u003e|\"analyzes\"| M\n    CS --\u003e|\"styles\"| M\n    CICD --\u003e|\"CI/CD\"| M\n    DEV --\u003e|\"dev-environment\"| M\n\n    %% Styles for Nodes\n    classDef core fill:#AED6F1,stroke:#2471A3,stroke-width:2px;\n    classDef test fill:#A9DFBF,stroke:#239B56,stroke-width:2px;\n    classDef tool fill:#F9E79F,stroke:#B7950B,stroke-width:2px;\n\n    %% Click Events\n    click M \"https://github.com/endou-mame/php-monad/blob/main/src/Monad.php\"\n    click O \"https://github.com/endou-mame/php-monad/blob/main/src/Option.php\"\n    click S \"https://github.com/endou-mame/php-monad/blob/main/src/Option/Some.php\"\n    click N \"https://github.com/endou-mame/php-monad/blob/main/src/Option/None.php\"\n    click OH \"https://github.com/endou-mame/php-monad/blob/main/src/Option/functions.php\"\n    click R \"https://github.com/endou-mame/php-monad/blob/main/src/Result.php\"\n    click Ok \"https://github.com/endou-mame/php-monad/blob/main/src/Result/Ok.php\"\n    click Er \"https://github.com/endou-mame/php-monad/blob/main/src/Result/Err.php\"\n    click RH \"https://github.com/endou-mame/php-monad/blob/main/src/Result/functions.php\"\n    click SF \"https://github.com/endou-mame/php-monad/blob/main/src/functions.php\"\n    click TI \"https://github.com/endou-mame/php-monad/blob/main/tests/TestCase.php\"\n    click OT \"https://github.com/endou-mame/php-monad/tree/main/tests/Unit/Option\"\n    click RT \"https://github.com/endou-mame/php-monad/tree/main/tests/Unit/Result\"\n    click C \"https://github.com/endou-mame/php-monad/blob/main/composer.json\"\n    click SA \"https://github.com/endou-mame/php-monad/blob/main/phpstan.neon.dist\"\n    click CS \"https://github.com/endou-mame/php-monad/blob/main/.php-cs-fixer.dist.php\"\n    click CICD \"https://github.com/endou-mame/php-monad/tree/main/.github/workflows\"\n    click DEV \"https://github.com/endou-mame/php-monad/blob/main/.devcontainer/devcontainer.json\"\n```\n\nこの図は以下の構成要素を示しています：\n\n1. **コアライブラリ**：\n   - 基本となるMonadクラス\n   - Option型とそのSome/None実装\n   - Result型とそのOk/Err実装\n   - 共有関数やヘルパー関数\n\n2. **テスト**：\n   - テストインフラストラクチャ\n   - Option型とResult型のテスト\n\n3. **ツールと設定**：\n   - Composer（依存関係管理）\n   - 静的解析ツール\n   - コードスタイルチェック\n   - CI/CD設定\n   - 開発環境設定\n\n各ノードはGitHubリポジトリ内の該当ファイルにリンクされています。\n\n## Usage\n\n### Option Monad\n\n`Option\u003cT\u003e` は値が存在する可能性がある場合に使用します。`null` の代わりに使用することで、より型安全なコードを書くことができます。\n\n```php\nuse WizDevelop\\PhpMonad\\Option;\n\n// 値がある場合（Some）\n$some = Option::some(\"Hello, World!\");\necho $some-\u003eunwrap(); // \"Hello, World!\"\n\n// 値がない場合（None）\n$none = Option::none();\n// echo $none-\u003eunwrap(); // 例外が発生します\n\n// 値の存在チェック\nif ($some-\u003eisSome()) {\n    echo \"値が存在します\";\n}\n\n// デフォルト値の提供\necho $none-\u003eunwrapOr(\"Default Value\"); // \"Default Value\"\n\n// mapによる値の変換\n$length = $some-\u003emap(fn($str) =\u003e strlen($str)); // Option::some(13)\n\n// フィルタリング\n$filtered = $some-\u003efilter(fn($str) =\u003e strlen($str) \u003e 10); // Option::some(\"Hello, World!\")\n$filtered = $some-\u003efilter(fn($str) =\u003e strlen($str) \u003e 20); // Option::none()\n\n// 複数のOptionを連鎖\nfunction findUser(string $id): Option {\n    // ...\n}\n\nfunction getUserPreferences(User $user): Option {\n    // ...\n}\n\n$preferences = findUser(\"123\")\n    -\u003eflatMap(fn($user) =\u003e getUserPreferences($user));\n```\n\n### Result Monad\n\n`Result\u003cT, E\u003e` は処理が成功するか失敗するかを表現するのに使用します。例外を投げる代わりに使用することで、エラーハンドリングを型安全に行うことができます。\n\n```php\nuse WizDevelop\\PhpMonad\\Result;\n\n// 成功の場合（Ok）\n$ok = Result::ok(42);\necho $ok-\u003eunwrap(); // 42\n\n// 失敗の場合（Err）\n$err = Result::err(\"Something went wrong\");\n// echo $err-\u003eunwrap(); // 例外が発生します\necho $err-\u003eunwrapErr(); // \"Something went wrong\"\n\n// エラーチェック\nif ($ok-\u003eisOk()) {\n    echo \"処理は成功しました\";\n}\n\nif ($err-\u003eisErr()) {\n    echo \"エラーが発生しました\";\n}\n\n// デフォルト値の提供\necho $err-\u003eunwrapOr(0); // 0\n\n// mapによる値の変換\n$doubled = $ok-\u003emap(fn($n) =\u003e $n * 2); // Result::ok(84)\n\n// エラー値の変換\n$newErr = $err-\u003emapErr(fn($e) =\u003e \"Error: \" . $e); // Result::err(\"Error: Something went wrong\")\n\n// 複数のResultを連鎖\nfunction fetchData(string $url): Result {\n    // ...\n}\n\nfunction processData($data): Result {\n    // ...\n}\n\n$processed = fetchData(\"https://api.example.com\")\n    -\u003eflatMap(fn($data) =\u003e processData($data));\n```\n\n## API Reference\n\n### Option\\\u003cT\\\u003e\n\n#### 静的メソッド\n- `Option::some($value)` - Some\\\u003cT\\\u003eインスタンスを生成\n- `Option::none()` - Noneインスタンスを生成\n- `Option::from($value)` - 値からOptionを生成（nullの場合はNone、それ以外はSome）\n\n#### インスタンスメソッド\n- `isSome(): bool` - 値が存在するかチェック\n- `isNone(): bool` - 値が存在しないかチェック\n- `unwrap(): T` - 値を取り出す（Noneの場合は例外）\n- `unwrapOr($default): T` - 値を取り出すか、デフォルト値を返す\n- `map(callable $f): Option\u003cU\u003e` - 値を変換\n- `flatMap(callable $f): Option\u003cU\u003e` - 値を別のOptionに変換\n- `filter(callable $predicate): Option\u003cT\u003e` - 条件に合致する場合のみSomeを返す\n- `expect(string $msg): T` - 値を取り出す（Noneの場合はカスタムメッセージで例外）\n- `toResult($err): Result\u003cT, E\u003e` - OptionをResultに変換\n\n### Result\\\u003cT, E\\\u003e\n\n#### 静的メソッド\n- `Result::ok($value)` - Ok\\\u003cT\\\u003eインスタンスを生成\n- `Result::err($error)` - Err\\\u003cE\\\u003eインスタンスを生成\n\n#### インスタンスメソッド\n- `isOk(): bool` - 処理が成功したかチェック\n- `isErr(): bool` - 処理が失敗したかチェック\n- `unwrap(): T` - 値を取り出す（Errの場合は例外）\n- `unwrapOr($default): T` - 値を取り出すか、デフォルト値を返す\n- `unwrapErr(): E` - エラー値を取り出す（Okの場合は例外）\n- `map(callable $f): Result\u003cU, E\u003e` - 値を変換\n- `mapErr(callable $f): Result\u003cT, F\u003e` - エラー値を変換\n- `flatMap(callable $f): Result\u003cU, E\u003e` - 値を別のResultに変換\n- `expect(string $msg): T` - 値を取り出す（Errの場合はカスタムメッセージで例外）\n- `toOption(): Option\u003cT\u003e` - ResultをOptionに変換\n\n## Contributing\n\n貢献は歓迎します！バグ報告、機能リクエスト、プルリクエストなど、どんな形でも構いません。\n\n1. リポジトリをフォークする\n2. 機能ブランチを作成する (`git checkout -b feature/amazing-feature`)\n3. 変更をコミットする (`git commit -m 'Add some amazing feature'`)\n4. ブランチをプッシュする (`git push origin feature/amazing-feature`)\n5. プルリクエストを作成する\n\n## License\n\nMIT License - [LICENSE](LICENSE)ファイルをご覧ください。\n\n## References\n- [Option型とResult型で安全なPHPを書こう](https://zenn.dev/pixiv/articles/f109b02aa9d4e0)\n- [Rust - Option enum](https://doc.rust-lang.org/std/option/enum.Option.html)\n- [Rust - Result enum](https://doc.rust-lang.org/std/result/enum.Result.html)\n- [Functional programming in PHP](https://phel-lang.org/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwiz-develop%2Fphp-monad","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwiz-develop%2Fphp-monad","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwiz-develop%2Fphp-monad/lists"}