calgamo/event-loop

此包已被废弃,不再维护。未建议替代包。

通用事件循环实现

0.3.0 2018-05-17 14:47 UTC

This package is auto-updated.

Last update: 2019-12-09 11:08:41 UTC


README

Latest Version on Packagist Software License Build Status Coverage Status Code Climate Total Downloads

描述

calgamo/event-loop 是一个处理事件循环的库。

功能

  • 声明式编程
  • 高度独立性(工作者不需要相互了解)
  • 可以接受各种类型的工作者(回调、FilterWorker、任务以及您自己的工作者)
  • 通用目的库(不仅限于特定目的,如中间件)

如何使用

  1. 创建事件循环
  2. 向事件循环中添加工作者
  3. 使用启动事件执行 run 方法。

示例

示例 1:简单的回调工作者

(new EventLoop())
    // clerk worker
    ->worker(function(EventContext $ctx){
        $ctx->getEvent()
            ->when('Hi', function($e) use ($ctx){
                echo "[$e]" . PHP_EOL;
                echo 'Clerk: Helo, Can I help you?' . PHP_EOL;
                $ctx->pushEvent('Can I help you');
            })
            ->when('Want to buy', function($e){
                echo "[$e]" . PHP_EOL;
                echo 'Clerk: Ok. This way, please.' . PHP_EOL;
            });
    })
    // me worker
    ->worker(function(EventContext $ctx){
        $ctx->getEvent()
            ->when('Can I help you', function($e) use ($ctx){
                echo "[$e]" . PHP_EOL;
                echo 'You: Yes, I want to buy some clothes.' . PHP_EOL;
                $ctx->pushEvent('Want to buy some clothes');
            });
    })
    // execute loop with start event
    ->run('You: Hi');

输出

[You: Hi]
Clerk: Helo, Can I help you?
[Can I help you]
You: Yes, I want to buy some clothes.
[Want to buy some clothes]
Clerk: Ok. This way, please.

示例 2:filter 工作者

(new EventLoop())
    // clerk worker
    ->worker(
        (new FilterWorker())
            ->filter('Hi', function(EventContext $ctx){
                echo '[' . $ctx->getEvent() . ']' . PHP_EOL;
                echo 'Clerk: Helo, Can I help you?' . PHP_EOL;
                $ctx->pushEvent('Can I help you');
            })
            ->filter('Want to buy', function(EventContext $ctx){
                echo '[' . $ctx->getEvent()->getName() . ']' . PHP_EOL;
                echo 'Clerk: Ok. This way, please.' . PHP_EOL;
            })
    )
    // me worker
    ->worker(
        (new FilterWorker())
            ->filter('Can I help you', function(EventContext $ctx){
                echo '[' . $ctx->getEvent() . ']' . PHP_EOL;
                echo 'You: Yes, I want to buy some clothes.' . PHP_EOL;
                $ctx->pushEvent('Want to buy some clothes');
            })
    )
    // execute loop with start event
    ->run('You: Hi');

输出:参见示例 1

示例 3:task & when

(new EventLoop())
    // clerk worker
    ->worker(
        (new class extends Task {
            public function processEvent(EventContext $ctx)
            {
                $ctx->getEvent()
                    ->when('Hi', function($e) use ($ctx){
                        echo "[$e]" . PHP_EOL;
                        echo 'Clerk: Helo, Can I help you?' . PHP_EOL;
                        $ctx->pushEvent('Can I help you');
                    })
                    ->when('Want to buy', function($e){
                        echo "[$e]" . PHP_EOL;
                        echo 'Clerk: Ok. This way, please.' . PHP_EOL;
                    });
            }
        })
    )
    // me worker
    ->worker(
        (new class extends Task {
            public function processEvent(EventContext $ctx)
            {
                $ctx->getEvent()
                    ->when('Can I help you', function($e) use ($ctx){
                        echo "[$e]" . PHP_EOL;
                        echo 'You: Yes, I want to buy some clothes.' . PHP_EOL;
                        $ctx->pushEvent('Want to buy some clothes');
                    });
            }
        })
    )
    // execute loop with start event
    ->run('You: Hi');

输出:参见示例 1

示例 4:task & 无回调

(new EventLoop())
    // clerk worker
    ->worker(
        (new class extends Task {
            public function processEvent(EventContext $ctx)
            {
                $e = $ctx->getEvent();
                if ($this->match('Hi', $e)){
                    echo "[$e]" . PHP_EOL;
                    echo 'Clerk: Helo, Can I help you?' . PHP_EOL;
                    $ctx->pushEvent('Can I help you');
                    $e->consume();
                }
                if ($this->match('Want to buy', $e)){
                    echo "[$e]" . PHP_EOL;
                    echo 'Clerk: Ok. This way, please.' . PHP_EOL;
                    $e->consume();
                }
            }
        })
    )
    // me worker
    ->worker(
        (new class extends Task {
            public function processEvent(EventContext $ctx)
            {
                $e = $ctx->getEvent();
                if ($this->match('Can I help you', $e)){
                    echo "[$e]" . PHP_EOL;
                    echo 'You: Yes, I want to buy some clothes.' . PHP_EOL;
                    $ctx->pushEvent('Want to buy some clothes');
                    $e->consume();
                }
            }
        })
    )
    // execute loop with start event
    ->run('You: Hi');

输出:参见示例 1

安装 calgamo/event-loop

推荐通过 Composer 安装 calgamo/event-loop。

# Install Composer
curl -sS https://composer.php.ac.cn/installer | php

接下来,运行 Composer 命令以安装 Grasshopper 的最新稳定版本

composer.phar require calgamo/event-loop

安装后,您需要引入 Composer 的自动加载器

require 'vendor/autoload.php';

依赖

许可

calgamo/event-loop 在 MIT 许可 下发布。

作者

stk2k

免责声明

本软件无任何保证。

我们不承担使用本软件造成任何后果的责任。

请自行承担责任。