skip.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. namespace rpl {
  9. namespace details {
  10. class skip_helper {
  11. public:
  12. skip_helper(int count) : _count(count) {
  13. }
  14. template <
  15. typename Value,
  16. typename Error,
  17. typename Generator>
  18. auto operator()(producer<Value, Error, Generator> &&initial) {
  19. return make_producer<Value, Error>([
  20. initial = std::move(initial),
  21. skipping = _count
  22. ](const auto &consumer) mutable {
  23. auto count = consumer.template make_state<int>(skipping);
  24. auto initial_consumer = make_consumer<Value, Error>(
  25. [consumer, count](auto &&value) {
  26. if (*count) {
  27. --*count;
  28. } else {
  29. consumer.put_next_forward(
  30. std::forward<decltype(value)>(value));
  31. }
  32. }, [consumer](auto &&error) {
  33. consumer.put_error_forward(
  34. std::forward<decltype(error)>(error));
  35. }, [consumer] {
  36. consumer.put_done();
  37. });
  38. consumer.add_lifetime(initial_consumer.terminator());
  39. return std::move(initial).start_existing(initial_consumer);
  40. });
  41. }
  42. private:
  43. int _count = 0;
  44. };
  45. } // namespace details
  46. inline auto skip(int count)
  47. -> details::skip_helper {
  48. Expects(count >= 0);
  49. return details::skip_helper(count);
  50. }
  51. } // namespace rpl