diff options
Diffstat (limited to 'src/list')
-rw-r--r-- | src/list/operation/higher/filter.h | 36 | ||||
-rw-r--r-- | src/list/operation/higher/remove.h | 21 |
2 files changed, 24 insertions, 33 deletions
diff --git a/src/list/operation/higher/filter.h b/src/list/operation/higher/filter.h index 17d49c2..9dcdf37 100644 --- a/src/list/operation/higher/filter.h +++ b/src/list/operation/higher/filter.h @@ -8,25 +8,17 @@ namespace tav { namespace detail { -template < - template<typename> class Predicate, - typename List -> -class Filter { - private: - template < - typename Current, - typename Previous - > - using predicate_wrapper = If< - Eval<Predicate<Current>>, - Cons<Current, Previous>, - Previous - >; - - public: - typedef tav::Fold<predicate_wrapper, void, List> type; - +template <template<typename> class Predicate> +struct filter_predicate { + template < + typename Current, + typename Previous + > + using function = If< + Eval<Predicate<Current>>, + Cons<Current, Previous>, + Previous + >; }; } @@ -35,7 +27,11 @@ template < template<typename> class Predicate, typename List > -using Filter = Eval<detail::Filter<Predicate, List>>; +using Filter = Fold< + detail::filter_predicate<Predicate>::template function, + void, + List +>; } diff --git a/src/list/operation/higher/remove.h b/src/list/operation/higher/remove.h index e67e962..598f5a6 100644 --- a/src/list/operation/higher/remove.h +++ b/src/list/operation/higher/remove.h @@ -7,18 +7,10 @@ namespace tav { namespace detail { -template < - template<typename> class Predicate, - typename List -> -class Remove { - private: - template <typename Element> - using predicate_negator = Not<Predicate<Element>>; - - public: - typedef tav::Filter<predicate_negator, List> type; - +template <template<typename> class Predicate> +struct predicate_negator { + template <typename Element> + using function = Not<Predicate<Element>>; }; } @@ -27,7 +19,10 @@ template < template<typename> class Predicate, typename List > -using Remove = Eval<detail::Remove<Predicate, List>>; +using Remove = Filter< + detail::predicate_negator<Predicate>::template function, + List +>; } |