# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>

# Intended for PublicInbox::DS::event_loop in read-only daemons
# to avoid each_inbox() monopolizing the event loop when hundreds/thousands
# of inboxes are in play.
package PublicInbox::ConfigIter;
use v5.12;

sub new {
	my ($class, $pi_cfg, $cb, @args) = @_;
	my $i = 0;
	bless [ $pi_cfg, \$i, $cb, @args ], __PACKAGE__;
}

# for PublicInbox::DS::next_tick, we only call this is if
# PublicInbox::DS is already loaded
sub event_step {
	my $self = shift;
	my ($pi_cfg, $i, $cb, @arg) = @$self;
	my $section = $pi_cfg->{-section_order}->[$$i++];
	eval { $cb->($pi_cfg, $section, @arg) };
	warn "E: $@ in ${self}::event_step" if $@;
	PublicInbox::DS::requeue($self) if defined($section);
}

# for generic PSGI servers, but also ManifestJsGz w/ ALL extindex
sub each_section {
	my $self = shift;
	my ($pi_cfg, $i, $cb, @arg) = @$self;
	while (defined(my $section = $pi_cfg->{-section_order}->[$$i++])) {
		eval { $cb->($pi_cfg, $section, @arg) };
		warn "E: $@ in ${self}::each_section" if $@;
	}
	eval { $cb->($pi_cfg, undef, @arg) };
	warn "E: $@ in ${self}::each_section" if $@;
}

1;
