pass `fn`