summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/hana/example/monadic_fold_right.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/hana/example/monadic_fold_right.cpp')
-rw-r--r--src/boost/libs/hana/example/monadic_fold_right.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/boost/libs/hana/example/monadic_fold_right.cpp b/src/boost/libs/hana/example/monadic_fold_right.cpp
new file mode 100644
index 000000000..255962407
--- /dev/null
+++ b/src/boost/libs/hana/example/monadic_fold_right.cpp
@@ -0,0 +1,61 @@
+// 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/config.hpp>
+#include <boost/hana/div.hpp>
+#include <boost/hana/equal.hpp>
+#include <boost/hana/eval_if.hpp>
+#include <boost/hana/integral_constant.hpp>
+#include <boost/hana/lazy.hpp>
+#include <boost/hana/monadic_fold_right.hpp>
+#include <boost/hana/optional.hpp>
+#include <boost/hana/tuple.hpp>
+namespace hana = boost::hana;
+
+
+int main() {
+ BOOST_HANA_CONSTEXPR_LAMBDA auto safe_div = [](auto x, auto y) {
+ return hana::eval_if(y == hana::int_c<0>,
+ hana::make_lazy(hana::nothing),
+ [=](auto _) {
+ return hana::just(_(x) / y);
+ }
+ );
+ };
+
+ // with an initial state
+ BOOST_HANA_CONSTANT_CHECK(
+ hana::monadic_fold_right<hana::optional_tag>(
+ hana::tuple_c<int, 1000, 8, 4>, hana::int_c<2>, safe_div
+ )
+ ==
+ hana::just(hana::int_c<1000> / (hana::int_c<8> / (hana::int_c<4> / hana::int_c<2>)))
+ );
+
+ BOOST_HANA_CONSTANT_CHECK(
+ hana::monadic_fold_right<hana::optional_tag>(
+ hana::tuple_c<int, 1000, 8, 4>, hana::int_c<0>, safe_div
+ )
+ ==
+ hana::nothing
+ );
+
+ // without an initial state
+ BOOST_HANA_CONSTANT_CHECK(
+ hana::monadic_fold_right<hana::optional_tag>(
+ hana::tuple_c<int, 1000, 8, 4, 2>, safe_div
+ )
+ ==
+ hana::just(hana::int_c<1000> / (hana::int_c<8> / (hana::int_c<4> / hana::int_c<2>)))
+ );
+
+ BOOST_HANA_CONSTANT_CHECK(
+ hana::monadic_fold_right<hana::optional_tag>(
+ hana::tuple_c<int, 1000, 8, 4, 0>, safe_div
+ )
+ ==
+ hana::nothing
+ );
+}