implement ->equals for values
Matt S Trout [Mon, 9 Nov 2015 17:55:38 +0000 (17:55 +0000)]
lib/DX/Role/Predicate.pm
lib/DX/Role/Value.pm
lib/DX/Value/Dict.pm
lib/DX/Value/False.pm
lib/DX/Value/Number.pm
lib/DX/Value/String.pm
lib/DX/Value/True.pm
lib/DX/Value/Unset.pm
t/01basics.t

index c1bcc0b..b1c8181 100644 (file)
@@ -18,7 +18,7 @@ sub _make_equal {
   if ($left->equals($right)) {
     return step(
       actions => [],
-      depends_on => [ $left, $right ],
+      depends_on => [ [ undef ,=> [ $left, $right ] ] ],
     );
   }
   return (
index a5fc4a0..01fd710 100644 (file)
@@ -23,4 +23,12 @@ sub but_set_identity_path {
   $self->but(identity_path => $path);
 }
 
+requires 'to_data';
+
+sub equals {
+  my ($self, $other) = @_;
+  require YAML;
+  YAML::Dump($self->to_data) eq YAML::Dump($other->to_data);
+}
+
 1;
index af579ea..85decc7 100644 (file)
@@ -38,4 +38,10 @@ sub without_member_at {
   $self->but(members => \%members);
 }
 
+sub to_data {
+  my ($self) = @_;
+  my $m = $self->members;
+  +{ map +($_ => $m->{$_}->to_data), $self->index_list };
+}
+
 1;
index 0412671..2dee3f4 100644 (file)
@@ -6,4 +6,6 @@ with 'DX::Role::BooleanValue';
 
 sub is_true { 0 }
 
+sub to_data { \0 }
+
 1;
index 6564205..74e30ac 100644 (file)
@@ -6,4 +6,6 @@ with 'DX::Role::Value';
 
 has number_value => (is => 'ro', required => 1);
 
+sub to_data { 0+$_[0]->number_value }
+
 1;
index 78c5f43..e1a55b6 100644 (file)
@@ -6,4 +6,6 @@ with 'DX::Role::Value';
 
 has string_value => (is => 'ro', required => 1);
 
+sub to_data { ''.$_[0]->string_value }
+
 1;
index df3f842..55dee79 100644 (file)
@@ -6,4 +6,6 @@ with 'DX::Role::BooleanValue';
 
 sub is_true { 1 }
 
+sub to_data { \1 }
+
 1;
index a78f556..507bd4f 100644 (file)
@@ -6,4 +6,8 @@ with 'DX::Role::Value';
 
 sub is_set { 0 }
 
+sub to_data { undef }
+
+sub equals { 0 }
+
 1;
index 09af40e..2c6c307 100644 (file)
@@ -30,6 +30,7 @@ my $hyp = use_module('DX::Hypothesis')->new(
   outstanding_propositions => [
     proposition(is_dict => 'X'),
     proposition(member_at => 'X', string('a'), string('b')),
+    proposition(member_at => 'X', string('a'), string('b')),
   ],
   actions => [],
 );
@@ -40,5 +41,4 @@ my $ss = use_module('DX::SearchState')->new(
 );
 
 #::Dwarn($ss->with_one_step->with_one_step);
-require YAML;
-warn deparse($ss->with_one_step->with_one_step);
+warn deparse($ss->with_one_step->with_one_step->with_one_step);