These-based zipping and unzipping of functors with non-uniform
shapes, plus traversal of (bi)foldable (bi)functors through said
- class Functor f => Align f where
- malign :: (Align f, Monoid a) => f a -> f a -> f a
- padZip :: Align f => f a -> f b -> f (Maybe a, Maybe b)
- padZipWith :: Align f => (Maybe a -> Maybe b -> c) -> f a -> f b -> f c
- lpadZip :: [a] -> [b] -> [(Maybe a, b)]
- lpadZipWith :: (Maybe a -> b -> c) -> [a] -> [b] -> [c]
- rpadZip :: [a] -> [b] -> [(a, Maybe b)]
- rpadZipWith :: (a -> Maybe b -> c) -> [a] -> [b] -> [c]
- alignVectorWith :: (Vector v a, Vector v b, Vector v c) => (These a b -> c) -> v a -> v b -> v c
- class Align f => Unalign f where
- class (Functor t, Foldable t) => Crosswalk t where
- class (Bifunctor t, Bifoldable t) => Bicrosswalk t where
Functors supporting a zip operation that takes the union of non-uniform shapes.
If your functor is actually a functor from
Kleisli Maybe to
Hask (so it supports
maybeMap :: (a -> Maybe b) -> f a -> f
b), then an
Align instance is making your functor lax monoidal
w.r.t. the cartesian monoidal structure on
These is the cartesian product in that category
Maybe (These b c) ~ (a -> Maybe b, a -> Maybe c)). This insight
is due to rwbarton.
nil and either
(`align` nil) = fmap This (nil `align`) = fmap That join align = fmap (join These) align (f <$> x) (g <$> y) = bimap f g <$> align x y alignWith f a b = f <$> align a b
Align two structures and combine with
Alignable functors supporting an "inverse" to
a union shape into its component parts.
Minimal definition: nothing; a default definition is provided, but it may not have the desired definition for all functors. See the source for more information.
unalign nil = (nil, nil) unalign (This <$> x) = (Just <$> x, Nothing <$ x) unalign (That <$> y) = (Nothing <$ y, Just <$> y) unalign (join These <$> x) = (Just <$> x, Just <$> x) unalign ((x `These`) <$> y) = (Just x <$ y, Just <$> y) unalign ((`These` y) <$> x) = (Just <$> x, Just y <$ x)
Foldable functors supporting traversal through an alignable functor.
crosswalk (const nil) = const nil crosswalk f = sequenceL . fmap f
Bifoldable bifunctors supporting traversal through an alignable functor.
bicrosswalk (const empty) (const empty) = const empty bicrosswalk f g = bisequenceL . bimap f g