factor out set/stream code
[scpubgit/DKit.git] / lib / DX / SetOver.pm
diff --git a/lib/DX/SetOver.pm b/lib/DX/SetOver.pm
new file mode 100644 (file)
index 0000000..88a964d
--- /dev/null
@@ -0,0 +1,24 @@
+package DX::SetOver;
+
+use DX::ArrayStream;
+use Moo;
+
+has over => (is => 'ro', required => 1);
+
+has values => (is => 'ro', default => sub { {} });
+
+sub to_stream {
+  my ($self) = @_;
+  my $values = $self->values;
+  return DX::ArrayStream->from_array(@{$values}{sort keys %$values});
+}
+
+sub with_value {
+  my ($self, $value) = @_;
+  return ref($self)->new(
+    %$self,
+    values => { %{$self->values}, $value->${\$self->over} => $value }
+  );
+}
+
+1;