diff options
Diffstat (limited to '')
-rw-r--r-- | src/boost/libs/hana/example/lazy/comonad.cpp | 30 | ||||
-rw-r--r-- | src/boost/libs/hana/example/lazy/functor.cpp | 17 | ||||
-rw-r--r-- | src/boost/libs/hana/example/lazy/make.cpp | 24 | ||||
-rw-r--r-- | src/boost/libs/hana/example/lazy/monad.cpp | 47 |
4 files changed, 118 insertions, 0 deletions
diff --git a/src/boost/libs/hana/example/lazy/comonad.cpp b/src/boost/libs/hana/example/lazy/comonad.cpp new file mode 100644 index 000000000..39bbbea6b --- /dev/null +++ b/src/boost/libs/hana/example/lazy/comonad.cpp @@ -0,0 +1,30 @@ +// Copyright Louis Dionne 2013-2017 +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) + +#include <boost/hana/assert.hpp> +#include <boost/hana/eval.hpp> +#include <boost/hana/extend.hpp> +#include <boost/hana/extract.hpp> +#include <boost/hana/lazy.hpp> + +#include <sstream> +namespace hana = boost::hana; + + +int main() { + std::stringstream s("1 2 3"); + auto i = hana::make_lazy([&] { + int i; + s >> i; + return i; + })(); + + auto i_plus_one = hana::extend(i, [](auto lazy_int) { + return hana::eval(lazy_int) + 1; + }); + + BOOST_HANA_RUNTIME_CHECK(hana::extract(i_plus_one) == 2); + BOOST_HANA_RUNTIME_CHECK(hana::extract(i_plus_one) == 3); + BOOST_HANA_RUNTIME_CHECK(hana::extract(i_plus_one) == 4); +} diff --git a/src/boost/libs/hana/example/lazy/functor.cpp b/src/boost/libs/hana/example/lazy/functor.cpp new file mode 100644 index 000000000..5fa20ab3b --- /dev/null +++ b/src/boost/libs/hana/example/lazy/functor.cpp @@ -0,0 +1,17 @@ +// Copyright Louis Dionne 2013-2017 +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) + +#include <boost/hana/eval.hpp> +#include <boost/hana/functional/placeholder.hpp> +#include <boost/hana/lazy.hpp> +#include <boost/hana/transform.hpp> +namespace hana = boost::hana; +using hana::_; + + +int main() { + static_assert(hana::eval(hana::transform(hana::make_lazy(4 / _)(1), _ * 3)) == (4 / 1) * 3, ""); + + hana::transform(hana::make_lazy(4 / _)(0), _ * 3); // never evaluated +} diff --git a/src/boost/libs/hana/example/lazy/make.cpp b/src/boost/libs/hana/example/lazy/make.cpp new file mode 100644 index 000000000..d602c96d4 --- /dev/null +++ b/src/boost/libs/hana/example/lazy/make.cpp @@ -0,0 +1,24 @@ +// Copyright Louis Dionne 2013-2017 +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) + +#include <boost/hana/assert.hpp> +#include <boost/hana/bool.hpp> +#include <boost/hana/config.hpp> +#include <boost/hana/eval.hpp> +#include <boost/hana/if.hpp> +#include <boost/hana/lazy.hpp> +namespace hana = boost::hana; + + +int main() { + BOOST_HANA_CONSTEXPR_LAMBDA auto f = hana::make<hana::lazy_tag>([](auto x) { + return 1 / x; + }); + + BOOST_HANA_CONSTEXPR_LAMBDA auto g = hana::make_lazy([](auto x) { + return x + 1; + }); + + BOOST_HANA_CONSTEXPR_CHECK(hana::eval(hana::if_(hana::false_c, f(0), g(0))) == 0 + 1); +} diff --git a/src/boost/libs/hana/example/lazy/monad.cpp b/src/boost/libs/hana/example/lazy/monad.cpp new file mode 100644 index 000000000..f425e2810 --- /dev/null +++ b/src/boost/libs/hana/example/lazy/monad.cpp @@ -0,0 +1,47 @@ +// Copyright Louis Dionne 2013-2017 +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) + +#include <boost/hana/assert.hpp> +#include <boost/hana/chain.hpp> +#include <boost/hana/eval.hpp> +#include <boost/hana/lazy.hpp> + +#include <functional> +#include <iostream> +#include <sstream> +namespace hana = boost::hana; + + +template <typename T> +T read_(std::istream& stream) { + T x; + stream >> x; + std::cout << "read " << x << " from the stream\n"; + return x; +} + +int main() { + std::stringstream ss; + int in = 123; + + std::cout << "creating the monadic chain...\n"; + auto out = hana::make_lazy(read_<int>)(std::ref(ss)) + | [](auto x) { + std::cout << "performing x + 1...\n"; + return hana::make_lazy(x + 1); + } + | [](auto x) { + std::cout << "performing x / 2...\n"; + return hana::make_lazy(x / 2); + }; + + std::cout << "putting " << in << " in the stream...\n"; + ss << in; // nothing is evaluated yet + + std::cout << "evaluating the monadic chain...\n"; + auto eout = hana::eval(out); + + std::cout << "the result of the monadic chain is " << eout << "\n"; + BOOST_HANA_RUNTIME_CHECK(eout == (in + 1) / 2); +} |