Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 29 additions & 17 deletions src/Activities.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
use Innmind\CLI\Console;
use Innmind\OperatingSystem\OperatingSystem;
use Innmind\Time\Period;
use Innmind\Immutable\Set;
use Innmind\Immutable\{
Set,
Attempt,
Sequence,
};

final class Activities
{
Expand All @@ -33,10 +37,13 @@ private function __construct(
$this->activities = $activities;
}

/**
* @return Attempt<Console>
*/
public function __invoke(
Console $console,
OperatingSystem $os,
): Console {
): Attempt {
// If no activities yet we wait a little bit to avoid always calling
// this method.
// The better approach would be to use sockets and to monitor them so we
Expand All @@ -46,27 +53,32 @@ public function __invoke(
// exit this method periodically to allow the source to be restarted in
// order to check if any agent crashed in order to restart it.
if (\count($this->activities) === 0) {
$_ = $os
return $os
->process()
->halt(Period::millisecond(500))
->unwrap();
->map(static fn() => $console);
}

while ($activity = \array_shift($this->activities)) {
$this->iteration->start();
$console = ($this->trigger)(
$console,
$os,
$activity,
$this->triggers,
);
$activities = Sequence::of(...$this->activities);
$this->activities = [];

if ($activity !== Activity::start) {
$console = $this->iteration->end($console);
}
}
return $activities
->sink($console)
->attempt(function($console, $activity) use ($os) {
$this->iteration->start();
$console = ($this->trigger)(
$console,
$os,
$activity,
$this->triggers,
);

if ($activity !== Activity::start) {
return $console->flatMap($this->iteration->end(...));
}

return $console;
return $console;
});
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/Command/Work.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public function __invoke(Console $console): Attempt
static fn() => Triggers::cases(),
);

return Attempt::result(($this->monitor)($console, Set::of(...$triggers)));
return ($this->monitor)($console, Set::of(...$triggers));
}

/**
Expand Down
16 changes: 11 additions & 5 deletions src/Iteration.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
namespace Innmind\LabStation;

use Innmind\CLI\Console;
use Innmind\Immutable\Str;
use Innmind\Immutable\{
Str,
Attempt,
};

final class Iteration
{
Expand All @@ -20,17 +23,20 @@ public function failing(): void
$this->shouldClearTerminal = false;
}

public function end(Console $console): Console
/**
* @return Attempt<Console>
*/
public function end(Console $console): Attempt
{
if (!$this->shouldClearTerminal) {
return $console;
return Attempt::result($console);
}

if ($console->options()->contains('keep-output')) {
return $console;
return Attempt::result($console);
}

// clear terminal
return $console->output(Str::of("\033[2J\033[H"))->unwrap();
return $console->output(Str::of("\033[2J\033[H"));
}
}
13 changes: 6 additions & 7 deletions src/Monitor.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Innmind\Immutable\{
Set,
Sequence,
Attempt,
};

final class Monitor
Expand Down Expand Up @@ -36,8 +37,10 @@ public function __construct(

/**
* @param Set<Triggers> $triggers
*
* @return Attempt<Console>
*/
public function __invoke(Console $console, Set $triggers): Console
public function __invoke(Console $console, Set $triggers): Attempt
{
$project = $console->workingDirectory();
$scheduler = Scheduler::of($this->os);
Expand All @@ -46,19 +49,15 @@ public function __invoke(Console $console, Set $triggers): Console
$this->iteration,
$triggers,
);
/** @var array{Console, boolean} */
$carry = [$console, false];

[$console] = $scheduler
->sink($carry)
return $scheduler
->sink(Attempt::result($console))
->with(
new Monitor\Loop(
$this->agents,
$activities,
$project,
),
);

return $console;
}
}
28 changes: 16 additions & 12 deletions src/Monitor/Loop.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Innmind\OperatingSystem\OperatingSystem;
use Innmind\Url\Path;
use Innmind\Immutable\{
Attempt,
Sequence,
Predicate\Instance,
};
Expand All @@ -22,6 +23,7 @@ final class Loop
private Sequence $agents;
private Activities $activities;
private Path $project;
private bool $started = false;

/**
* @param Sequence<Agent> $agents
Expand All @@ -37,22 +39,22 @@ public function __construct(
}

/**
* @param array{Console, boolean} $carry
* @param Continuation<array{Console, boolean}> $continuation
* @param Attempt<Console> $console
* @param Continuation<Attempt<Console>> $continuation
*
* @return Continuation<array{Console, boolean}>
* @return Continuation<Attempt<Console>>
*/
public function __invoke(
array $carry,
Attempt $console,
OperatingSystem $os,
Continuation $continuation,
): Continuation {
[$console, $started] = $carry;
if (!$this->started) {
$this->started = true;

if (!$started) {
return $continuation
->schedule($this->agents->map($this->buildTask(...)))
->carryWith([$console, true]);
->carryWith($console);
}

$continuation = $continuation->schedule(
Expand All @@ -62,12 +64,14 @@ public function __invoke(
->map($this->buildTask(...)),
);

$console = ($this->activities)(
$console,
$os,
return $console->match(
fn($console) => $continuation->carryWith(
($this->activities)($console, $os),
),
static fn($e) => $continuation
->carryWith(Attempt::error($e))
->terminate(),
);

return $continuation->carryWith([$console, $started]);
}

/**
Expand Down
9 changes: 7 additions & 2 deletions src/Trigger.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,22 @@

use Innmind\CLI\Console;
use Innmind\OperatingSystem\OperatingSystem;
use Innmind\Immutable\Set;
use Innmind\Immutable\{
Set,
Attempt,
};

interface Trigger
{
/**
* @param Set<Triggers> $triggers
*
* @return Attempt<Console>
*/
public function __invoke(
Console $console,
OperatingSystem $os,
Activity $activity,
Set $triggers,
): Console;
): Attempt;
}
21 changes: 14 additions & 7 deletions src/Trigger/All.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@
};
use Innmind\CLI\Console;
use Innmind\OperatingSystem\OperatingSystem;
use Innmind\Immutable\Set;
use Innmind\Immutable\{
Set,
Sequence,
Attempt,
};

final class All implements Trigger
{
Expand All @@ -30,11 +34,14 @@ public function __invoke(
OperatingSystem $os,
Activity $activity,
Set $triggers,
): Console {
foreach ($this->triggers as $trigger) {
$console = $trigger($console, $os, $activity, $triggers);
}

return $console;
): Attempt {
return Sequence::of(...$this->triggers)
->sink($console)
->attempt(static fn($console, $trigger) => $trigger(
$console,
$os,
$activity,
$triggers,
));
}
}
Loading