piping.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #pragma once
  2. /*
  3. * Copyright 2018-present Facebook, Inc.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. #include <folly/experimental/pushmi/traits.h>
  18. namespace pushmi {
  19. PUSHMI_TEMPLATE(class In, class Op)
  20. (requires lazy::Sender<std::decay_t<In>>&& lazy::Invocable<Op&, In>)
  21. decltype(auto) operator|(In&& in, Op op) {
  22. return op((In &&) in);
  23. }
  24. PUSHMI_INLINE_VAR constexpr struct pipe_fn {
  25. #if __cpp_fold_expressions >= 201603
  26. template <class T, class... FN>
  27. auto operator()(T t, FN... fn) const -> decltype((t | ... | fn)) {
  28. return (t | ... | fn);
  29. }
  30. #else
  31. template <class T, class F>
  32. auto operator()(T t, F f) const -> decltype(t | f) {
  33. return t | f;
  34. }
  35. template <class T, class F, class... FN, class This = pipe_fn>
  36. auto operator()(T t, F f, FN... fn) const
  37. -> decltype(This()((t | f), fn...)) {
  38. return This()((t | f), fn...);
  39. }
  40. #endif
  41. } const pipe{};
  42. } // namespace pushmi