package Parallel::MapReduce::Testing;

use strict;
use warnings;

use base 'Parallel::MapReduce';

=pod

=head1 NAME

Parallel::MapReduce::Testing - MapReduce Infrastructure, single-threaded, local

=head1 SYNOPSIS

  use Parallel::MapReduce::Testing;
  my $mri = new Parallel::MapReduce::Testing;

  # rest like in Parallel::MapReduce

=head1 DESCRIPTION

This subclass of L<Parallel::MapReduce> implements MapReduce, but only as a single thread. Unlike
its superclass, there is no need (or use) to provide lists of servers or workers.

This is great for testing your algorithm itself.

=cut

sub new {
    my $class = shift;
    return bless {}, $class;
}

sub mapreduce {
    my $mri    = shift;
    my $map    = shift;
    my $reduce = shift;
    my $h1     = shift;

    my %h3;
    while (my ($k, $v) = each %$h1) {
	my %h2 = &$map ($k => $v);
	map { push @{ $h3{$_} }, $h2{$_} } keys %h2;
    }
    my %h4;
    while (my ($k, $v) = each %h3) {
	$h4{$k} = &$reduce ($k => $v);
    }
    return \%h4;
}

=pod

=head1 SEE ALSO

L<Parallel::MapReduce>

=head1 COPYRIGHT AND LICENSE

Copyright 200[8] by Robert Barta, E<lt>drrho@cpan.orgE<gt>

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

=cut

our $VERSION = 0.03;

1;
