3 use aliased 'DX::Op::FromCode';
4 use aliased 'DX::ArrayStream';
18 my @shells = qw(csh bash);
21 bash => { map +($_ => 1),
22 qw(joe.example.com kitty.scsys.co.uk pryde.scsys.co.uk) },
23 csh => { map +($_ => 1),
24 qw(jim.example.com joe.example.com bob.example.com) },
28 my ($var, $array) = @_;
30 my ($self, $state) = @_;
31 $state->bind_stream_then(
32 $state->scope_var($var),
33 ArrayStream->from_array(@$array),
40 my ($vars, $test) = @_;
42 my ($self, $state) = @_;
43 my @values = map $state->scope_var($_)->bound_value, @$vars;
44 if ($test->(@values)) {
45 return $state->then($self->next);
47 return $state->backtrack;
51 my $op = FromCode->new(
52 code => bind_array(S => \@servers),
53 next => FromCode->new(
54 code => test_values([ 'S' ], sub { $_[0] =~ /\.example\.com$/ })
61 my %scope = map +($_ => $_), @{$vars};
62 my %by_id = map +($_ => DX::Var->new(id => $_)), @{$vars};
73 my $stream = DX::ResultStream->new(for_state => make_state([ 'S' ], $op));
75 is($stream->next->{'S'}, $_)
76 for qw(jim.example.com joe.example.com bob.example.com);
78 is($stream->next, undef, 'No more');
82 my $complex_op = FromCode->new(
83 code => bind_array(S => \@servers),
84 next => FromCode->new(
85 code => test_values([ 'S' ], sub { $_[0] =~ /\.example\.com$/ }),
86 next => FromCode->new(
87 code => bind_array(P => \@shells),
88 next => FromCode->new(
89 code => test_values([ qw(S P) ], sub { $shells{$_[1]}{$_[0]} }),
95 my $cstream = DX::ResultStream->new(
96 for_state => make_state([ qw(S P) ], $complex_op)
99 ::Dwarn($cstream->next);
100 ::Dwarn($cstream->next);
101 ::Dwarn($cstream->next);
102 ::Dwarn($cstream->next);
103 ::Dwarn($cstream->next);