// 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) #ifndef BOOST_HANA_TEST_LAWS_COMONAD_HPP #define BOOST_HANA_TEST_LAWS_COMONAD_HPP #include #include #include #include #include #include #include namespace boost { namespace hana { namespace test { template > struct TestComonad : TestComonad { using TestComonad::TestComonad; }; template struct TestComonad { template TestComonad(Ws ws) { hana::for_each(ws, [](auto w) { static_assert(Comonad{}, ""); // extract(duplicate(w)) == w BOOST_HANA_CHECK(hana::equal( hana::extract(hana::duplicate(w)), w )); // transform(duplicate(w), extract) == w BOOST_HANA_CHECK(hana::equal( hana::transform(hana::duplicate(w), extract), w )); // duplicate(duplicate(w)) == transform(duplicate(w), duplicate) BOOST_HANA_CHECK(hana::equal( hana::duplicate(hana::duplicate(w)), hana::transform(hana::duplicate(w), duplicate) )); }); } }; }}} // end namespace boost::hana::test #endif // !BOOST_HANA_TEST_LAWS_COMONAD_HPP