{-# LANGUAGE CPP #-}
#include "recursion-schemes-common.h"
#ifdef __GLASGOW_HASKELL__
{-# LANGUAGE DeriveDataTypeable #-}
#if HAS_GENERIC
{-# LANGUAGE DeriveGeneric #-}
#endif
#endif
module Data.Functor.Base
( NonEmptyF(..)
) where
#ifdef __GLASGOW_HASKELL__
import Data.Data (Typeable)
#if HAS_GENERIC
import GHC.Generics (Generic)
#endif
#if HAS_GENERIC1
import GHC.Generics (Generic1)
#endif
#endif
import Control.Applicative
import Data.Monoid
import Data.Functor.Classes
( Eq1(..), Ord1(..), Show1(..), Read1(..)
#ifdef LIFTED_FUNCTOR_CLASSES
, Eq2(..), Ord2(..), Show2(..), Read2(..)
#endif
)
import qualified Data.Foldable as F
import qualified Data.Traversable as T
import qualified Data.Bifunctor as Bi
import qualified Data.Bifoldable as Bi
import qualified Data.Bitraversable as Bi
import Prelude hiding (head, tail)
data NonEmptyF a b = NonEmptyF { NonEmptyF a b -> a
head :: a, NonEmptyF a b -> Maybe b
tail :: Maybe b }
deriving (NonEmptyF a b -> NonEmptyF a b -> Bool
(NonEmptyF a b -> NonEmptyF a b -> Bool)
-> (NonEmptyF a b -> NonEmptyF a b -> Bool) -> Eq (NonEmptyF a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => NonEmptyF a b -> NonEmptyF a b -> Bool
/= :: NonEmptyF a b -> NonEmptyF a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => NonEmptyF a b -> NonEmptyF a b -> Bool
== :: NonEmptyF a b -> NonEmptyF a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => NonEmptyF a b -> NonEmptyF a b -> Bool
Eq,Eq (NonEmptyF a b)
Eq (NonEmptyF a b) =>
(NonEmptyF a b -> NonEmptyF a b -> Ordering)
-> (NonEmptyF a b -> NonEmptyF a b -> Bool)
-> (NonEmptyF a b -> NonEmptyF a b -> Bool)
-> (NonEmptyF a b -> NonEmptyF a b -> Bool)
-> (NonEmptyF a b -> NonEmptyF a b -> Bool)
-> (NonEmptyF a b -> NonEmptyF a b -> NonEmptyF a b)
-> (NonEmptyF a b -> NonEmptyF a b -> NonEmptyF a b)
-> Ord (NonEmptyF a b)
NonEmptyF a b -> NonEmptyF a b -> Bool
NonEmptyF a b -> NonEmptyF a b -> Ordering
NonEmptyF a b -> NonEmptyF a b -> NonEmptyF a b
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a b. (Ord a, Ord b) => Eq (NonEmptyF a b)
forall a b.
(Ord a, Ord b) =>
NonEmptyF a b -> NonEmptyF a b -> Bool
forall a b.
(Ord a, Ord b) =>
NonEmptyF a b -> NonEmptyF a b -> Ordering
forall a b.
(Ord a, Ord b) =>
NonEmptyF a b -> NonEmptyF a b -> NonEmptyF a b
min :: NonEmptyF a b -> NonEmptyF a b -> NonEmptyF a b
$cmin :: forall a b.
(Ord a, Ord b) =>
NonEmptyF a b -> NonEmptyF a b -> NonEmptyF a b
max :: NonEmptyF a b -> NonEmptyF a b -> NonEmptyF a b
$cmax :: forall a b.
(Ord a, Ord b) =>
NonEmptyF a b -> NonEmptyF a b -> NonEmptyF a b
>= :: NonEmptyF a b -> NonEmptyF a b -> Bool
$c>= :: forall a b.
(Ord a, Ord b) =>
NonEmptyF a b -> NonEmptyF a b -> Bool
> :: NonEmptyF a b -> NonEmptyF a b -> Bool
$c> :: forall a b.
(Ord a, Ord b) =>
NonEmptyF a b -> NonEmptyF a b -> Bool
<= :: NonEmptyF a b -> NonEmptyF a b -> Bool
$c<= :: forall a b.
(Ord a, Ord b) =>
NonEmptyF a b -> NonEmptyF a b -> Bool
< :: NonEmptyF a b -> NonEmptyF a b -> Bool
$c< :: forall a b.
(Ord a, Ord b) =>
NonEmptyF a b -> NonEmptyF a b -> Bool
compare :: NonEmptyF a b -> NonEmptyF a b -> Ordering
$ccompare :: forall a b.
(Ord a, Ord b) =>
NonEmptyF a b -> NonEmptyF a b -> Ordering
$cp1Ord :: forall a b. (Ord a, Ord b) => Eq (NonEmptyF a b)
Ord,Int -> NonEmptyF a b -> ShowS
[NonEmptyF a b] -> ShowS
NonEmptyF a b -> String
(Int -> NonEmptyF a b -> ShowS)
-> (NonEmptyF a b -> String)
-> ([NonEmptyF a b] -> ShowS)
-> Show (NonEmptyF a b)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall a b. (Show a, Show b) => Int -> NonEmptyF a b -> ShowS
forall a b. (Show a, Show b) => [NonEmptyF a b] -> ShowS
forall a b. (Show a, Show b) => NonEmptyF a b -> String
showList :: [NonEmptyF a b] -> ShowS
$cshowList :: forall a b. (Show a, Show b) => [NonEmptyF a b] -> ShowS
show :: NonEmptyF a b -> String
$cshow :: forall a b. (Show a, Show b) => NonEmptyF a b -> String
showsPrec :: Int -> NonEmptyF a b -> ShowS
$cshowsPrec :: forall a b. (Show a, Show b) => Int -> NonEmptyF a b -> ShowS
Show,ReadPrec [NonEmptyF a b]
ReadPrec (NonEmptyF a b)
Int -> ReadS (NonEmptyF a b)
ReadS [NonEmptyF a b]
(Int -> ReadS (NonEmptyF a b))
-> ReadS [NonEmptyF a b]
-> ReadPrec (NonEmptyF a b)
-> ReadPrec [NonEmptyF a b]
-> Read (NonEmptyF a b)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall a b. (Read a, Read b) => ReadPrec [NonEmptyF a b]
forall a b. (Read a, Read b) => ReadPrec (NonEmptyF a b)
forall a b. (Read a, Read b) => Int -> ReadS (NonEmptyF a b)
forall a b. (Read a, Read b) => ReadS [NonEmptyF a b]
readListPrec :: ReadPrec [NonEmptyF a b]
$creadListPrec :: forall a b. (Read a, Read b) => ReadPrec [NonEmptyF a b]
readPrec :: ReadPrec (NonEmptyF a b)
$creadPrec :: forall a b. (Read a, Read b) => ReadPrec (NonEmptyF a b)
readList :: ReadS [NonEmptyF a b]
$creadList :: forall a b. (Read a, Read b) => ReadS [NonEmptyF a b]
readsPrec :: Int -> ReadS (NonEmptyF a b)
$creadsPrec :: forall a b. (Read a, Read b) => Int -> ReadS (NonEmptyF a b)
Read,Typeable
#if HAS_GENERIC
, (forall x. NonEmptyF a b -> Rep (NonEmptyF a b) x)
-> (forall x. Rep (NonEmptyF a b) x -> NonEmptyF a b)
-> Generic (NonEmptyF a b)
forall x. Rep (NonEmptyF a b) x -> NonEmptyF a b
forall x. NonEmptyF a b -> Rep (NonEmptyF a b) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a b x. Rep (NonEmptyF a b) x -> NonEmptyF a b
forall a b x. NonEmptyF a b -> Rep (NonEmptyF a b) x
$cto :: forall a b x. Rep (NonEmptyF a b) x -> NonEmptyF a b
$cfrom :: forall a b x. NonEmptyF a b -> Rep (NonEmptyF a b) x
Generic
#endif
#if HAS_GENERIC1
, (forall a. NonEmptyF a a -> Rep1 (NonEmptyF a) a)
-> (forall a. Rep1 (NonEmptyF a) a -> NonEmptyF a a)
-> Generic1 (NonEmptyF a)
forall a. Rep1 (NonEmptyF a) a -> NonEmptyF a a
forall a. NonEmptyF a a -> Rep1 (NonEmptyF a) a
forall a a. Rep1 (NonEmptyF a) a -> NonEmptyF a a
forall a a. NonEmptyF a a -> Rep1 (NonEmptyF a) a
forall k (f :: k -> *).
(forall (a :: k). f a -> Rep1 f a)
-> (forall (a :: k). Rep1 f a -> f a) -> Generic1 f
$cto1 :: forall a a. Rep1 (NonEmptyF a) a -> NonEmptyF a a
$cfrom1 :: forall a a. NonEmptyF a a -> Rep1 (NonEmptyF a) a
Generic1
#endif
)
#ifdef LIFTED_FUNCTOR_CLASSES
instance Eq2 NonEmptyF where
liftEq2 :: (a -> b -> Bool)
-> (c -> d -> Bool) -> NonEmptyF a c -> NonEmptyF b d -> Bool
liftEq2 f :: a -> b -> Bool
f g :: c -> d -> Bool
g (NonEmptyF a :: a
a mb :: Maybe c
mb) (NonEmptyF a' :: b
a' mb' :: Maybe d
mb') = a -> b -> Bool
f a
a b
a' Bool -> Bool -> Bool
&& (c -> d -> Bool) -> Maybe c -> Maybe d -> Bool
forall (f :: * -> *) a b.
Eq1 f =>
(a -> b -> Bool) -> f a -> f b -> Bool
liftEq c -> d -> Bool
g Maybe c
mb Maybe d
mb'
instance Eq a => Eq1 (NonEmptyF a) where
liftEq :: (a -> b -> Bool) -> NonEmptyF a a -> NonEmptyF a b -> Bool
liftEq = (a -> a -> Bool)
-> (a -> b -> Bool) -> NonEmptyF a a -> NonEmptyF a b -> Bool
forall (f :: * -> * -> *) a b c d.
Eq2 f =>
(a -> b -> Bool) -> (c -> d -> Bool) -> f a c -> f b d -> Bool
liftEq2 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
instance Ord2 NonEmptyF where
liftCompare2 :: (a -> b -> Ordering)
-> (c -> d -> Ordering)
-> NonEmptyF a c
-> NonEmptyF b d
-> Ordering
liftCompare2 f :: a -> b -> Ordering
f g :: c -> d -> Ordering
g (NonEmptyF a :: a
a mb :: Maybe c
mb) (NonEmptyF a' :: b
a' mb' :: Maybe d
mb') = a -> b -> Ordering
f a
a b
a' Ordering -> Ordering -> Ordering
forall a. Monoid a => a -> a -> a
`mappend` (c -> d -> Ordering) -> Maybe c -> Maybe d -> Ordering
forall (f :: * -> *) a b.
Ord1 f =>
(a -> b -> Ordering) -> f a -> f b -> Ordering
liftCompare c -> d -> Ordering
g Maybe c
mb Maybe d
mb'
instance Ord a => Ord1 (NonEmptyF a) where
liftCompare :: (a -> b -> Ordering) -> NonEmptyF a a -> NonEmptyF a b -> Ordering
liftCompare = (a -> a -> Ordering)
-> (a -> b -> Ordering)
-> NonEmptyF a a
-> NonEmptyF a b
-> Ordering
forall (f :: * -> * -> *) a b c d.
Ord2 f =>
(a -> b -> Ordering)
-> (c -> d -> Ordering) -> f a c -> f b d -> Ordering
liftCompare2 a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
instance Show a => Show1 (NonEmptyF a) where
liftShowsPrec :: (Int -> a -> ShowS)
-> ([a] -> ShowS) -> Int -> NonEmptyF a a -> ShowS
liftShowsPrec = (Int -> a -> ShowS)
-> ([a] -> ShowS)
-> (Int -> a -> ShowS)
-> ([a] -> ShowS)
-> Int
-> NonEmptyF a a
-> ShowS
forall (f :: * -> * -> *) a b.
Show2 f =>
(Int -> a -> ShowS)
-> ([a] -> ShowS)
-> (Int -> b -> ShowS)
-> ([b] -> ShowS)
-> Int
-> f a b
-> ShowS
liftShowsPrec2 Int -> a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec [a] -> ShowS
forall a. Show a => [a] -> ShowS
showList
instance Show2 NonEmptyF where
liftShowsPrec2 :: (Int -> a -> ShowS)
-> ([a] -> ShowS)
-> (Int -> b -> ShowS)
-> ([b] -> ShowS)
-> Int
-> NonEmptyF a b
-> ShowS
liftShowsPrec2 sa :: Int -> a -> ShowS
sa _ sb :: Int -> b -> ShowS
sb slb :: [b] -> ShowS
slb d :: Int
d (NonEmptyF a :: a
a b :: Maybe b
b) = Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 10)
(ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString "NonEmptyF "
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> a -> ShowS
sa 11 a
a
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString " "
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> b -> ShowS) -> ([b] -> ShowS) -> Int -> Maybe b -> ShowS
forall (f :: * -> *) a.
Show1 f =>
(Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> f a -> ShowS
liftShowsPrec Int -> b -> ShowS
sb [b] -> ShowS
slb 11 Maybe b
b
instance Read2 NonEmptyF where
liftReadsPrec2 :: (Int -> ReadS a)
-> ReadS [a]
-> (Int -> ReadS b)
-> ReadS [b]
-> Int
-> ReadS (NonEmptyF a b)
liftReadsPrec2 ra :: Int -> ReadS a
ra _ rb :: Int -> ReadS b
rb rlb :: ReadS [b]
rlb d :: Int
d = Bool -> ReadS (NonEmptyF a b) -> ReadS (NonEmptyF a b)
forall a. Bool -> ReadS a -> ReadS a
readParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 10) (ReadS (NonEmptyF a b) -> ReadS (NonEmptyF a b))
-> ReadS (NonEmptyF a b) -> ReadS (NonEmptyF a b)
forall a b. (a -> b) -> a -> b
$ \s :: String
s -> ReadS (NonEmptyF a b)
cons String
s
where
cons :: ReadS (NonEmptyF a b)
cons s0 :: String
s0 = do
("NonEmptyF", s1 :: String
s1) <- ReadS String
lex String
s0
(a :: a
a, s2 :: String
s2) <- Int -> ReadS a
ra 11 String
s1
(mb :: Maybe b
mb, s3 :: String
s3) <- (Int -> ReadS b) -> ReadS [b] -> Int -> ReadS (Maybe b)
forall (f :: * -> *) a.
Read1 f =>
(Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (f a)
liftReadsPrec Int -> ReadS b
rb ReadS [b]
rlb 11 String
s2
(NonEmptyF a b, String) -> [(NonEmptyF a b, String)]
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Maybe b -> NonEmptyF a b
forall a b. a -> Maybe b -> NonEmptyF a b
NonEmptyF a
a Maybe b
mb, String
s3)
instance Read a => Read1 (NonEmptyF a) where
liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (NonEmptyF a a)
liftReadsPrec = (Int -> ReadS a)
-> ReadS [a]
-> (Int -> ReadS a)
-> ReadS [a]
-> Int
-> ReadS (NonEmptyF a a)
forall (f :: * -> * -> *) a b.
Read2 f =>
(Int -> ReadS a)
-> ReadS [a]
-> (Int -> ReadS b)
-> ReadS [b]
-> Int
-> ReadS (f a b)
liftReadsPrec2 Int -> ReadS a
forall a. Read a => Int -> ReadS a
readsPrec ReadS [a]
forall a. Read a => ReadS [a]
readList
#else
instance Eq a => Eq1 (NonEmptyF a) where eq1 = (==)
instance Ord a => Ord1 (NonEmptyF a) where compare1 = compare
instance Show a => Show1 (NonEmptyF a) where showsPrec1 = showsPrec
instance Read a => Read1 (NonEmptyF a) where readsPrec1 = readsPrec
#endif
instance Functor (NonEmptyF a) where
fmap :: (a -> b) -> NonEmptyF a a -> NonEmptyF a b
fmap f :: a -> b
f = a -> Maybe b -> NonEmptyF a b
forall a b. a -> Maybe b -> NonEmptyF a b
NonEmptyF (a -> Maybe b -> NonEmptyF a b)
-> (NonEmptyF a a -> a)
-> NonEmptyF a a
-> Maybe b
-> NonEmptyF a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmptyF a a -> a
forall a b. NonEmptyF a b -> a
head (NonEmptyF a a -> Maybe b -> NonEmptyF a b)
-> (NonEmptyF a a -> Maybe b) -> NonEmptyF a a -> NonEmptyF a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f (Maybe a -> Maybe b)
-> (NonEmptyF a a -> Maybe a) -> NonEmptyF a a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyF a a -> Maybe a
forall a b. NonEmptyF a b -> Maybe b
tail)
instance F.Foldable (NonEmptyF a) where
foldMap :: (a -> m) -> NonEmptyF a a -> m
foldMap f :: a -> m
f = (a -> m) -> Maybe a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
F.foldMap a -> m
f (Maybe a -> m) -> (NonEmptyF a a -> Maybe a) -> NonEmptyF a a -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyF a a -> Maybe a
forall a b. NonEmptyF a b -> Maybe b
tail
instance T.Traversable (NonEmptyF a) where
traverse :: (a -> f b) -> NonEmptyF a a -> f (NonEmptyF a b)
traverse f :: a -> f b
f = (Maybe b -> NonEmptyF a b) -> f (Maybe b) -> f (NonEmptyF a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Maybe b -> NonEmptyF a b) -> f (Maybe b) -> f (NonEmptyF a b))
-> (NonEmptyF a a -> Maybe b -> NonEmptyF a b)
-> NonEmptyF a a
-> f (Maybe b)
-> f (NonEmptyF a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> Maybe b -> NonEmptyF a b
forall a b. a -> Maybe b -> NonEmptyF a b
NonEmptyF (a -> Maybe b -> NonEmptyF a b)
-> (NonEmptyF a a -> a)
-> NonEmptyF a a
-> Maybe b
-> NonEmptyF a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyF a a -> a
forall a b. NonEmptyF a b -> a
head) (NonEmptyF a a -> f (Maybe b) -> f (NonEmptyF a b))
-> (NonEmptyF a a -> f (Maybe b))
-> NonEmptyF a a
-> f (NonEmptyF a b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((a -> f b) -> Maybe a -> f (Maybe b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
T.traverse a -> f b
f (Maybe a -> f (Maybe b))
-> (NonEmptyF a a -> Maybe a) -> NonEmptyF a a -> f (Maybe b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyF a a -> Maybe a
forall a b. NonEmptyF a b -> Maybe b
tail)
instance Bi.Bifunctor NonEmptyF where
bimap :: (a -> b) -> (c -> d) -> NonEmptyF a c -> NonEmptyF b d
bimap f :: a -> b
f g :: c -> d
g = b -> Maybe d -> NonEmptyF b d
forall a b. a -> Maybe b -> NonEmptyF a b
NonEmptyF (b -> Maybe d -> NonEmptyF b d)
-> (NonEmptyF a c -> b)
-> NonEmptyF a c
-> Maybe d
-> NonEmptyF b d
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> b
f (a -> b) -> (NonEmptyF a c -> a) -> NonEmptyF a c -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyF a c -> a
forall a b. NonEmptyF a b -> a
head) (NonEmptyF a c -> Maybe d -> NonEmptyF b d)
-> (NonEmptyF a c -> Maybe d) -> NonEmptyF a c -> NonEmptyF b d
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((c -> d) -> Maybe c -> Maybe d
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> d
g (Maybe c -> Maybe d)
-> (NonEmptyF a c -> Maybe c) -> NonEmptyF a c -> Maybe d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyF a c -> Maybe c
forall a b. NonEmptyF a b -> Maybe b
tail)
instance Bi.Bifoldable NonEmptyF where
bifoldMap :: (a -> m) -> (b -> m) -> NonEmptyF a b -> m
bifoldMap f :: a -> m
f g :: b -> m
g = m -> Maybe m -> m
forall a. Monoid a => a -> Maybe a -> a
merge (m -> Maybe m -> m)
-> (NonEmptyF a b -> m) -> NonEmptyF a b -> Maybe m -> m
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> m
f (a -> m) -> (NonEmptyF a b -> a) -> NonEmptyF a b -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyF a b -> a
forall a b. NonEmptyF a b -> a
head) (NonEmptyF a b -> Maybe m -> m)
-> (NonEmptyF a b -> Maybe m) -> NonEmptyF a b -> m
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((b -> m) -> Maybe b -> Maybe m
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> m
g (Maybe b -> Maybe m)
-> (NonEmptyF a b -> Maybe b) -> NonEmptyF a b -> Maybe m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyF a b -> Maybe b
forall a b. NonEmptyF a b -> Maybe b
tail)
where merge :: a -> Maybe a -> a
merge x :: a
x my :: Maybe a
my = a -> (a -> a) -> Maybe a -> a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe a
x (a -> a -> a
forall a. Monoid a => a -> a -> a
mappend a
x) Maybe a
my
instance Bi.Bitraversable NonEmptyF where
bitraverse :: (a -> f c) -> (b -> f d) -> NonEmptyF a b -> f (NonEmptyF c d)
bitraverse f :: a -> f c
f g :: b -> f d
g = (c -> Maybe d -> NonEmptyF c d)
-> f c -> f (Maybe d) -> f (NonEmptyF c d)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 c -> Maybe d -> NonEmptyF c d
forall a b. a -> Maybe b -> NonEmptyF a b
NonEmptyF (f c -> f (Maybe d) -> f (NonEmptyF c d))
-> (NonEmptyF a b -> f c)
-> NonEmptyF a b
-> f (Maybe d)
-> f (NonEmptyF c d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f c
f (a -> f c) -> (NonEmptyF a b -> a) -> NonEmptyF a b -> f c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyF a b -> a
forall a b. NonEmptyF a b -> a
head) (NonEmptyF a b -> f (Maybe d) -> f (NonEmptyF c d))
-> (NonEmptyF a b -> f (Maybe d))
-> NonEmptyF a b
-> f (NonEmptyF c d)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((b -> f d) -> Maybe b -> f (Maybe d)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
T.traverse b -> f d
g (Maybe b -> f (Maybe d))
-> (NonEmptyF a b -> Maybe b) -> NonEmptyF a b -> f (Maybe d)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyF a b -> Maybe b
forall a b. NonEmptyF a b -> Maybe b
tail)