b267761505cce4a654fbe6919441fbae5d8541ce
[scpubgit/DKit.git] / lib / DX / SetOver.pm
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
10 sub key_list { sort keys %{$_[0]->values} }
11
12 sub get {
13   my ($self, $key) = @_;
14   return $self->values->{$key};
15 }
16
17 sub to_stream {
18   my ($self) = @_;
19   return DX::ArrayStream->from_array($self->all);
20 }
21
22 sub all {
23   my ($self) = @_;
24   my $values = $self->values;
25   my @ret = @{$values}{sort keys %$values};
26   return @ret;
27 }
28
29 sub with_value {
30   my ($self, $value) = @_;
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;
39 }
40
41 sub remove_value {
42   my ($self, $value) = @_;
43   delete $self->values->{ref($value) ? $value->${\$self->over} : $value};
44   return $self;
45 }
46
47 1;