use DX::ArrayStream;
use Moo;
+with 'DX::Role::Set';
+
has over => (is => 'ro', required => 1);
has values => (is => 'ro', default => sub { {} });
+sub key_list { sort keys %{$_[0]->values} }
+
+sub get {
+ my ($self, $key) = @_;
+ return $self->values->{$key};
+}
+
sub to_stream {
my ($self) = @_;
+ return DX::ArrayStream->from_array($self->all);
+}
+
+sub all {
+ my ($self) = @_;
my $values = $self->values;
- return DX::ArrayStream->from_array(@{$values}{sort keys %$values});
+ my @ret = @{$values}{sort keys %$values};
+ return @ret;
}
sub with_value {
my ($self, $value) = @_;
- return ref($self)->new(
- %$self,
- values => { %{$self->values}, $value->${\$self->over} => $value }
- );
+ return ref($self)->new(%$self, values => { %{$self->values} })
+ ->set_value($value);
+}
+
+sub set_value {
+ my ($self, $value) = @_;
+ $self->values->{$value->${\$self->over}} = $value;
+ return $self;
+}
+
+sub remove_value {
+ my ($self, $value) = @_;
+ delete $self->values->{ref($value) ? $value->${\$self->over} : $value};
+ return $self;
}
1;