1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use List::MoreUtils;
use Scalar::Util 'blessed';
{
use smartmatch sub {
if (blessed($_[1])) {
return overload::Method($_[1], '~~')->($_[1], $_[0]);
}
elsif (ref($_[1])) {
return $_[1]->($_[0]);
}
else {
return $_[1] eq "foo";
}
};
ok("a" ~~ any(1, 2, "foo"));
ok(!("a" ~~ any(1, 2, 3)));
ok("a" ~~ all("foo", "foo", "foo"));
ok(!("a" ~~ all("a", 2, "foo")));
}
sub any {
my @rvals = @_;
return sub {
my ($lval) = @_;
my $recurse = smartmatch::callback_at_level(1);
return List::MoreUtils::any { $recurse->($lval, $_) } @rvals;
}
}
{
package Sugar::All;
use overload '~~' => 'sm_overload';
sub new {
my $class = shift;
my (%params) = @_;
return bless { rvals => $params{rvals} }, $class;
}
sub sm_overload {
my $self = shift;
my ($lval) = @_;
my $recurse = smartmatch::callback_at_level(1);
return List::MoreUtils::all { $recurse->($lval, $_) }
@{ $self->{rvals} };
}
}
sub all {
my @rvals = @_;
return Sugar::All->new(rvals => \@rvals);
}
done_testing;
|