{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE PolyKinds #-}

module Exinst.Internal.Product
 ( P1(P1)
 , P2(P2)
 , P3(P3)
 , P4(P4)
 ) where

import GHC.Generics (Generic)

--------------------------------------------------------------------------------
-- Products

-- | Like 'Data.Functor.Product.Product' from "Data.Functor.Product", but
-- only intended to be used with kinds other than 'Type'.
--
-- This type is particularly useful when used in combination with 'Exinst.Some1'
-- as @'Exinst.Some1' ('P1' l r)@, so as to ensure that @l@ and @r@ are indexed
-- by the same type. Moreover, 'P1' already supports many common instances from
-- @base@, @hashable@, @deepseq@, @aeson@, @bytes@, @cereal@, @binary@, and
-- @quickcheck@ out of the box, so you can benefit from them as well.
data P1 l r (a1 :: k1)
  = P1 (l a1) (r a1)
  deriving (P1 l r a1 -> P1 l r a1 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Eq (l a1), Eq (r a1)) =>
P1 l r a1 -> P1 l r a1 -> Bool
/= :: P1 l r a1 -> P1 l r a1 -> Bool
$c/= :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Eq (l a1), Eq (r a1)) =>
P1 l r a1 -> P1 l r a1 -> Bool
== :: P1 l r a1 -> P1 l r a1 -> Bool
$c== :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Eq (l a1), Eq (r a1)) =>
P1 l r a1 -> P1 l r a1 -> Bool
Eq, Int -> P1 l r a1 -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
Int -> P1 l r a1 -> ShowS
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
[P1 l r a1] -> ShowS
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
P1 l r a1 -> String
showList :: [P1 l r a1] -> ShowS
$cshowList :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
[P1 l r a1] -> ShowS
show :: P1 l r a1 -> String
$cshow :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
P1 l r a1 -> String
showsPrec :: Int -> P1 l r a1 -> ShowS
$cshowsPrec :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
Int -> P1 l r a1 -> ShowS
Show, ReadPrec [P1 l r a1]
ReadPrec (P1 l r a1)
ReadS [P1 l r a1]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadPrec [P1 l r a1]
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadPrec (P1 l r a1)
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
Int -> ReadS (P1 l r a1)
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadS [P1 l r a1]
readListPrec :: ReadPrec [P1 l r a1]
$creadListPrec :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadPrec [P1 l r a1]
readPrec :: ReadPrec (P1 l r a1)
$creadPrec :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadPrec (P1 l r a1)
readList :: ReadS [P1 l r a1]
$creadList :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadS [P1 l r a1]
readsPrec :: Int -> ReadS (P1 l r a1)
$creadsPrec :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
Int -> ReadS (P1 l r a1)
Read, P1 l r a1 -> P1 l r a1 -> Bool
P1 l r a1 -> P1 l r a1 -> 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 {k1} {l :: k1 -> *} {r :: k1 -> *} {a1 :: k1}.
(Ord (l a1), Ord (r a1)) =>
Eq (P1 l r a1)
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
P1 l r a1 -> P1 l r a1 -> Bool
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
P1 l r a1 -> P1 l r a1 -> Ordering
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
P1 l r a1 -> P1 l r a1 -> P1 l r a1
min :: P1 l r a1 -> P1 l r a1 -> P1 l r a1
$cmin :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
P1 l r a1 -> P1 l r a1 -> P1 l r a1
max :: P1 l r a1 -> P1 l r a1 -> P1 l r a1
$cmax :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
P1 l r a1 -> P1 l r a1 -> P1 l r a1
>= :: P1 l r a1 -> P1 l r a1 -> Bool
$c>= :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
P1 l r a1 -> P1 l r a1 -> Bool
> :: P1 l r a1 -> P1 l r a1 -> Bool
$c> :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
P1 l r a1 -> P1 l r a1 -> Bool
<= :: P1 l r a1 -> P1 l r a1 -> Bool
$c<= :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
P1 l r a1 -> P1 l r a1 -> Bool
< :: P1 l r a1 -> P1 l r a1 -> Bool
$c< :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
P1 l r a1 -> P1 l r a1 -> Bool
compare :: P1 l r a1 -> P1 l r a1 -> Ordering
$ccompare :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
P1 l r a1 -> P1 l r a1 -> Ordering
Ord, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1) x.
Rep (P1 l r a1) x -> P1 l r a1
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1) x.
P1 l r a1 -> Rep (P1 l r a1) x
$cto :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1) x.
Rep (P1 l r a1) x -> P1 l r a1
$cfrom :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1) x.
P1 l r a1 -> Rep (P1 l r a1) x
Generic)

