range.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #pragma once
  8. #include <rpl/producer.h>
  9. #include <vector>
  10. namespace rpl {
  11. template <typename Value, typename Error = no_error>
  12. inline auto single(Value &&value) {
  13. return make_producer<std::decay_t<Value>, Error>([
  14. value = std::forward<Value>(value)
  15. ](const auto &consumer) mutable {
  16. consumer.put_next(std::move(value));
  17. consumer.put_done();
  18. return lifetime();
  19. });
  20. }
  21. template <typename Error = no_error>
  22. inline auto single() {
  23. return make_producer<rpl::empty_value, Error>([](const auto &consumer) {
  24. consumer.put_next({});
  25. consumer.put_done();
  26. return lifetime();
  27. });
  28. }
  29. template <typename Value, typename Error = no_error>
  30. inline auto vector(std::vector<Value> &&values) {
  31. return make_producer<Value, Error>([
  32. values = std::move(values)
  33. ](const auto &consumer) mutable {
  34. for (auto &value : values) {
  35. consumer.put_next(std::move(value));
  36. }
  37. consumer.put_done();
  38. return lifetime();
  39. });
  40. }
  41. template <typename Error = no_error>
  42. inline auto vector(std::vector<bool> &&values) {
  43. return make_producer<bool, Error>([
  44. values = std::move(values)
  45. ](const auto &consumer) {
  46. for (auto value : values) {
  47. consumer.put_next_copy(value);
  48. }
  49. consumer.put_done();
  50. return lifetime();
  51. });
  52. }
  53. template <
  54. typename Range,
  55. typename Value = std::decay_t<
  56. decltype(*std::begin(std::declval<Range>()))>>
  57. inline auto range(Range &&range) {
  58. return vector(std::vector<Value>(
  59. std::begin(range),
  60. std::end(range)));
  61. }
  62. inline auto ints(int from, int till) {
  63. Expects(from <= till);
  64. return make_producer<int>([from, till](const auto &consumer) {
  65. for (auto i = from; i != till; ++i) {
  66. consumer.put_next_copy(i);
  67. }
  68. consumer.put_done();
  69. return lifetime();
  70. });
  71. }
  72. inline auto ints(int count) {
  73. return ints(0, count);
  74. }
  75. } // namespace rpl