better functor, implemented from-maybe