-- | Like 'P1', but for @l@ and @r@ taking two type indexes.
data P2 l r (a2 :: k2) (a1 :: k1)
  = P2 (l a2 a1) (r a2 a1)
  deriving (P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Eq (l a2 a1), Eq (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
/= :: P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
$c/= :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Eq (l a2 a1), Eq (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
== :: P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
$c== :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Eq (l a2 a1), Eq (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
Eq, Int -> P2 l r a2 a1 -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Show (l a2 a1), Show (r a2 a1)) =>
Int -> P2 l r a2 a1 -> ShowS
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Show (l a2 a1), Show (r a2 a1)) =>
[P2 l r a2 a1] -> ShowS
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Show (l a2 a1), Show (r a2 a1)) =>
P2 l r a2 a1 -> String
showList :: [P2 l r a2 a1] -> ShowS
$cshowList :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Show (l a2 a1), Show (r a2 a1)) =>
[P2 l r a2 a1] -> ShowS
show :: P2 l r a2 a1 -> String
$cshow :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Show (l a2 a1), Show (r a2 a1)) =>
P2 l r a2 a1 -> String
showsPrec :: Int -> P2 l r a2 a1 -> ShowS
$cshowsPrec :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Show (l a2 a1), Show (r a2 a1)) =>
Int -> P2 l r a2 a1 -> ShowS
Show, ReadPrec [P2 l r a2 a1]
ReadPrec (P2 l r a2 a1)
ReadS [P2 l r a2 a1]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Read (l a2 a1), Read (r a2 a1)) =>
ReadPrec [P2 l r a2 a1]
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Read (l a2 a1), Read (r a2 a1)) =>
ReadPrec (P2 l r a2 a1)
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Read (l a2 a1), Read (r a2 a1)) =>
Int -> ReadS (P2 l r a2 a1)
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Read (l a2 a1), Read (r a2 a1)) =>
ReadS [P2 l r a2 a1]
readListPrec :: ReadPrec [P2 l r a2 a1]
$creadListPrec :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Read (l a2 a1), Read (r a2 a1)) =>
ReadPrec [P2 l r a2 a1]
readPrec :: ReadPrec (P2 l r a2 a1)
$creadPrec :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Read (l a2 a1), Read (r a2 a1)) =>
ReadPrec (P2 l r a2 a1)
readList :: ReadS [P2 l r a2 a1]
$creadList :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Read (l a2 a1), Read (r a2 a1)) =>
ReadS [P2 l r a2 a1]
readsPrec :: Int -> ReadS (P2 l r a2 a1)
$creadsPrec :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Read (l a2 a1), Read (r a2 a1)) =>
Int -> ReadS (P2 l r a2 a1)
Read, P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
P2 l r a2 a1 -> P2 l r a2 a1 -> 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 {k2} {k1} {l :: k2 -> k1 -> *} {r :: k2 -> k1 -> *}
       {a2 :: k2} {a1 :: k1}.
