Safe Haskell | Trustworthy |
---|---|
Language | Haskell2010 |
These
-based aligning and unaligning of functors with non-uniform
shapes.
For a traversals traversal of (bi)foldable (bi)functors through said functors see Data.Crosswalk .
Synopsis
- class Functor f => Semialign f where
-
class
Semialign
f =>
Align
f
where
- nil :: f a
-
class
Semialign
f =>
Unalign
f
where
- unalign :: f ( These a b) -> (f a, f b)
- unalignWith :: (c -> These a b) -> f c -> (f a, f b)
- salign :: ( Semialign f, Semigroup a) => f a -> f a -> f a
- padZip :: Semialign f => f a -> f b -> f ( Maybe a, Maybe b)
- padZipWith :: Semialign 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
Documentation
class Functor f => Semialign f where Source #
Functors supporting an
align
operation that takes the union of
non-uniform shapes.
Minimal definition: either
align
or
alignWith
.
Laws
The laws of
align
and
zip
resemble lattice laws.
There is a plenty of laws, but they are simply satisfied.
And an addition property if
f
is
Foldable
,
which tries to enforce
align
-feel:
neither values are duplicated nor lost.
Note:
join
f x = f x x
Idempotency
join align ≡ fmap (join These)
Commutativity
align x y ≡ swap <$> align y x
Associativity
align x (align y z) ≡ assoc <$> align (align x y) z
With
alignWith f a b ≡ f <$> align a b
Functoriality
align (f <$> x) (g <$> y) ≡ bimap f g <$> align x y
Alignedness
, if
f
is
Foldable
toList x ≡ toListOf (folded . here) (align x y) ≡ mapMaybe justHere (toList (align x y))
And an addition property if
f
is
Foldable
,
which tries to enforce
align
-feel:
neither values are duplicated nor lost.
toList x = toListOf (folded . here) (align x y) = mapMaybe justHere (toList (align x y))
align :: f a -> f b -> f ( These a b) Source #
Analogous to
, combines two structures by taking the union of
their shapes and using
zip
to hold the elements.
These
alignWith :: ( These a b -> c) -> f a -> f b -> f c Source #
Analogous to
, combines two structures by taking the union of
their shapes and combining the elements with the given function.
zipWith
Instances
Semialign [] Source # | |
Semialign Maybe Source # | |
Semialign Option Source # | |
Semialign ZipList Source # |
|
Semialign Identity Source # | |
Semialign NonEmpty Source # | |
Semialign IntMap Source # | |
Semialign Tree Source # | |
Semialign Seq Source # | |
Semialign Vector Source # | |
Semialign ( Proxy :: Type -> Type ) Source # | |
Ord k => Semialign ( Map k) Source # | |
( Eq k, Hashable k) => Semialign ( HashMap k) Source # | |
Monad m => Semialign ( Stream m) Source # | |
Semialign ( Tagged b) Source # | |
Monad m => Semialign ( Bundle m v) Source # | |
Semialign ((->) e :: Type -> Type ) Source # | |
( Semialign f, Semialign g) => Semialign ( Product f g) Source # | |
( Semialign f, Semialign g) => Semialign ( Compose f g) Source # | |
class Semialign f => Align f where Source #
Instances
Align [] Source # | |
Defined in Data.Semialign.Internal |
|
Align Maybe Source # | |
Defined in Data.Semialign.Internal |
|
Align Option Source # | |
Defined in Data.Semialign.Internal |
|
Align ZipList Source # | |
Defined in Data.Semialign.Internal |
|
Align IntMap Source # | |
Defined in Data.Semialign.Internal |
|
Align Seq Source # | |
Defined in Data.Semialign.Internal |
|
Align Vector Source # | |
Defined in Data.Semialign.Internal |
|
Align ( Proxy :: Type -> Type ) Source # | |
Defined in Data.Semialign.Internal |
|
Ord k => Align ( Map k) Source # | |
Defined in Data.Semialign.Internal |
|
( Eq k, Hashable k) => Align ( HashMap k) Source # | |
Defined in Data.Semialign.Internal |
|
Monad m => Align ( Stream m) Source # | |
Defined in Data.Semialign.Internal |
|
Monad m => Align ( Bundle m v) Source # | |
Defined in Data.Semialign.Internal |
|
( Align f, Align g) => Align ( Product f g) Source # | |
Defined in Data.Semialign.Internal |
|
( Align f, Semialign g) => Align ( Compose f g) Source # | |
Defined in Data.Semialign.Internal |
class Semialign f => Unalign f where Source #
Alignable functors supporting an "inverse" to
align
: splitting
a union shape into its component parts.
Laws
uncurry align (unalign xs) ≡ xs unalign (align xs ys) ≡ (xs, ys)
Compatibility note
In version 1
unalign
was changed to return
(f a, f b)
pair,
instead of
(f (Just a), f (Just b))
. Old behaviour can be achieved with
if ever needed.
>>>
unzipWith (unalign . Just) [This 'a', That 'b', These 'c' 'd']
([Just 'a',Nothing,Just 'c'],[Nothing,Just 'b',Just 'd'])
unalign :: f ( These a b) -> (f a, f b) Source #
unalignWith :: (c -> These a b) -> f c -> (f a, f b) Source #
Specialized aligns
salign :: ( Semialign f, Semigroup a) => f a -> f a -> f a Source #
Align two structures and combine with
<>
.
lpadZipWith :: ( Maybe a -> b -> c) -> [a] -> [b] -> [c] Source #
Left-padded
zipWith
.
rpadZipWith :: (a -> Maybe b -> c) -> [a] -> [b] -> [c] Source #
Right-padded
zipWith
.