Range adapters

  • Rangeを受け取りRangeを返す関数を連続で呼び出すとき h(g(f(rng))) を rng | f | g | h のように"手続き的に"書ける
  • Boost.RangeExのboost::adaptor名前空間にあります
    • 名前が提案と違って過去分詞ではないので注意
  • 見た目に反して、あるRangeへの実装はすぐにできます
  • 正式にadapterなのかadaptorなのか不明


[]{[]
[]using[] []namespace[] []biscuit[][];[]

[]// functional and lazy![]
[]BOOST_ASSERT[][](([]
[]match[][]< [][]repeat[][]< [][]char_[][]<[][]'D'[][]>, [][]3[][] > >([]
[]boost[][]::[][]make_transform_range[][]( [][]// from Boost.RangeEx[]
[]make_filter_range[][]< [][]not_[][]< [][]char_[][]<[][]'c'[][]> > >([]
[]make_filter_range[][]< [][]not_[][]< [][]char_[][]<[][]'b'[][]> > >([]
[]make_filter_range[][]< [][]not_[][]< [][]char_[][]<[][]'a'[][]> > >([][]"abcdabcdabcd"[][])[]
[] )[]
[] ),[]
[]toupper_fun[][]()[]
[] )[]
[] )[]
[] ));[]

[]// monad!?[]
[]BOOST_ASSERT[][](([]
[]match[][]< [][]repeat[][]< [][]char_[][]<[][]'D'[][]>, [][]3[][] > >([]
[]"abcdabcdabcd"[][] |[]
[]filtered[][]< [][]not_[][]< [][]char_[][]<[][]'a'[][]> > >() |[]
[]filtered[][]< [][]not_[][]< [][]char_[][]<[][]'b'[][]> > >() |[]
[]filtered[][]< [][]not_[][]< [][]char_[][]<[][]'c'[][]> > >() |[]
[]boost[][]::[][]adaptor[][]::[][]transform[][]([][]toupper_fun[][]()) [][]// from Boost.RangeEx[]
[] )[]
[] ));[]
[]}[]