(Ord (l a2 a1), Ord (r a2 a1)) =>
Eq (P2 l r a2 a1)
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Ord (l a2 a1), Ord (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Ord (l a2 a1), Ord (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> Ordering
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Ord (l a2 a1), Ord (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> P2 l r a2 a1
min :: P2 l r a2 a1 -> P2 l r a2 a1 -> P2 l r a2 a1
$cmin :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Ord (l a2 a1), Ord (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> P2 l r a2 a1
max :: P2 l r a2 a1 -> P2 l r a2 a1 -> P2 l r a2 a1
$cmax :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Ord (l a2 a1), Ord (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> P2 l r a2 a1
>= :: P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
$c>= :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Ord (l a2 a1), Ord (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
> :: P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
$c> :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Ord (l a2 a1), Ord (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
<= :: P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
$c<= :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Ord (l a2 a1), Ord (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
< :: P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
$c< :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Ord (l a2 a1), Ord (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> Bool
compare :: P2 l r a2 a1 -> P2 l r a2 a1 -> Ordering
$ccompare :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1).
(Ord (l a2 a1), Ord (r a2 a1)) =>
P2 l r a2 a1 -> P2 l r a2 a1 -> Ordering
Ord, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1) x.
Rep (P2 l r a2 a1) x -> P2 l r a2 a1
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1) x.
P2 l r a2 a1 -> Rep (P2 l r a2 a1) x
$cto :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1) x.
Rep (P2 l r a2 a1) x -> P2 l r a2 a1
$cfrom :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1) x.
P2 l r a2 a1 -> Rep (P2 l r a2 a1) x
Generic)

-- | Like 'P1', but for @l@ and @r@ taking three type indexes.
data P3 l r (a3 :: k3) (a2 :: k2) (a1 :: k1)
  = P3 (l a3 a2 a1) (r a3 a2 a1)
  deriving (P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Eq (l a3 a2 a1), Eq (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
/= :: P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
$c/= :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Eq (l a3 a2 a1), Eq (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
== :: P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
$c== :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Eq (l a3 a2 a1), Eq (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
Eq, Int -> P3 l r a3 a2 a1 -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Show (l a3 a2 a1), Show (r a3 a2 a1)) =>
Int -> P3 l r a3 a2 a1 -> ShowS
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Show (l a3 a2 a1), Show (r a3 a2 a1)) =>
[P3 l r a3 a2 a1] -> ShowS
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Show (l a3 a2 a1), Show (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> String
showList :: [P3 l r a3 a2 a1] -> ShowS
$cshowList :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Show (l a3 a2 a1), Show (r a3 a2 a1)) =>
[P3 l r a3 a2 a1] -> ShowS
show :: P3 l r a3 a2 a1 -> String
$cshow :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Show (l a3 a2 a1), Show (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> String
showsPrec :: Int -> P3 l r a3 a2 a1 -> ShowS
$cshowsPrec :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Show (l a3 a2 a1), Show (r a3 a2 a1)) =>
Int -> P3 l r a3 a2 a1 -> ShowS
Show, ReadPrec [P3 l r a3 a2 a1]
ReadPrec (P3 l r a3 a2 a1)
ReadS [P3 l r a3 a2 a1]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Read (l a3 a2 a1), Read (r a3 a2 a1)) =>
ReadPrec [P3 l r a3 a2 a1]
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Read (l a3 a2 a1), Read (r a3 a2 a1)) =>
ReadPrec (P3 l r a3 a2 a1)
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Read (l a3 a2 a1), Read (r a3 a2 a1)) =>
Int -> ReadS (P3 l r a3 a2 a1)
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Read (l a3 a2 a1), Read (r a3 a2 a1)) =>
ReadS [P3 l r a3 a2 a1]
readListPrec :: ReadPrec [P3 l r a3 a2 a1]
$creadListPrec :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Read (l a3 a2 a1), Read (r a3 a2 a1)) =>
ReadPrec [P3 l r a3 a2 a1]
readPrec :: ReadPrec (P3 l r a3 a2 a1)
$creadPrec :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Read (l a3 a2 a1), Read (r a3 a2 a1)) =>
ReadPrec (P3 l r a3 a2 a1)
readList :: ReadS [P3 l r a3 a2 a1]
$creadList :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Read (l a3 a2 a1), Read (r a3 a2 a1)) =>
ReadS [P3 l r a3 a2 a1]
readsPrec :: Int -> ReadS (P3 l r a3 a2 a1)
$creadsPrec :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Read (l a3 a2 a1), Read (r a3 a2 a1)) =>
Int -> ReadS (P3 l r a3 a2 a1)
Read, P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> 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 {k3} {k2} {k1} {l :: k3 -> k2 -> k1 -> *}
       {r :: k3 -> k2 -> k1 -> *} {a3 :: k3} {a2 :: k2} {a1 :: k1}.
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
Eq (P3 l r a3 a2 a1)
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Ordering
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> P3 l r a3 a2 a1
min :: P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> P3 l r a3 a2 a1
$cmin :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> P3 l r a3 a2 a1
max :: P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> P3 l r a3 a2 a1
$cmax :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> P3 l r a3 a2 a1
>= :: P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
$c>= :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
> :: P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
$c> :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
<= :: P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
$c<= :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
< :: P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
$c< :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Bool
compare :: P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Ordering
$ccompare :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1).
(Ord (l a3 a2 a1), Ord (r a3 a2 a1)) =>
P3 l r a3 a2 a1 -> P3 l r a3 a2 a1 -> Ordering
Ord, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1) x.
Rep (P3 l r a3 a2 a1) x -> P3 l r a3 a2 a1
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1) x.
P3 l r a3 a2 a1 -> Rep (P3 l r a3 a2 a1) x
$cto :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1) x.
Rep (P3 l r a3 a2 a1) x -> P3 l r a3 a2 a1
$cfrom :: forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1) x.
P3 l r a3 a2 a1 -> Rep (P3 l r a3 a2 a1) x
Generic)

