summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/hana/example/monadic_fold_right.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
commit19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch)
tree42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/hana/example/monadic_fold_right.cpp
parentInitial commit. (diff)
downloadceph-upstream.tar.xz
ceph-upstream.zip
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
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
+ );
+}