// // 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 ::value>::type> auto operator|(stream_base const&s, F && f) -> decltype(s.map(f)) { return s.map(f); } template ::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; } } }