implement functional way [ci skip]