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) = @_; |
aa953747 |
19 | return DX::ArrayStream->from_array($self->all); |
20 | } |
21 | |
22 | sub all { |
23 | my ($self) = @_; |
c2e9a3a3 |
24 | my $values = $self->values; |
aa953747 |
25 | my @ret = @{$values}{sort keys %$values}; |
26 | return @ret; |
c2e9a3a3 |
27 | } |
28 | |
29 | sub with_value { |
30 | my ($self, $value) = @_; |
0ee5d1d4 |
31 | return ref($self)->new(%$self, values => { %{$self->values} }) |
32 | ->set_value($value); |
33 | } |
34 | |
35 | sub set_value { |
36 | my ($self, $value) = @_; |
37 | $self->values->{$value->${\$self->over}} = $value; |
38 | return $self; |
c2e9a3a3 |
39 | } |
40 | |
71217e42 |
41 | sub remove_value { |
42 | my ($self, $value) = @_; |
43 | delete $self->values->{$value->${\$self->over}}; |
44 | return $self; |
45 | } |
46 | |
c2e9a3a3 |
47 | 1; |