more efficient merge_with
allow merge_with to be lazy(ish) again