monad_plus.hpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. // Copyright Louis Dionne 2013-2017
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  4. #ifndef BOOST_HANA_TEST_LAWS_MONAD_PLUS_HPP
  5. #define BOOST_HANA_TEST_LAWS_MONAD_PLUS_HPP
  6. #include <boost/hana/append.hpp>
  7. #include <boost/hana/assert.hpp>
  8. #include <boost/hana/bool.hpp>
  9. #include <boost/hana/chain.hpp>
  10. #include <boost/hana/concat.hpp>
  11. #include <boost/hana/concept/comparable.hpp>
  12. #include <boost/hana/concept/monad_plus.hpp>
  13. #include <boost/hana/concept/sequence.hpp>
  14. #include <boost/hana/core/make.hpp>
  15. #include <boost/hana/core/when.hpp>
  16. #include <boost/hana/cycle.hpp>
  17. #include <boost/hana/empty.hpp>
  18. #include <boost/hana/equal.hpp>
  19. #include <boost/hana/filter.hpp>
  20. #include <boost/hana/for_each.hpp>
  21. #include <boost/hana/functional/capture.hpp>
  22. #include <boost/hana/functional/compose.hpp>
  23. #include <boost/hana/integral_constant.hpp>
  24. #include <boost/hana/lift.hpp>
  25. #include <boost/hana/not.hpp>
  26. #include <boost/hana/not_equal.hpp>
  27. #include <boost/hana/prefix.hpp>
  28. #include <boost/hana/prepend.hpp>
  29. #include <boost/hana/remove.hpp>
  30. #include <boost/hana/remove_if.hpp>
  31. #include <boost/hana/replicate.hpp>
  32. #include <boost/hana/suffix.hpp>
  33. #include <laws/base.hpp>
  34. namespace boost { namespace hana { namespace test {
  35. template <typename M, typename = when<true>>
  36. struct TestMonadPlus : TestMonadPlus<M, laws> {
  37. using TestMonadPlus<M, laws>::TestMonadPlus;
  38. };
  39. template <typename M>
  40. struct TestMonadPlus<M, laws> {
  41. template <typename Xs, typename Predicates, typename Values>
  42. TestMonadPlus(Xs xs, Predicates predicates, Values values) {
  43. #ifdef BOOST_HANA_WORKAROUND_MSVC_DECLTYPEAUTO_RETURNTYPE_662735
  44. empty<M>(); // force adding empty<M>'s member function to pending temploid list
  45. #endif
  46. hana::for_each(xs, [](auto a) {
  47. static_assert(MonadPlus<decltype(a)>{}, "");
  48. // left identity
  49. BOOST_HANA_CHECK(hana::equal(
  50. hana::concat(hana::empty<M>(), a),
  51. a
  52. ));
  53. // right identity
  54. BOOST_HANA_CHECK(hana::equal(
  55. hana::concat(a, hana::empty<M>()),
  56. a
  57. ));
  58. // absorption
  59. auto f = hana::compose(lift<M>, test::_injection<0>{});
  60. BOOST_HANA_CHECK(hana::equal(
  61. hana::chain(hana::empty<M>(), f),
  62. hana::empty<M>()
  63. ));
  64. BOOST_HANA_CHECK(hana::equal(
  65. hana::chain(a, hana::always(hana::empty<M>())),
  66. hana::empty<M>()
  67. ));
  68. });
  69. // associativity
  70. foreach3(xs, [](auto a, auto b, auto c) {
  71. BOOST_HANA_CHECK(hana::equal(
  72. hana::concat(a, hana::concat(b, c)),
  73. hana::concat(hana::concat(a, b), c)
  74. ));
  75. });
  76. // Default method definitions
  77. hana::for_each(xs, hana::capture(predicates, values)(
  78. [](auto predicates, auto values, auto x) {
  79. // remove_if(x, pred) == filter(x, negated pred)
  80. hana::for_each(predicates, hana::capture(x)([](auto x, auto pred) {
  81. BOOST_HANA_CHECK(hana::equal(
  82. hana::remove_if(x, pred),
  83. hana::filter(x, hana::compose(hana::not_, pred))
  84. ));
  85. }));
  86. // remove(x, value) == remove_if(x, equal.to(value))
  87. hana::for_each(values, hana::capture(x)([](auto x, auto value) {
  88. BOOST_HANA_CHECK(hana::equal(
  89. hana::remove(x, value),
  90. hana::remove_if(x, hana::equal.to(value))
  91. ));
  92. }));
  93. }));
  94. }
  95. };
  96. template <typename S>
  97. struct TestMonadPlus<S, when<Sequence<S>::value>>
  98. : TestMonadPlus<S, laws>
  99. {
  100. template <int i>
  101. using eq = test::ct_eq<i>;
  102. struct undefined { };
  103. template <typename Xs, typename Predicates, typename Values>
  104. TestMonadPlus(Xs xs, Predicates predicates, Values values)
  105. : TestMonadPlus<S, laws>{xs, predicates, values}
  106. {
  107. auto z = eq<999>{};
  108. constexpr auto list = make<S>;
  109. //////////////////////////////////////////////////////////////////
  110. // empty
  111. //////////////////////////////////////////////////////////////////
  112. BOOST_HANA_CONSTANT_CHECK(equal(
  113. hana::empty<S>(), list()
  114. ));
  115. //////////////////////////////////////////////////////////////////
  116. // concat
  117. //////////////////////////////////////////////////////////////////
  118. BOOST_HANA_CONSTANT_CHECK(equal(
  119. concat(list(), list()),
  120. list()
  121. ));
  122. BOOST_HANA_CONSTANT_CHECK(equal(
  123. concat(list(), list(eq<0>{})),
  124. list(eq<0>{})
  125. ));
  126. BOOST_HANA_CONSTANT_CHECK(equal(
  127. concat(list(), list(eq<0>{}, eq<1>{})),
  128. list(eq<0>{}, eq<1>{})
  129. ));
  130. BOOST_HANA_CONSTANT_CHECK(equal(
  131. concat(list(eq<0>{}), list()),
  132. list(eq<0>{})
  133. ));
  134. BOOST_HANA_CONSTANT_CHECK(equal(
  135. concat(list(eq<0>{}), list(eq<1>{})),
  136. list(eq<0>{}, eq<1>{})
  137. ));
  138. BOOST_HANA_CONSTANT_CHECK(equal(
  139. concat(list(eq<0>{}), list(eq<1>{}, eq<2>{})),
  140. list(eq<0>{}, eq<1>{}, eq<2>{})
  141. ));
  142. BOOST_HANA_CONSTANT_CHECK(equal(
  143. concat(list(eq<0>{}, eq<1>{}), list()),
  144. list(eq<0>{}, eq<1>{})
  145. ));
  146. BOOST_HANA_CONSTANT_CHECK(equal(
  147. concat(list(eq<0>{}, eq<1>{}), list(eq<2>{})),
  148. list(eq<0>{}, eq<1>{}, eq<2>{})
  149. ));
  150. BOOST_HANA_CONSTANT_CHECK(equal(
  151. concat(list(eq<0>{}, eq<1>{}), list(eq<2>{}, eq<3>{})),
  152. list(eq<0>{}, eq<1>{}, eq<2>{}, eq<3>{})
  153. ));
  154. BOOST_HANA_CONSTANT_CHECK(equal(
  155. concat(list(), list()),
  156. list()
  157. ));
  158. BOOST_HANA_CONSTEXPR_CHECK(equal(
  159. concat(list(1), list()),
  160. list(1)
  161. ));
  162. BOOST_HANA_CONSTEXPR_CHECK(equal(
  163. concat(list(), list(1)),
  164. list(1)
  165. ));
  166. BOOST_HANA_CONSTEXPR_CHECK(equal(
  167. concat(list(1), list('2')),
  168. list(1, '2')
  169. ));
  170. BOOST_HANA_CONSTEXPR_CHECK(equal(
  171. concat(list(1, '2'), list(3.3)),
  172. list(1, '2', 3.3)
  173. ));
  174. //////////////////////////////////////////////////////////////////
  175. // filter
  176. //////////////////////////////////////////////////////////////////
  177. BOOST_HANA_CONSTANT_CHECK(equal(
  178. filter(list(), undefined{}),
  179. list()
  180. ));
  181. BOOST_HANA_CONSTANT_CHECK(equal(
  182. filter(list(z), not_equal.to(z)),
  183. list()
  184. ));
  185. BOOST_HANA_CONSTANT_CHECK(equal(
  186. filter(list(eq<1>{}), not_equal.to(z)),
  187. list(eq<1>{})
  188. ));
  189. BOOST_HANA_CONSTANT_CHECK(equal(
  190. filter(list(eq<1>{}, eq<2>{}), not_equal.to(z)),
  191. list(eq<1>{}, eq<2>{})
  192. ));
  193. BOOST_HANA_CONSTANT_CHECK(equal(
  194. filter(list(z, eq<2>{}), not_equal.to(z)),
  195. list(eq<2>{})
  196. ));
  197. BOOST_HANA_CONSTANT_CHECK(equal(
  198. filter(list(eq<1>{}, z), not_equal.to(z)),
  199. list(eq<1>{})
  200. ));
  201. BOOST_HANA_CONSTANT_CHECK(equal(
  202. filter(list(z, eq<2>{}, eq<3>{}), not_equal.to(z)),
  203. list(eq<2>{}, eq<3>{})
  204. ));
  205. BOOST_HANA_CONSTANT_CHECK(equal(
  206. filter(list(eq<1>{}, z, eq<3>{}), not_equal.to(z)),
  207. list(eq<1>{}, eq<3>{})
  208. ));
  209. BOOST_HANA_CONSTANT_CHECK(equal(
  210. filter(list(eq<1>{}, eq<2>{}, z), not_equal.to(z)),
  211. list(eq<1>{}, eq<2>{})
  212. ));
  213. BOOST_HANA_CONSTANT_CHECK(equal(
  214. filter(list(eq<1>{}, z, z), not_equal.to(z)),
  215. list(eq<1>{})
  216. ));
  217. BOOST_HANA_CONSTANT_CHECK(equal(
  218. filter(list(z, eq<2>{}, z), not_equal.to(z)),
  219. list(eq<2>{})
  220. ));
  221. BOOST_HANA_CONSTANT_CHECK(equal(
  222. filter(list(z, z, eq<3>{}), not_equal.to(z)),
  223. list(eq<3>{})
  224. ));
  225. BOOST_HANA_CONSTANT_CHECK(equal(
  226. filter(list(eq<1>{}, eq<2>{}, eq<3>{}, eq<4>{}, z), not_equal.to(z)),
  227. list(eq<1>{}, eq<2>{}, eq<3>{}, eq<4>{})
  228. ));
  229. //////////////////////////////////////////////////////////////////
  230. // prepend
  231. //////////////////////////////////////////////////////////////////
  232. BOOST_HANA_CONSTANT_CHECK(equal(
  233. prepend(list(), eq<0>{}),
  234. list(eq<0>{})
  235. ));
  236. BOOST_HANA_CONSTANT_CHECK(equal(
  237. prepend(list(eq<1>{}), eq<0>{}),
  238. list(eq<0>{}, eq<1>{})
  239. ));
  240. BOOST_HANA_CONSTANT_CHECK(equal(
  241. prepend(list(eq<1>{}, eq<2>{}), eq<0>{}),
  242. list(eq<0>{}, eq<1>{}, eq<2>{})
  243. ));
  244. BOOST_HANA_CONSTANT_CHECK(equal(
  245. prepend(list(eq<1>{}, eq<2>{}, eq<3>{}), eq<0>{}),
  246. list(eq<0>{}, eq<1>{}, eq<2>{}, eq<3>{})
  247. ));
  248. BOOST_HANA_CONSTEXPR_CHECK(equal(
  249. prepend(list(), 1),
  250. list(1)
  251. ));
  252. BOOST_HANA_CONSTEXPR_CHECK(equal(
  253. prepend(list('2'), 1),
  254. list(1, '2')
  255. ));
  256. BOOST_HANA_CONSTEXPR_CHECK(equal(
  257. prepend(list('2', 3.3), 1),
  258. list(1, '2', 3.3)
  259. ));
  260. //////////////////////////////////////////////////////////////////
  261. // append
  262. //////////////////////////////////////////////////////////////////
  263. BOOST_HANA_CONSTANT_CHECK(equal(
  264. append(list(), eq<0>{}),
  265. list(eq<0>{})
  266. ));
  267. BOOST_HANA_CONSTANT_CHECK(equal(
  268. append(list(eq<0>{}), eq<1>{}),
  269. list(eq<0>{}, eq<1>{})
  270. ));
  271. BOOST_HANA_CONSTANT_CHECK(equal(
  272. append(list(eq<0>{}, eq<1>{}), eq<2>{}),
  273. list(eq<0>{}, eq<1>{}, eq<2>{})
  274. ));
  275. BOOST_HANA_CONSTEXPR_CHECK(equal(
  276. append(list(), 1), list(1)
  277. ));
  278. BOOST_HANA_CONSTEXPR_CHECK(equal(
  279. append(list(1), '2'), list(1, '2')
  280. ));
  281. BOOST_HANA_CONSTEXPR_CHECK(equal(
  282. append(list(1, '2'), 3.3), list(1, '2', 3.3)
  283. ));
  284. //////////////////////////////////////////////////////////////////
  285. // cycle
  286. //////////////////////////////////////////////////////////////////
  287. BOOST_HANA_CONSTANT_CHECK(equal(
  288. cycle(list(), size_c<0>),
  289. list()
  290. ));
  291. BOOST_HANA_CONSTANT_CHECK(equal(
  292. cycle(list(), size_c<1>),
  293. list()
  294. ));
  295. BOOST_HANA_CONSTANT_CHECK(equal(
  296. cycle(list(), size_c<2>),
  297. list()
  298. ));
  299. BOOST_HANA_CONSTANT_CHECK(equal(
  300. cycle(list(), size_c<3>),
  301. list()
  302. ));
  303. BOOST_HANA_CONSTANT_CHECK(equal(
  304. cycle(list(eq<0>{}), size_c<0>),
  305. list()
  306. ));
  307. BOOST_HANA_CONSTANT_CHECK(equal(
  308. cycle(list(eq<0>{}), size_c<1>),
  309. list(eq<0>{})
  310. ));
  311. BOOST_HANA_CONSTANT_CHECK(equal(
  312. cycle(list(eq<0>{}), size_c<2>),
  313. list(eq<0>{}, eq<0>{})
  314. ));
  315. BOOST_HANA_CONSTANT_CHECK(equal(
  316. cycle(list(eq<0>{}), size_c<3>),
  317. list(eq<0>{}, eq<0>{}, eq<0>{})
  318. ));
  319. BOOST_HANA_CONSTANT_CHECK(equal(
  320. cycle(list(eq<0>{}, eq<1>{}), size_c<0>),
  321. list()
  322. ));
  323. BOOST_HANA_CONSTANT_CHECK(equal(
  324. cycle(list(eq<0>{}, eq<1>{}), size_c<1>),
  325. list(eq<0>{}, eq<1>{})
  326. ));
  327. BOOST_HANA_CONSTANT_CHECK(equal(
  328. cycle(list(eq<0>{}, eq<1>{}), size_c<2>),
  329. list(eq<0>{}, eq<1>{}, eq<0>{}, eq<1>{})
  330. ));
  331. BOOST_HANA_CONSTANT_CHECK(equal(
  332. cycle(list(eq<0>{}, eq<1>{}), size_c<3>),
  333. list(eq<0>{}, eq<1>{}, eq<0>{}, eq<1>{}, eq<0>{}, eq<1>{})
  334. ));
  335. BOOST_HANA_CONSTANT_CHECK(equal(
  336. cycle(list(eq<0>{}, eq<1>{}, eq<2>{}), size_c<0>),
  337. list()
  338. ));
  339. BOOST_HANA_CONSTANT_CHECK(equal(
  340. cycle(list(eq<0>{}, eq<1>{}, eq<2>{}), size_c<1>),
  341. list(eq<0>{}, eq<1>{}, eq<2>{})
  342. ));
  343. BOOST_HANA_CONSTANT_CHECK(equal(
  344. cycle(list(eq<0>{}, eq<1>{}, eq<2>{}), size_c<2>),
  345. list(eq<0>{}, eq<1>{}, eq<2>{}, eq<0>{}, eq<1>{}, eq<2>{})
  346. ));
  347. BOOST_HANA_CONSTANT_CHECK(equal(
  348. cycle(list(eq<0>{}, eq<1>{}, eq<2>{}), size_c<3>),
  349. list(eq<0>{}, eq<1>{}, eq<2>{}, eq<0>{}, eq<1>{}, eq<2>{}, eq<0>{}, eq<1>{}, eq<2>{})
  350. ));
  351. //////////////////////////////////////////////////////////////////
  352. // remove_if
  353. //////////////////////////////////////////////////////////////////
  354. BOOST_HANA_CONSTANT_CHECK(equal(
  355. remove_if(list(), undefined{}),
  356. list()
  357. ));
  358. BOOST_HANA_CONSTANT_CHECK(equal(
  359. remove_if(list(eq<0>{}), equal.to(z)),
  360. list(eq<0>{})
  361. ));
  362. BOOST_HANA_CONSTANT_CHECK(equal(
  363. remove_if(list(z), equal.to(z)),
  364. list()
  365. ));
  366. BOOST_HANA_CONSTANT_CHECK(equal(
  367. remove_if(list(eq<0>{}, eq<1>{}), equal.to(z)),
  368. list(eq<0>{}, eq<1>{})
  369. ));
  370. BOOST_HANA_CONSTANT_CHECK(equal(
  371. remove_if(list(z, eq<1>{}), equal.to(z)),
  372. list(eq<1>{})
  373. ));
  374. BOOST_HANA_CONSTANT_CHECK(equal(
  375. remove_if(list(eq<0>{}, z), equal.to(z)),
  376. list(eq<0>{})
  377. ));
  378. BOOST_HANA_CONSTANT_CHECK(equal(
  379. remove_if(list(z, z), equal.to(z)),
  380. list()
  381. ));
  382. BOOST_HANA_CONSTANT_CHECK(equal(
  383. remove_if(list(eq<0>{}, eq<1>{}, eq<2>{}), equal.to(z)),
  384. list(eq<0>{}, eq<1>{}, eq<2>{})
  385. ));
  386. BOOST_HANA_CONSTANT_CHECK(equal(
  387. remove_if(list(eq<0>{}, eq<1>{}, z), equal.to(z)),
  388. list(eq<0>{}, eq<1>{})
  389. ));
  390. BOOST_HANA_CONSTANT_CHECK(equal(
  391. remove_if(list(eq<0>{}, z, eq<2>{}), equal.to(z)),
  392. list(eq<0>{}, eq<2>{})
  393. ));
  394. BOOST_HANA_CONSTANT_CHECK(equal(
  395. remove_if(list(z, eq<1>{}, eq<2>{}), equal.to(z)),
  396. list(eq<1>{}, eq<2>{})
  397. ));
  398. BOOST_HANA_CONSTANT_CHECK(equal(
  399. remove_if(list(z, z, eq<2>{}), equal.to(z)),
  400. list(eq<2>{})
  401. ));
  402. BOOST_HANA_CONSTANT_CHECK(equal(
  403. remove_if(list(eq<0>{}, z, z), equal.to(z)),
  404. list(eq<0>{})
  405. ));
  406. BOOST_HANA_CONSTANT_CHECK(equal(
  407. remove_if(list(z, z, z), equal.to(z)),
  408. list()
  409. ));
  410. //////////////////////////////////////////////////////////////////
  411. // remove
  412. //////////////////////////////////////////////////////////////////
  413. BOOST_HANA_CONSTANT_CHECK(equal(
  414. hana::remove(list(), undefined{}),
  415. list()
  416. ));
  417. BOOST_HANA_CONSTANT_CHECK(equal(
  418. hana::remove(list(eq<0>{}), z),
  419. list(eq<0>{})
  420. ));
  421. BOOST_HANA_CONSTANT_CHECK(equal(
  422. hana::remove(list(z), z),
  423. list()
  424. ));
  425. BOOST_HANA_CONSTANT_CHECK(equal(
  426. hana::remove(list(eq<0>{}, eq<1>{}), z),
  427. list(eq<0>{}, eq<1>{})
  428. ));
  429. BOOST_HANA_CONSTANT_CHECK(equal(
  430. hana::remove(list(z, eq<1>{}), z),
  431. list(eq<1>{})
  432. ));
  433. BOOST_HANA_CONSTANT_CHECK(equal(
  434. hana::remove(list(eq<0>{}, z), z),
  435. list(eq<0>{})
  436. ));
  437. BOOST_HANA_CONSTANT_CHECK(equal(
  438. hana::remove(list(z, z), z),
  439. list()
  440. ));
  441. BOOST_HANA_CONSTANT_CHECK(equal(
  442. hana::remove(list(eq<0>{}, eq<1>{}, eq<2>{}), z),
  443. list(eq<0>{}, eq<1>{}, eq<2>{})
  444. ));
  445. BOOST_HANA_CONSTANT_CHECK(equal(
  446. hana::remove(list(eq<0>{}, eq<1>{}, z), z),
  447. list(eq<0>{}, eq<1>{})
  448. ));
  449. BOOST_HANA_CONSTANT_CHECK(equal(
  450. hana::remove(list(eq<0>{}, z, eq<2>{}), z),
  451. list(eq<0>{}, eq<2>{})
  452. ));
  453. BOOST_HANA_CONSTANT_CHECK(equal(
  454. hana::remove(list(z, eq<1>{}, eq<2>{}), z),
  455. list(eq<1>{}, eq<2>{})
  456. ));
  457. BOOST_HANA_CONSTANT_CHECK(equal(
  458. hana::remove(list(z, z, eq<2>{}), z),
  459. list(eq<2>{})
  460. ));
  461. BOOST_HANA_CONSTANT_CHECK(equal(
  462. hana::remove(list(eq<0>{}, z, z), z),
  463. list(eq<0>{})
  464. ));
  465. BOOST_HANA_CONSTANT_CHECK(equal(
  466. hana::remove(list(z, z, z), z),
  467. list()
  468. ));
  469. //////////////////////////////////////////////////////////////////
  470. // replicate
  471. //////////////////////////////////////////////////////////////////
  472. BOOST_HANA_CONSTANT_CHECK(equal(
  473. replicate<S>(eq<0>{}, size_c<0>),
  474. list()
  475. ));
  476. BOOST_HANA_CONSTANT_CHECK(equal(
  477. replicate<S>(eq<0>{}, size_c<1>),
  478. list(eq<0>{})
  479. ));
  480. BOOST_HANA_CONSTANT_CHECK(equal(
  481. replicate<S>(eq<0>{}, size_c<2>),
  482. list(eq<0>{}, eq<0>{})
  483. ));
  484. BOOST_HANA_CONSTANT_CHECK(equal(
  485. replicate<S>(eq<0>{}, size_c<3>),
  486. list(eq<0>{}, eq<0>{}, eq<0>{})
  487. ));
  488. BOOST_HANA_CONSTANT_CHECK(equal(
  489. replicate<S>(eq<0>{}, size_c<4>),
  490. list(eq<0>{}, eq<0>{}, eq<0>{}, eq<0>{})
  491. ));
  492. BOOST_HANA_CONSTANT_CHECK(equal(
  493. replicate<S>(eq<0>{}, size_c<5>),
  494. list(eq<0>{}, eq<0>{}, eq<0>{}, eq<0>{}, eq<0>{})
  495. ));
  496. //////////////////////////////////////////////////////////////////
  497. // prefix
  498. //////////////////////////////////////////////////////////////////
  499. BOOST_HANA_CONSTANT_CHECK(equal(
  500. prefix(list(), z),
  501. list()
  502. ));
  503. BOOST_HANA_CONSTANT_CHECK(equal(
  504. prefix(list(eq<0>{}), z),
  505. list(z, eq<0>{})
  506. ));
  507. BOOST_HANA_CONSTANT_CHECK(equal(
  508. prefix(list(eq<0>{}, eq<1>{}), z),
  509. list(z, eq<0>{}, z, eq<1>{})
  510. ));
  511. BOOST_HANA_CONSTANT_CHECK(equal(
  512. prefix(list(eq<0>{}, eq<1>{}, eq<2>{}), z),
  513. list(z, eq<0>{}, z, eq<1>{}, z, eq<2>{})
  514. ));
  515. BOOST_HANA_CONSTANT_CHECK(equal(
  516. prefix(list(eq<0>{}, eq<1>{}, eq<2>{}, eq<3>{}), z),
  517. list(z, eq<0>{}, z, eq<1>{}, z, eq<2>{}, z, eq<3>{})
  518. ));
  519. //////////////////////////////////////////////////////////////////
  520. // suffix
  521. //////////////////////////////////////////////////////////////////
  522. BOOST_HANA_CONSTANT_CHECK(equal(
  523. suffix(list(), z),
  524. list()
  525. ));
  526. BOOST_HANA_CONSTANT_CHECK(equal(
  527. suffix(list(eq<0>{}), z),
  528. list(eq<0>{}, z)
  529. ));
  530. BOOST_HANA_CONSTANT_CHECK(equal(
  531. suffix(list(eq<0>{}, eq<1>{}), z),
  532. list(eq<0>{}, z, eq<1>{}, z)
  533. ));
  534. BOOST_HANA_CONSTANT_CHECK(equal(
  535. suffix(list(eq<0>{}, eq<1>{}, eq<2>{}), z),
  536. list(eq<0>{}, z, eq<1>{}, z, eq<2>{}, z)
  537. ));
  538. BOOST_HANA_CONSTANT_CHECK(equal(
  539. suffix(list(eq<0>{}, eq<1>{}, eq<2>{}, eq<3>{}), z),
  540. list(eq<0>{}, z, eq<1>{}, z, eq<2>{}, z, eq<3>{}, z)
  541. ));
  542. }
  543. };
  544. }}} // end namespace boost::hana::test
  545. #endif // !BOOST_HANA_TEST_LAWS_MONAD_PLUS_HPP