Skip to content

Commit 11db59e

Browse files
authored
Merge pull request #56 from LiamGoodacre/feature/bifunctor-instances
Add instances for bifunctor newtypes
2 parents fd48ff8 + cf17c46 commit 11db59e

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

src/Data/Bifoldable.purs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ import Data.Monoid.Disj (Disj(..))
1010
import Data.Monoid.Dual (Dual(..))
1111
import Data.Monoid.Endo (Endo(..))
1212
import Data.Newtype (unwrap)
13+
import Data.Foldable (class Foldable, foldr, foldl, foldMap)
14+
import Data.Bifunctor.Clown (Clown(..))
15+
import Data.Bifunctor.Joker (Joker(..))
16+
import Data.Bifunctor.Flip (Flip(..))
17+
import Data.Bifunctor.Product (Product(..))
18+
import Data.Bifunctor.Wrap (Wrap(..))
1319

1420
-- | `Bifoldable` represents data structures with two type arguments which can be
1521
-- | folded.
@@ -33,6 +39,31 @@ class Bifoldable p where
3339
bifoldl :: forall a b c. (c -> a -> c) -> (c -> b -> c) -> c -> p a b -> c
3440
bifoldMap :: forall m a b. Monoid m => (a -> m) -> (b -> m) -> p a b -> m
3541

42+
instance bifoldableClown :: Foldable f => Bifoldable (Clown f) where
43+
bifoldr l _ u (Clown f) = foldr l u f
44+
bifoldl l _ u (Clown f) = foldl l u f
45+
bifoldMap l _ (Clown f) = foldMap l f
46+
47+
instance bifoldableJoker :: Foldable f => Bifoldable (Joker f) where
48+
bifoldr _ r u (Joker f) = foldr r u f
49+
bifoldl _ r u (Joker f) = foldl r u f
50+
bifoldMap _ r (Joker f) = foldMap r f
51+
52+
instance bifoldableFlip :: Bifoldable p => Bifoldable (Flip p) where
53+
bifoldr r l u (Flip p) = bifoldr l r u p
54+
bifoldl r l u (Flip p) = bifoldl l r u p
55+
bifoldMap r l (Flip p) = bifoldMap l r p
56+
57+
instance bifoldableProduct :: (Bifoldable f, Bifoldable g) => Bifoldable (Product f g) where
58+
bifoldr l r u m = bifoldrDefault l r u m
59+
bifoldl l r u m = bifoldlDefault l r u m
60+
bifoldMap l r (Product f g) = bifoldMap l r f <> bifoldMap l r g
61+
62+
instance bifoldableWrap :: Bifoldable p => Bifoldable (Wrap p) where
63+
bifoldr l r u (Wrap p) = bifoldr l r u p
64+
bifoldl l r u (Wrap p) = bifoldl l r u p
65+
bifoldMap l r (Wrap p) = bifoldMap l r p
66+
3667
-- | A default implementation of `bifoldr` using `bifoldMap`.
3768
-- |
3869
-- | Note: when defining a `Bifoldable` instance, this function is unsafe to

src/Data/Bitraversable.purs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@ module Data.Bitraversable
1313
import Prelude
1414

1515
import Data.Bifoldable (class Bifoldable, biall, biany, bifold, bifoldMap, bifoldMapDefaultL, bifoldMapDefaultR, bifoldl, bifoldlDefault, bifoldr, bifoldrDefault, bifor_, bisequence_, bitraverse_)
16+
import Data.Traversable (class Traversable, traverse, sequence)
1617
import Data.Bifunctor (class Bifunctor, bimap)
18+
import Data.Bifunctor.Clown (Clown(..))
19+
import Data.Bifunctor.Joker (Joker(..))
20+
import Data.Bifunctor.Flip (Flip(..))
21+
import Data.Bifunctor.Product (Product(..))
22+
import Data.Bifunctor.Wrap (Wrap(..))
1723

1824
-- | `Bitraversable` represents data structures with two type arguments which can be
1925
-- | traversed.
@@ -30,6 +36,26 @@ class (Bifunctor t, Bifoldable t) <= Bitraversable t where
3036
bitraverse :: forall f a b c d. Applicative f => (a -> f c) -> (b -> f d) -> t a b -> f (t c d)
3137
bisequence :: forall f a b. Applicative f => t (f a) (f b) -> f (t a b)
3238

39+
instance bitraversableClown :: Traversable f => Bitraversable (Clown f) where
40+
bitraverse l _ (Clown f) = Clown <$> traverse l f
41+
bisequence (Clown f) = Clown <$> sequence f
42+
43+
instance bitraversableJoker :: Traversable f => Bitraversable (Joker f) where
44+
bitraverse _ r (Joker f) = Joker <$> traverse r f
45+
bisequence (Joker f) = Joker <$> sequence f
46+
47+
instance bitraversableFlip :: Bitraversable p => Bitraversable (Flip p) where
48+
bitraverse r l (Flip p) = Flip <$> bitraverse l r p
49+
bisequence (Flip p) = Flip <$> bisequence p
50+
51+
instance bitraversableProduct :: (Bitraversable f, Bitraversable g) => Bitraversable (Product f g) where
52+
bitraverse l r (Product f g) = Product <$> bitraverse l r f <*> bitraverse l r g
53+
bisequence (Product f g) = Product <$> bisequence f <*> bisequence g
54+
55+
instance bitraversableWrap :: Bitraversable p => Bitraversable (Wrap p) where
56+
bitraverse l r (Wrap p) = Wrap <$> bitraverse l r p
57+
bisequence (Wrap p) = Wrap <$> bisequence p
58+
3359
ltraverse
3460
:: forall t b c a f
3561
. (Bitraversable t, Applicative f)

0 commit comments

Comments
 (0)