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