package DX::ResultStream;

use Moo;

has for_state => (is => 'ro', required => 1);

has _current_state => (is => 'rw');

has is_exhausted => (is => 'rwp');

sub next {
  my ($self) = @_;
  return if $self->is_exhausted;
  my $start_state = do {
    if (my $cur = $self->_current_state) {
      $cur->push_backtrack;
    } else {
      $self->for_state
    }
  };
  my $state = $self->_current_state($start_state->run);
  unless ($state) {
    $self->_set_is_exhausted(1);
    return;
  }
  return +{
    map +($_ => $state->scope_var($_)->bound_value), keys %{$state->scope}
  };
}

sub results {
  my ($self) = @_;
  my @all;
  while (my $next = $self->next) {
    push @all, $next;
  }
  return @all;
}

1;
