compose_functor