innmind/async-stream

This package is abandoned and no longer maintained. The author suggests using the innmind/mantle package instead.

1.0.0 2023-02-11 13:43 UTC

This package is auto-updated.

Last update: 2023-11-06 06:40:49 UTC


README

Build Status codecov Type Coverage

Async implementation of innmind/stream to allow switching to another task when reading, writing or watching for streams.

Installation

composer require innmind/async-stream

Usage

use Innmind\Async\Stream\Streams;
use Innmind\Stream\Streams as Synchronous;
use Innmind\TimeContinuum\Earth\Clock;
use Innmind\Url\Path;
use Innmind\Mantle\{
    Source\Predetermined,
    Suspend,
    Forerunner,
};

$clock = new Clock;
$synchronous = Synchronous::fromAmbientAuthority();
$source = Predetermined::of(
    static function(Suspend $suspend) use ($clock, $synchronous) {
        $stream = Streams::of($synchronous, $suspend, $clock)
            ->readable()
            ->open(Path::of('fixtures/first.txt'));

        while (!$stream->end()) {
            echo $stream->readLine()->match(
                static fn($line) => $line->toString(),
                static fn() => '',
            );
        }
    },
    static function(Suspend $suspend) use ($clock, $synchronous) {
        $stream = Streams::of($synchronous, $suspend, $clock)
            ->readable()
            ->open(Path::of('fixtures/second.txt'));

        while (!$stream->end()) {
            echo $stream->readLine()->match(
                static fn($line) => $line->toString(),
                static fn() => '',
            );
        }
    },
);

Forerunner::of($clock)(null, $source); // will print interlaced lines of both files