add internal reduce
use map