{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE StrictData #-}

module Data.Tuple.Strict.T8
  ( T8 (..),
  )
where

import Control.DeepSeq (NFData, rnf)
import Data.Bifoldable
import Data.Bifunctor
import Data.Bitraversable
import Data.Functor.Classes (Eq1 (liftEq), Eq2 (liftEq2))
import Data.Hashable (Hashable, hash, hashWithSalt)
import Data.Hashable.Lifted
  ( Hashable1,
    Hashable2,
    defaultLiftHashWithSalt,
    hashWithSalt1,
    liftHashWithSalt,
    liftHashWithSalt2,
  )
import Data.Semigroup
import GHC.Generics (Generic)

data T8 a b c d e f g h
  = T8 a b c d e f g h
  deriving stock (T8 a b c d e f g h
forall a. a -> a -> Bounded a
forall a b c d e f g h.
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f,
 Bounded g, Bounded h) =>
T8 a b c d e f g h
maxBound :: T8 a b c d e f g h
$cmaxBound :: forall a b c d e f g h.
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f,
 Bounded g, Bounded h) =>
T8 a b c d e f g h
minBound :: T8 a b c d e f g h
$cminBound :: forall a b c d e f g h.
(Bounded a, Bounded b, Bounded c, Bounded d, Bounded e, Bounded f,
 Bounded g, Bounded h) =>
T8 a b c d e f g h
Bounded, T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b c d e f g h.
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
/= :: T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
$c/= :: forall a b c d e f g h.
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
== :: T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
$c== :: forall a b c d e f g h.
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
Eq, T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
T8 a b c d e f g h -> T8 a b c d e f g h -> Ordering
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} {c} {d} {e} {f} {g} {h}.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
Eq (T8 a b c d e f g h)
forall a b c d e f g h.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
forall a b c d e f g h.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> Ordering
forall a b c d e f g h.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> T8 a b c d e f g h
min :: T8 a b c d e f g h -> T8 a b c d e f g h -> T8 a b c d e f g h
$cmin :: forall a b c d e f g h.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> T8 a b c d e f g h
max :: T8 a b c d e f g h -> T8 a b c d e f g h -> T8 a b c d e f g h
$cmax :: forall a b c d e f g h.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> T8 a b c d e f g h
>= :: T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
$c>= :: forall a b c d e f g h.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
> :: T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
$c> :: forall a b c d e f g h.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
<= :: T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
$c<= :: forall a b c d e f g h.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
< :: T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
$c< :: forall a b c d e f g h.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> Bool
compare :: T8 a b c d e f g h -> T8 a b c d e f g h -> Ordering
$ccompare :: forall a b c d e f g h.
(Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g, Ord h) =>
T8 a b c d e f g h -> T8 a b c d e f g h -> Ordering
Ord, ReadPrec [T8 a b c d e f g h]
ReadPrec (T8 a b c d e f g h)
ReadS [T8 a b c d e f g h]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall a b c d e f g h.
(Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) =>
ReadPrec [T8 a b c d e f g h]
forall a b c d e f g h.
(Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) =>
ReadPrec (T8 a b c d e f g h)
forall a b c d e f g h.
(Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) =>
Int -> ReadS (T8 a b c d e f g h)
forall a b c d e f g h.
(Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) =>
ReadS [T8 a b c d e f g h]
readListPrec :: ReadPrec [T8 a b c d e f g h]
$creadListPrec :: forall a b c d e f g h.
(Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) =>
ReadPrec [T8 a b c d e f g h]
readPrec :: ReadPrec (T8 a b c d e f g h)
$creadPrec :: forall a b c d e f g h.
(Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) =>
ReadPrec (T8 a b c d e f g h)
readList :: ReadS [T8 a b c d e f g h]
$creadList :: forall a b c d e f g h.
(Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) =>
ReadS [T8 a b c d e f g h]
readsPrec :: Int -> ReadS (T8 a b c d e f g h)
$creadsPrec :: forall a b c d e f g h.
(Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) =>
Int -> ReadS (T8 a b c d e f g h)
Read, Int -> T8 a b c d e f g h -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall a b c d e f g h.
(Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) =>
Int -> T8 a b c d e f g h -> ShowS
forall a b c d e f g h.
(Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) =>
[T8 a b c d e f g h] -> ShowS
forall a b c d e f g h.
(Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) =>
T8 a b c d e f g h -> String
showList :: [T8 a b c d e f g h] -> ShowS
$cshowList :: forall a b c d e f g h.
(Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) =>
[T8 a b c d e f g h] -> ShowS
show :: T8 a b c d e f g h -> String
$cshow :: forall a b c d e f g h.
(Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) =>
T8 a b c d e f g h -> String
showsPrec :: Int -> T8 a b c d e f g h -> ShowS
$cshowsPrec :: forall a b c d e f g h.
(Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h) =>
Int -> T8 a b c d e f g h -> ShowS
Show, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a b c d e f g h x.
Rep (T8 a b c d e f g h) x -> T8 a b c d e f g h
forall a b c d e f g h x.
T8 a b c d e f g h -> Rep (T8 a b c d e f g h) x
$cto :: forall a b c d e f g h x.
Rep (T8 a b c d e f g h) x -> T8 a b c d e f g h
$cfrom :: forall a b c d e f g h x.
T8 a b c d e f g h -> Rep (T8 a b c d e f g h) x
Generic)

