2707dab2afd2d11262a4f708ba9e12396ec54d39
[scpubgit/DKit.git] / lib / DX / SetOver.pm
1 package DX::SetOver;
2
3 use DX::ArrayStream;
4 use Moo;
5
6 with 'DX::Role::Set';
7
8 has over => (is => 'ro', required => 1);
9
10 has values => (is => 'ro', default => sub { {} });
11
12 sub key_list { sort keys %{$_[0]->values} }
13
14 sub get {
15   my ($self, $key) = @_;
16   return $self->values->{$key};
17 }
18
19 sub to_stream {
20   my ($self) = @_;
21   return DX::ArrayStream->from_array($self->all);
22 }
23
24 sub all {
25   my ($self) = @_;
26   my $values = $self->values;
27   my @ret = @{$values}{sort keys %$values};
28   return @ret;
29 }
30
31 sub with_value {
32   my ($self, $value) = @_;
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;
41 }
42
43 sub remove_value {
44   my ($self, $value) = @_;
45   delete $self->values->{ref($value) ? $value->${\$self->over} : $value};
46   return $self;
47 }
48
49 1;