module M where data ListZipper a = ListZipper [a] a [a] deriving (Functor) instance Foldable ListZipper instance Traversable ListZipper where traverse f (ListZipper left focus right) = ListZipper <$> traverseRev f left <*> f focus <*> traverse f right traverseRev :: Applicative f => (a -> f b) -> [a] -> f [b] traverseRev _ [] = pure [] traverseRev f (x : xs) = flip (:) <$> traverseRev f xs <*> f x