#!/usr/bin/ruby
#
## Lazy iterators
#
var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13]
## Array
say arr.lazy.grep{.is_even}.map{_**2}.to_a
## Array
arr.lazy.grep{.is_even}.map{_**2}.each { |i|
say i;
}
## Infinite range
(1..^Inf) -> lazy.grep{.is_even}.first(5).say;
## FileHandle
File(__FILE__).open_r.lazy.grep{.match(/\S/)}.map{.uc}.first(4).join("\n").say;
## DirHandle
Dir.cwd.open_r.lazy.grep{.match(/e/)}.map{.lc}.first(3).join("\n").say
## Infinite range
(^Inf).lazy.grep{.is_prime}.first(10).say;
## Infinite range
(1..^Inf).lazy.map{|i| i + 17 }.map{.fib}.grep{.is_prime}.each { |i|
say i
break
}
#
## Lazy type
#
var lz = (^Inf -> lazy.grep{.is_prime})
func f(Lazy foo) {
var i = foo.iter
10.times { say i() }
}
f(lz)
var ok = false
try { f("asd") }
catch { ok = true }
assert_eq(ok, true)
assert_eq(^Inf -> lazy.map { polygonal(_, 3) }.first_by { |n|
n.sigma0 > 10
}, 120)
assert_eq(
^Inf -> lazy.map { _**2 + 1 }.grep { .is_prime }.while { _ < 1000 },
1..1000.isqrt -> map { _**2 + 1}.grep { .is_prime }
)
assert_eq(File(__FILE__).open_r.lazy.grep{ .match(/./) }.map{ .uc }.first(5).len, 5)