packages feed

trifecta-0.14: Text/Trifecta/Util/MaybePair.hs

module Text.Trifecta.Util.MaybePair
  ( MaybePair(..)
  ) where

import Control.Applicative
import Data.Semigroup
import Data.Monoid
import Data.Functor.Apply
import Data.Functor.Plus
import Data.Bifunctor
import Data.Bifoldable
import Data.Bitraversable
import Data.Foldable
import Data.Traversable

data MaybePair a b = JustPair a b | NothingPair
  deriving (Eq,Ord,Show,Read)

instance (Semigroup a, Semigroup b) => Semigroup (MaybePair a b) where
  a <> NothingPair = a
  NothingPair <> b = b
  JustPair a b <> JustPair c d = JustPair (a <> c) (b <> d)

instance (Semigroup a, Semigroup b) => Monoid (MaybePair a b) where
  mappend = (<>) 
  mempty = NothingPair

instance Bifunctor MaybePair where
  bimap f g (JustPair a b) = JustPair (f a) (g b)
  bimap _ _ NothingPair = NothingPair
 
instance Functor (MaybePair a) where
  fmap f (JustPair a b) = JustPair a (f b)
  fmap _ NothingPair = NothingPair

instance Semigroup a => Apply (MaybePair a) where
  JustPair a b <.> JustPair c d = JustPair (a <> c) (b d)
  _ <.> _ = NothingPair

instance Semigroup a => Alt (MaybePair a) where
  a <!> NothingPair = a
  NothingPair <!> b = b
  JustPair a b <!> JustPair c _ = JustPair (a <> c) b

instance Semigroup a => Plus (MaybePair a) where
  zero = NothingPair

instance Foldable (MaybePair a) where
  foldMap f (JustPair _ b) = f b
  foldMap _ NothingPair = mempty

instance Traversable (MaybePair a) where
  traverse f (JustPair a b) = JustPair a <$> f b
  traverse _ NothingPair = pure NothingPair

instance Bifoldable MaybePair where
  bifoldMap f g (JustPair a b) = f a `mappend` g b
  bifoldMap _ _ NothingPair = mempty

instance Bitraversable MaybePair where
  bitraverse f g (JustPair a b) = JustPair <$> f a <*> g b
  bitraverse _ _ NothingPair = pure NothingPair