generic foldLeft, foldRight
change order