
On Wed, 13 Apr 2016, David Feuer wrote:
-1. I think these are good functions, but I don't think base is the place for them. They just don't seem "fundamental" enough. That said, they can be optimized for list fusion based on this implementation, and even use build to fuse the other way. No zipWith implementation will do this.
zipWithAdj f xs = foldr go (`seq` []) xs Nothing where go x r Nothing = r (Just x) go x r (Just prev) = f prev x : r (Just x)
Btw. I have also this more general variant: mapAdjacent :: (Traversable f) => (a -> a -> b) -> NonEmpty f a -> f b mapAdjacent f (NonEmpty x xs) = snd $ Trav.mapAccumL (\a0 a1 -> (a1, f a0 a1)) x xs Maybe this is also better for fusion? http://hackage.haskell.org/package/non-empty-0.2.1/docs/Data-NonEmpty.html#v...