-- | Like 'P1', but for @l@ and @r@ taking four type indexes.
data P4 l r (a4 :: k4) (a3 :: k3) (a2 :: k2) (a1 :: k1)
  = P4 (l a4 a3 a2 a1) (r a4 a3 a2 a1)
  deriving (P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Eq (l a4 a3 a2 a1), Eq (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
/= :: P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
$c/= :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Eq (l a4 a3 a2 a1), Eq (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
== :: P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
$c== :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Eq (l a4 a3 a2 a1), Eq (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
Eq, Int -> P4 l r a4 a3 a2 a1 -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Show (l a4 a3 a2 a1), Show (r a4 a3 a2 a1)) =>
Int -> P4 l r a4 a3 a2 a1 -> ShowS
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Show (l a4 a3 a2 a1), Show (r a4 a3 a2 a1)) =>
[P4 l r a4 a3 a2 a1] -> ShowS
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Show (l a4 a3 a2 a1), Show (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> String
showList :: [P4 l r a4 a3 a2 a1] -> ShowS
$cshowList :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Show (l a4 a3 a2 a1), Show (r a4 a3 a2 a1)) =>
[P4 l r a4 a3 a2 a1] -> ShowS
show :: P4 l r a4 a3 a2 a1 -> String
$cshow :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Show (l a4 a3 a2 a1), Show (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> String
showsPrec :: Int -> P4 l r a4 a3 a2 a1 -> ShowS
$cshowsPrec :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Show (l a4 a3 a2 a1), Show (r a4 a3 a2 a1)) =>
Int -> P4 l r a4 a3 a2 a1 -> ShowS
Show, ReadPrec [P4 l r a4 a3 a2 a1]
ReadPrec (P4 l r a4 a3 a2 a1)
ReadS [P4 l r a4 a3 a2 a1]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Read (l a4 a3 a2 a1), Read (r a4 a3 a2 a1)) =>
ReadPrec [P4 l r a4 a3 a2 a1]
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Read (l a4 a3 a2 a1), Read (r a4 a3 a2 a1)) =>
ReadPrec (P4 l r a4 a3 a2 a1)
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Read (l a4 a3 a2 a1), Read (r a4 a3 a2 a1)) =>
Int -> ReadS (P4 l r a4 a3 a2 a1)
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Read (l a4 a3 a2 a1), Read (r a4 a3 a2 a1)) =>
ReadS [P4 l r a4 a3 a2 a1]
readListPrec :: ReadPrec [P4 l r a4 a3 a2 a1]
$creadListPrec :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Read (l a4 a3 a2 a1), Read (r a4 a3 a2 a1)) =>
ReadPrec [P4 l r a4 a3 a2 a1]
readPrec :: ReadPrec (P4 l r a4 a3 a2 a1)
$creadPrec :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Read (l a4 a3 a2 a1), Read (r a4 a3 a2 a1)) =>
ReadPrec (P4 l r a4 a3 a2 a1)
readList :: ReadS [P4 l r a4 a3 a2 a1]
$creadList :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Read (l a4 a3 a2 a1), Read (r a4 a3 a2 a1)) =>
ReadS [P4 l r a4 a3 a2 a1]
readsPrec :: Int -> ReadS (P4 l r a4 a3 a2 a1)
$creadsPrec :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Read (l a4 a3 a2 a1), Read (r a4 a3 a2 a1)) =>
Int -> ReadS (P4 l r a4 a3 a2 a1)
Read, P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> 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 {k4} {k3} {k2} {k1} {l :: k4 -> k3 -> k2 -> k1 -> *}
       {r :: k4 -> k3 -> k2 -> k1 -> *} {a4 :: k4} {a3 :: k3} {a2 :: k2}
       {a1 :: k1}.
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
Eq (P4 l r a4 a3 a2 a1)
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Ordering
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1
min :: P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1
$cmin :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1
max :: P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1
$cmax :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1
>= :: P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
$c>= :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
> :: P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
$c> :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
<= :: P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
$c<= :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
< :: P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
$c< :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Bool
compare :: P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Ordering
$ccompare :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1).
(Ord (l a4 a3 a2 a1), Ord (r a4 a3 a2 a1)) =>
P4 l r a4 a3 a2 a1 -> P4 l r a4 a3 a2 a1 -> Ordering
Ord, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1) x.
Rep (P4 l r a4 a3 a2 a1) x -> P4 l r a4 a3 a2 a1
forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1) x.
P4 l r a4 a3 a2 a1 -> Rep (P4 l r a4 a3 a2 a1) x
$cto :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1) x.
Rep (P4 l r a4 a3 a2 a1) x -> P4 l r a4 a3 a2 a1
$cfrom :: forall k4 k3 k2 k1 (l :: k4 -> k3 -> k2 -> k1 -> *)
       (r :: k4 -> k3 -> k2 -> k1 -> *) (a4 :: k4) (a3 :: k3) (a2 :: k2)
       (a1 :: k1) x.
P4 l r a4 a3 a2 a1 -> Rep (P4 l r a4 a3 a2 a1) x
Generic)