use strict;
use warnings;
package RDF::Flow::Cascade;
{
  $RDF::Flow::Cascade::VERSION = '0.178';
}
#ABSTRACT: Returns the first non-empty response of a sequence of sources

use Log::Contextual::WarnLogger;
use Log::Contextual qw(:log), -default_logger
    => Log::Contextual::WarnLogger->new({ env_prefix => __PACKAGE__ });

use parent 'RDF::Flow::Source';
use RDF::Flow::Source qw(:util);

use Carp 'croak';
use Scalar::Util 'blessed';

sub new {
    my $class = shift;
    my ($inputs, $args) = sourcelist_args( @_ );

    my $self = bless {
        inputs => $inputs,
        name   => ($args->{name} || 'anonymous cascade'),
    }, $class;

    $self->match( $args->{match} );

    return $self;
}

sub about {
    my $self = shift;
    $self->name($self) . ' with ' . $self->size . ' inputs';
}

sub retrieve { # TODO: try/catch errors?
    my ($self, $env) = @_;

    log_trace { 'retrieve from ' . $self->about; }

    my $i = 1;
    my $rdf;
    foreach my $src ( $self->inputs ) {
        $rdf = $src->retrieve( $env );

        next unless defined $rdf;
        if ( blessed $rdf and $rdf->isa('RDF::Trine::Model') ) {
            last if $rdf->size > 0;
        } elsif ( blessed $rdf and $rdf->isa('RDF::Trine::Iterator') ) {
            last if $rdf->peek;
        } else {
            croak 'unexpected response in ' . $self->name . ': ' . $rdf;
        }

        $i++;
    }

    $self->timestamp( $env );
    $self->trigger_retrieved( $rdf, "%s returned $i. with %s" );
}

sub _graphviz_edgeattr {
	my ($self,$n) = @_;
	my %attr = (label => sprintf("%d.",$n));
	$attr{style} = 'dotted' if $n > 1;
	return %attr;
}

1;


__END__
=pod

=head1 NAME

RDF::Flow::Cascade - Returns the first non-empty response of a sequence of sources

=head1 VERSION

version 0.178

=head1 SYNOPSIS

    use RDF::Flow qw(cascade);
    $src = cascade( @sources );                  # shortcut
    $src = cascade( @sources, name => 'foo' );   # with name

    use RDF::Flow::Cascade;
    $src = RDF::Flow::Cascade->new( @sources );  # explicit

    $rdf = $src->retrieve( $env );

=head1 DESCRIPTION

This L<RDF::Flow::Source> returns the first non-empty response of a given
sequence of sources.

=head1 SEE ALSO

L<RDF::Flow::Union>, L<RDF::Flow::Pipeline>

=head1 AUTHOR

Jakob Voß <voss@gbv.de>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by Jakob Voß.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut