/* Copyright (c) 2013 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #include #include #include "util/test.h" #include "util/numerics/mpz.h" #include "util/pair.h" #include "util/lazy_list.h" #include "util/lazy_list_fn.h" #include "util/list.h" using namespace lean; lazy_list seq(int s) { return lazy_list(s, [=]() { return seq(s + 1); }); } lazy_list from(int begin, int step, int end) { if (begin > end) return lazy_list(); else return lazy_list(begin, [=]() { return from(begin + step, step, end); }); } lazy_list fact_list_core(mpz i, mpz n) { return lazy_list(n, [=]() { return fact_list_core(i+1, n*(i+1)); }); } lazy_list fact_list() { return fact_list_core(mpz(1), mpz(1)); } lazy_list mk_simple1(int y) { int x = 3; return map(map(append(from(10, 1, 15), from(20, 2, 25)), [=](int v) { return x + v; }), [=](int v) { return v - y; }); } lazy_list mk_simple2() { int x = 10; return filter(map(interleave(from(0, 2, 10), from(10, 3, 20)), [=](int v) { return x * v; }), [](int v) { return v > 40; }); } lazy_list mk_simple3() { return map_append(from(0, 2, 100), [=](int v) { return from(1, 1, v); }); } template void display(lazy_list const & l) { for (auto v : l) { std::cout << v << " "; } std::cout << "\n"; } int main() { lean_assert(head(lazy_list(10)) == 10); lean_assert(!lazy_list()); lean_assert(!tail(lazy_list(10))); lazy_list l(-10, from(10, 20, 100)); l = cons(-20, l); lean_assert(head(l) == -20); for (auto c : l) { std::cout << c << "\n"; } int i = 1; for (auto c : take(30, zip(seq(1), fact_list()))) { lean_assert(c.first == i); std::cout << c.first << " " << c.second << "\n"; i++; } list l2{1, 2, 3}; i = 1; for (auto c : to_lazy(l2)) { lean_assert(c == i); i++; } display(mk_simple1(4)); display(mk_simple2()); display(take(12, mk_simple3())); return 0; }