#!/usr/bin/pugs

use v6;
use Test;

plan 10;

# Standard gather
{
	my @a;
	my $i;
	
	@a = gather {
		$i = 1;
		for (1 .. 5) -> $j {
			take $j;
		}
	};

	ok(!$i, "not yet gathered", :todo<unspecced>);
	is(+@a, 5, "5 elements gathered");
	ok($i, "gather code executed");
	is(@a[0], 1, "first elem taken");
	is(@a[-1], 5, "last elem taken");
};

# Nested gathers, two levels
{
  my @outer = gather {
    for 1..3 -> $i {
      my @inner = gather {
         take "$i,$_" for 1..3;
      };

      take ~@inner;
    }
  };

  is ~@outer, "1,1 1,2 1,3 2,1 2,2 2,3 3,1 3,2 3,3", "nested gather works (two levels)";
}

# Nested gathers, three levels
{
  my @outer = gather {
    for 1..2 -> $i {
      my @inner = gather {
	for 1..2 -> $j {
	  my @inner_inner = gather {
	    take "$i,$j,$_" for 1..2;
	  };
	  take ~@inner_inner;
	}
      };
      take ~@inner;
    }
  };

  is ~@outer, "1,1,1 1,1,2 1,2,1 1,2,2 2,1,1 2,1,2 2,2,1 2,2,2", "nested gather works (three levels)";
}

# take on lists, multiple takes per loop
{
  my @outer = gather {
	my @l = (1, 2, 3);
	take 5;
	take @l;
	take 5;
  };

  is ~@outer, "5 1 2 3 5", "take on lists and multiple takes work";
}

# gather shadows take procedure
{
  #sub take { 7; } # enabling this line breaks all tests
  
  my @outer = gather {
	take 1;
  };

  @outer = (take(), @outer);

  is ~@outer, "7 1", "gather shadows existing take", :todo;
}

# take on array-ref
{
  my @list  = gather { take [1,2,3]; take [4,5,6];};
  my @list2 = ([1,2,3],[4,5,6]);
  is @list.perl, @list2.perl , "gather array-refs", :todo<bug>;
}
