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 )