The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package Plucene::Search::PhrasePositions;

=head1 NAME 

Plucene::Search::PhrasePositions - The position of a phrase

=head1 SYNOPSIS

	my $phpos = Plucene::Search::PhrasePositions->new;

	my      $next = $phpos->next;
	my $first_pos = $phpos->first_position;
	my  $next_pos = $phpos->next_position;
	
=head1 DESCRIPTION

=head1 METHODS

=cut

use strict;
use warnings;

use base 'Class::Accessor::Fast';

__PACKAGE__->mk_accessors(qw/ doc position count offset tp next_in_list /);

=head2 new

	my $phpos = Plucene::Search::PhrasePositions->new;

Make a new Plucene::Search::PhrasePositions object.
	
=head2 doc / position / count / offset / tp / next

Get / set these attibutes.

=cut

sub new {
	my $self = shift->SUPER::new(@_);
	$self->{offset}   ||= 0;
	$self->{position} ||= 0;
	$self->{count}    ||= 0;
	$self->next;
	$self;
}

=head2 next

	my $next = $phpos->next;

=cut

sub next {
	my $self = shift;
	if (!$self->{tp}->next) {
		$self->doc(~0);
		return;
	}
	$self->doc($self->tp->doc);
	$self->position(0);
}

=head2 first_position

	my $first = $phpos->first_position;

=cut

sub first_position {
	my $self = shift;
	$self->count($self->tp->freq);
	$self->next_position;
}

=head2 next_position

	my $next_pos = $phpos->next_position;

=cut

sub next_position {
	my $self = shift;
	return unless $self->{count}-- > 0;
	$self->position($self->tp->next_position - $self->offset);
}

1;