-- | @since 0.1.3
deriving stock instance Foldable (T8 a b c d e f g)

-- | @since 0.1.3
deriving stock instance Functor (T8 a b c d e f g)

-- | @since 0.1.3
deriving stock instance Traversable (T8 a b c d e f g)

-- | @since 0.1.5
instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g) => Eq1 (T8 a b c d e f g) where
  liftEq :: forall a b.
(a -> b -> Bool)
-> T8 a b c d e f g a -> T8 a b c d e f g b -> Bool
liftEq = forall (f :: * -> * -> *) a b c d.
Eq2 f =>
(a -> b -> Bool) -> (c -> d -> Bool) -> f a c -> f b d -> Bool
liftEq2 forall a. Eq a => a -> a -> Bool
(==)

-- | @since 0.1.5
instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f) => Eq2 (T8 a b c d e f) where
  liftEq2 :: forall a b c d.
(a -> b -> Bool)
-> (c -> d -> Bool)
-> T8 a b c d e f a c
-> T8 a b c d e f b d
-> Bool
liftEq2 a -> b -> Bool
e1 c -> d -> Bool
e2 (T8 a
a b
b c
c d
d e
e f
f a
g c
h) (T8 a
a' b
b' c
c' d
d' e
e' f
f' b
g' d
h') =
    a
a forall a. Eq a => a -> a -> Bool
== a
a' Bool -> Bool -> Bool
&& b
b forall a. Eq a => a -> a -> Bool
== b
b' Bool -> Bool -> Bool
&& c
c forall a. Eq a => a -> a -> Bool
== c
c' Bool -> Bool -> Bool
&& d
d forall a. Eq a => a -> a -> Bool
== d
d' Bool -> Bool -> Bool
&& e
e forall a. Eq a => a -> a -> Bool
== e
e' Bool -> Bool -> Bool
&& f
f forall a. Eq a => a -> a -> Bool
== f
f' Bool -> Bool -> Bool
&& a -> b -> Bool
e1 a
g b
g' Bool -> Bool -> Bool
&& c -> d -> Bool
e2 c
h d
h'

-- | @since 0.1.3
instance (Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f, Monoid g) => Applicative (T8 a b c d e f g) where
  pure :: forall a. a -> T8 a b c d e f g a
pure a
h = forall a b c d e f g h.
a -> b -> c -> d -> e -> f -> g -> h -> T8 a b c d e f g h
T8 forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty a
h
  T8 a
a b
b c
c d
d e
e f
f g
g a -> b
h <*> :: forall a b.
T8 a b c d e f g (a -> b)
-> T8 a b c d e f g a -> T8 a b c d e f g b
<*> T8 a
a' b
b' c
c' d
d' e
e' f
f' g
g' a
h' =
    forall a b c d e f g h.
a -> b -> c -> d -> e -> f -> g -> h -> T8 a b c d e f g h
T8 (a
a forall a. Semigroup a => a -> a -> a
<> a
a') (b
b forall a. Semigroup a => a -> a -> a
<> b
b') (c
c forall a. Semigroup a => a -> a -> a
<> c
c') (d
d forall a. Semigroup a => a -> a -> a
<> d
d') (e
e forall a. Semigroup a => a -> a -> a
<> e
e') (f
f forall a. Semigroup a => a -> a -> a
<> f
f') (g
g forall a. Semigroup a => a -> a -> a
<> g
g') (a -> b
h a
h')

-- | @since 0.1.3
instance (Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f, Monoid g) => Monad (T8 a b c d e f g) where
  return :: forall a. a -> T8 a b c d e f g a
return = forall (f :: * -> *) a. Applicative f => a -> f a
pure
  T8 a
a b
b c
c d
d e
e f
f g
g a
h >>= :: forall a b.
T8 a b c d e f g a
-> (a -> T8 a b c d e f g b) -> T8 a b c d e f g b
>>= a -> T8 a b c d e f g b
i = case a -> T8 a b c d e f g b
i a
h of
    T8 a
a' b
b' c
c' d
d' e
e' f
f' g
g' b
h' ->
      forall a b c d e f g h.
a -> b -> c -> d -> e -> f -> g -> h -> T8 a b c d e f g h
T8 (a
a forall a. Semigroup a => a -> a -> a
<> a
a') (b
b forall a. Semigroup a => a -> a -> a
<> b
b') (c
c forall a. Semigroup a => a -> a -> a
<> c
c') (d
d forall a. Semigroup a => a -> a -> a
<> d
d') (e
e forall a. Semigroup a => a -> a -> a
<> e
e') (f
f forall a. Semigroup a => a -> a -> a
<> f
f') (g
g forall a. Semigroup a => a -> a -> a
<> g
g') b
h'

instance (Hashable a, Hashable b, Hashable c, Hashable d, Hashable e, Hashable f, Hashable g, Hashable h) => Hashable (T8 a b c d e f g h) where
  hash :: T8 a b c d e f g h -> Int
hash (T8 a
a b
b c
c d
d e
e f
f g
g h
h) = forall a. Hashable a => a -> Int
hash a
a forall a. Hashable a => Int -> a -> Int
`hashWithSalt` b
b forall a. Hashable a => Int -> a -> Int
`hashWithSalt` c
c forall a. Hashable a => Int -> a -> Int
`hashWithSalt` d
d forall a. Hashable a => Int -> a -> Int
`hashWithSalt` e
e forall a. Hashable a => Int -> a -> Int
`hashWithSalt` f
f forall a. Hashable a => Int -> a -> Int
`hashWithSalt` g
g forall a. Hashable a => Int -> a -> Int
`hashWithSalt` h
h
  hashWithSalt :: Int -> T8 a b c d e f g h -> Int
hashWithSalt = forall (f :: * -> *) a.
(Hashable1 f, Hashable a) =>
Int -> f a -> Int
hashWithSalt1

instance (Hashable a, Hashable b, Hashable c, Hashable d, Hashable e, Hashable f, Hashable g) => Hashable1 (T8 a b c d e f g) where
  liftHashWithSalt :: forall a. (Int -> a -> Int) -> Int -> T8 a b c d e f g a -> Int
liftHashWithSalt = forall (f :: * -> * -> *) a b.
(Hashable2 f, Hashable a) =>
(Int -> b -> Int) -> Int -> f a b -> Int
defaultLiftHashWithSalt

instance (Hashable a, Hashable b, Hashable c, Hashable d, Hashable e, Hashable f) => Hashable2 (T8 a b c d e f) where
  liftHashWithSalt2 :: forall a b.
(Int -> a -> Int)
-> (Int -> b -> Int) -> Int -> T8 a b c d e f a b -> Int
liftHashWithSalt2 Int -> a -> Int
h1 Int -> b -> Int
h2 Int
slt (T8 a
a b
b c
c d
d e
e f
f a
g b
h) =
    (Int
slt forall a. Hashable a => Int -> a -> Int
`hashWithSalt` a
a forall a. Hashable a => Int -> a -> Int
`hashWithSalt` b
b forall a. Hashable a => Int -> a -> Int
`hashWithSalt` c
c forall a. Hashable a => Int -> a -> Int
`hashWithSalt` d
d forall a. Hashable a => Int -> a -> Int
`hashWithSalt` e
e forall a. Hashable a => Int -> a -> Int
`hashWithSalt` f
f) Int -> a -> Int
`h1` a
g Int -> b -> Int
`h2` b
h

instance (Monoid a, Monoid b, Monoid c, Monoid d, Monoid e, Monoid f, Monoid g, Monoid h) => Monoid (T8 a b c d e f g h) where
  mempty :: T8 a b c d e f g h
mempty = forall a b c d e f g h.
a -> b -> c -> d -> e -> f -> g -> h -> T8 a b c d e f g h
T8 forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty

-- | @since 0.1.4
instance (NFData a, NFData b, NFData c, NFData d, NFData e, NFData f, NFData g, NFData h) => NFData (T8 a b c d e f g h) where
  rnf :: T8 a b c d e f g h -> ()
rnf (T8 a
a b
b c
c d
d e
e f
f g
g h
h) = forall a. NFData a => a -> ()
rnf a
a seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf b
b seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf c
c seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf d
d seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf e
e seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf f
f seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf g
g seq :: forall a b. a -> b -> b
`seq` forall a. NFData a => a -> ()
rnf h
h

instance (Semigroup a, Semigroup b, Semigroup c, Semigroup d, Semigroup e, Semigroup f, Semigroup g, Semigroup h) => Semigroup (T8 a b c d e f g h) where
  T8 a
a1 b
b1 c
c1 d
d1 e
e1 f
f1 g
g1 h
h1 <> :: T8 a b c d e f g h -> T8 a b c d e f g h -> T8 a b c d e f g h
<> T8 a
a2 b
b2 c
c2 d
d2 e
e2 f
f2 g
g2 h
h2 = forall a b c d e f g h.
a -> b -> c -> d -> e -> f -> g -> h -> T8 a b c d e f g h
T8 (a
a1 forall a. Semigroup a => a -> a -> a
<> a
a2) (b
b1 forall a. Semigroup a => a -> a -> a
<> b
b2) (c
c1 forall a. Semigroup a => a -> a -> a
<> c
c2) (d
d1 forall a. Semigroup a => a -> a -> a
<> d
d2) (e
e1 forall a. Semigroup a => a -> a -> a
<> e
e2) (f
f1 forall a. Semigroup a => a -> a -> a
<> f
f2) (g
g1 forall a. Semigroup a => a -> a -> a
<> g
g2) (h
h1 forall a. Semigroup a => a -> a -> a
<> h
h2)
  stimes :: forall b.
Integral b =>
b -> T8 a b c d e f g h -> T8 a b c d e f g h
stimes b
ii (T8 a
a b
b c
c d
d e
e f
f g
g h
h) = forall a b c d e f g h.
a -> b -> c -> d -> e -> f -> g -> h -> T8 a b c d e f g h
T8 (forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
ii a
a) (forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
ii b
b) (forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
ii c
c) (forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
ii d
d) (forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
ii e
e) (forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
ii f
f) (forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
ii g
g) (forall a b. (Semigroup a, Integral b) => b -> a -> a
stimes b
ii h
h)

-- | @since 0.1.3
instance Bifunctor (T8 x y z w t u) where
  bimap :: forall a b c d.
(a -> b) -> (c -> d) -> T8 x y z w t u a c -> T8 x y z w t u b d
bimap a -> b
f c -> d
g (T8 x
x y
y z
z w
w t
t u
u a
a c
b) = forall a b c d e f g h.
a -> b -> c -> d -> e -> f -> g -> h -> T8 a b c d e f g h
T8 x
x y
y z
z w
w t
t u
u (a -> b
f a
a) (c -> d
g c
b)

-- | @since 0.1.3
instance Bifoldable (T8 x y z w t u) where
  bifoldMap :: forall m a b.
Monoid m =>
(a -> m) -> (b -> m) -> T8 x y z w t u a b -> m
bifoldMap a -> m
f b -> m
g (T8 x
_ y
_ z
_ w
_ t
_ u
_ a
a b
b) = a -> m
f a
a forall a. Semigroup a => a -> a -> a
<> b -> m
g b
b

-- | @since 0.1.3
instance Bitraversable (T8 x y z w t u) where
  bitraverse :: forall (f :: * -> *) a c b d.
Applicative f =>
(a -> f c)
-> (b -> f d) -> T8 x y z w t u a b -> f (T8 x y z w t u c d)
bitraverse a -> f c
f b -> f d
g (T8 x
x y
y z
z w
w t
t u
u a
a b
b) = forall a b c d e f g h.
a -> b -> c -> d -> e -> f -> g -> h -> T8 a b c d e f g h
T8 x
x y
y z
z w
w t
t u
u forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f c
f a
a forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> f d
g b
b