// // fluent.hpp // stream // // Created by Sam Jaffe on 1/28/17. // #pragma once #include "../streams.hpp" namespace stream { namespace traits { template using is_filter = std::is_same()(std::declval()))>; template struct is_collection : public std::false_type {}; template struct is_collection::value>::type> : public std::true_type {}; }} namespace stream { namespace detail { template auto operator||(stream_base const & s, F && f) -> decltype(s.flatmap(f)) { return s.flatmap(f); } template < typename T, typename F, typename = typename std::enable_if::value>::type> auto operator|(stream_base const & s, F && f) -> decltype(s.map(f)) { return s.map(f); } template < typename T, typename P, typename = typename std::enable_if::value>::type> stream_base operator|(stream_base const & s, P && f) { return s.filter(f); } template R operator>(stream_base const & s, R const & val) { return s.accumulate(val); } template L operator>(stream_base const & s, std::pair const & pair) { return s.accumulate(pair.second, pair.first); } template ::value>::type> typename std::decay::type operator>(stream_base const & s, F && f) { return s.accumulate(f, typename std::decay::type()); } template ::value>::type> C & operator>(stream_base const & s, C & c) { s.collect(c); return c; } }}