Commit | Line | Data |
c2e9a3a3 |
1 | package DX::SetOver; |
2 | |
3 | use DX::ArrayStream; |
4 | use Moo; |
5 | |
6 | has over => (is => 'ro', required => 1); |
7 | |
8 | has values => (is => 'ro', default => sub { {} }); |
9 | |
4ce2e778 |
10 | sub key_list { sort keys %{$_[0]->values} } |
11 | |
12 | sub get { |
13 | my ($self, $key) = @_; |
14 | return $self->values->{$key}; |
15 | } |
16 | |
c2e9a3a3 |
17 | sub to_stream { |
18 | my ($self) = @_; |
19 | my $values = $self->values; |
20 | return DX::ArrayStream->from_array(@{$values}{sort keys %$values}); |
21 | } |
22 | |
23 | sub with_value { |
24 | my ($self, $value) = @_; |
0ee5d1d4 |
25 | return ref($self)->new(%$self, values => { %{$self->values} }) |
26 | ->set_value($value); |
27 | } |
28 | |
29 | sub set_value { |
30 | my ($self, $value) = @_; |
31 | $self->values->{$value->${\$self->over}} = $value; |
32 | return $self; |
c2e9a3a3 |
33 | } |
34 | |
71217e42 |
35 | sub remove_value { |
36 | my ($self, $value) = @_; |
37 | delete $self->values->{$value->${\$self->over}}; |
38 | return $self; |
39 | } |
40 | |
c2e9a3a3 |
41 | 1; |