App-RoboBot
view release on metacpan or search on metacpan
lib/App/RoboBot/Plugin/Core/Control.pm view on Meta::CPAN
if ($condition) {
return $expr_if->evaluate($message, $rpl);
} elsif (defined $expr_else && blessed($expr_else) && $expr_else->can('evaluate')) {
return $expr_else->evaluate($message, $rpl);
}
return;
}
sub control_while {
my ($self, $message, $command, $rpl, $condition, $expr_loop) = @_;
my @res;
# TODO make the loop-limit configurable
my $i = 0;
unless (defined $condition && blessed($condition) && $condition->can('evaluate')) {
$message->response->raise('First argument must be a list or expression which will evaluate to a truthy/falsey value.');
return;
}
my $ret = $condition->evaluate($message, $rpl);
while ($i < 100 && $ret) {
@res = $expr_loop->evaluate($message, $rpl);
$ret = $condition->evaluate($message, $rpl);
$i++;
}
return @res;
}
sub control_cond {
my ($self, $message, $command, $rpl, @pairs) = @_;
unless (@pairs && @pairs >= 2) {
$message->response->raise('You must supply at least one condition and action.');
return;
}
my $fallback = pop @pairs if scalar(@pairs) % 2 == 1;
while (my $cond = shift @pairs) {
my $action = shift @pairs;
if ($cond->evaluate($message, $rpl)) {
return $action->evaluate($message, $rpl)
}
}
if (defined $fallback) {
return $fallback->evaluate($message, $rpl);
}
return;
}
sub control_apply {
my ($self, $message, $command, $rpl, $func, @args) = @_;
unless (defined $func && blessed($func) =~ m{^App::RoboBot::Type::(Function|Macro)}) {
$message->response->raise('You must provide a function or macro to apply to your arguments.');
return;
}
unless (@args) {
$message->response->raise('You cannot apply a function or macro to a non-existent list of arguments.');
return;
}
# it's not an error to have no arguments, but we can at least short-circuit.
return unless @args > 0;
my @collect;
foreach my $arg (@args) {
my @res = $arg->evaluate($message, $rpl);
push(@collect, $func->evaluate($message, $rpl, $_)) foreach @res;
}
return @collect;
}
__PACKAGE__->meta->make_immutable;
1;
( run in 0.779 second using v1.01-cache-2.11-cpan-39bf76dae61 )