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

module Exinst.Internal.Sum
 ( S1(S1L,S1R)
 , S2(S2L,S2R)
 , S3(S3L,S3R)
 , S4(S4L,S4R)
 ) where

import GHC.Generics (Generic)

--------------------------------------------------------------------------------
-- Sums

-- | Like 'Data.Functor.Sum.Sum' from "Data.Functor.Sum", 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' ('S1' l r)@, so as to ensure that @l@ and @r@ are indexed
-- by the same type. Moreover, 'S1' 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 S1 l r (a1 :: k1)
  = S1L (l a1) | S1R (r a1)
  deriving (S1 l r a1 -> S1 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)) =>
S1 l r a1 -> S1 l r a1 -> Bool
/= :: S1 l r a1 -> S1 l r a1 -> Bool
$c/= :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Eq (l a1), Eq (r a1)) =>
S1 l r a1 -> S1 l r a1 -> Bool
== :: S1 l r a1 -> S1 l r a1 -> Bool
$c== :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Eq (l a1), Eq (r a1)) =>
S1 l r a1 -> S1 l r a1 -> Bool
Eq, Int -> S1 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 -> S1 l r a1 -> ShowS
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
[S1 l r a1] -> ShowS
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
S1 l r a1 -> String
showList :: [S1 l r a1] -> ShowS
$cshowList :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
[S1 l r a1] -> ShowS
show :: S1 l r a1 -> String
$cshow :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
S1 l r a1 -> String
showsPrec :: Int -> S1 l r a1 -> ShowS
$cshowsPrec :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Show (l a1), Show (r a1)) =>
Int -> S1 l r a1 -> ShowS
Show, ReadPrec [S1 l r a1]
ReadPrec (S1 l r a1)
ReadS [S1 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 [S1 l r a1]
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadPrec (S1 l r a1)
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
Int -> ReadS (S1 l r a1)
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadS [S1 l r a1]
readListPrec :: ReadPrec [S1 l r a1]
$creadListPrec :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadPrec [S1 l r a1]
readPrec :: ReadPrec (S1 l r a1)
$creadPrec :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadPrec (S1 l r a1)
readList :: ReadS [S1 l r a1]
$creadList :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
ReadS [S1 l r a1]
readsPrec :: Int -> ReadS (S1 l r a1)
$creadsPrec :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Read (l a1), Read (r a1)) =>
Int -> ReadS (S1 l r a1)
Read, S1 l r a1 -> S1 l r a1 -> Bool
S1 l r a1 -> S1 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 (S1 l r a1)
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
S1 l r a1 -> S1 l r a1 -> Bool
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
S1 l r a1 -> S1 l r a1 -> Ordering
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
S1 l r a1 -> S1 l r a1 -> S1 l r a1
min :: S1 l r a1 -> S1 l r a1 -> S1 l r a1
$cmin :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
S1 l r a1 -> S1 l r a1 -> S1 l r a1
max :: S1 l r a1 -> S1 l r a1 -> S1 l r a1
$cmax :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
S1 l r a1 -> S1 l r a1 -> S1 l r a1
>= :: S1 l r a1 -> S1 l r a1 -> Bool
$c>= :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
S1 l r a1 -> S1 l r a1 -> Bool
> :: S1 l r a1 -> S1 l r a1 -> Bool
$c> :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
S1 l r a1 -> S1 l r a1 -> Bool
<= :: S1 l r a1 -> S1 l r a1 -> Bool
$c<= :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
S1 l r a1 -> S1 l r a1 -> Bool
< :: S1 l r a1 -> S1 l r a1 -> Bool
$c< :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
S1 l r a1 -> S1 l r a1 -> Bool
compare :: S1 l r a1 -> S1 l r a1 -> Ordering
$ccompare :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1).
(Ord (l a1), Ord (r a1)) =>
S1 l r a1 -> S1 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 (S1 l r a1) x -> S1 l r a1
forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1) x.
S1 l r a1 -> Rep (S1 l r a1) x
$cto :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1) x.
Rep (S1 l r a1) x -> S1 l r a1
$cfrom :: forall k1 (l :: k1 -> *) (r :: k1 -> *) (a1 :: k1) x.
S1 l r a1 -> Rep (S1 l r a1) x
Generic)

-- | Like 'S1', but for @l@ and @r@ taking two type indexes.
data S2 l r (a2 :: k2) (a1 :: k1)
  = S2L (l a2 a1) | S2R (r a2 a1)
  deriving (S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 l r a2 a1 -> Bool
/= :: S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 l r a2 a1 -> Bool
== :: S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 l r a2 a1 -> Bool
Eq, Int -> S2 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 -> S2 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)) =>
[S2 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)) =>
S2 l r a2 a1 -> String
showList :: [S2 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)) =>
[S2 l r a2 a1] -> ShowS
show :: S2 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)) =>
S2 l r a2 a1 -> String
showsPrec :: Int -> S2 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 -> S2 l r a2 a1 -> ShowS
Show, ReadPrec [S2 l r a2 a1]
ReadPrec (S2 l r a2 a1)
ReadS [S2 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 [S2 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 (S2 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 (S2 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 [S2 l r a2 a1]
readListPrec :: ReadPrec [S2 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 [S2 l r a2 a1]
readPrec :: ReadPrec (S2 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 (S2 l r a2 a1)
readList :: ReadS [S2 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 [S2 l r a2 a1]
readsPrec :: Int -> ReadS (S2 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 (S2 l r a2 a1)
Read, S2 l r a2 a1 -> S2 l r a2 a1 -> Bool
S2 l r a2 a1 -> S2 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 (S2 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)) =>
S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 l r a2 a1 -> S2 l r a2 a1
min :: S2 l r a2 a1 -> S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 l r a2 a1 -> S2 l r a2 a1
max :: S2 l r a2 a1 -> S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 l r a2 a1 -> S2 l r a2 a1
>= :: S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 l r a2 a1 -> Bool
> :: S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 l r a2 a1 -> Bool
<= :: S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 l r a2 a1 -> Bool
< :: S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 l r a2 a1 -> Bool
compare :: S2 l r a2 a1 -> S2 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)) =>
S2 l r a2 a1 -> S2 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 (S2 l r a2 a1) x -> S2 l r a2 a1
forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1) x.
S2 l r a2 a1 -> Rep (S2 l r a2 a1) x
$cto :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1) x.
Rep (S2 l r a2 a1) x -> S2 l r a2 a1
$cfrom :: forall k2 k1 (l :: k2 -> k1 -> *) (r :: k2 -> k1 -> *) (a2 :: k2)
       (a1 :: k1) x.
S2 l r a2 a1 -> Rep (S2 l r a2 a1) x
Generic)

-- | Like 'S1', but for @l@ and @r@ taking three type indexes.
data S3 l r (a3 :: k3) (a2 :: k2) (a1 :: k1)
  = S3L (l a3 a2 a1) | S3R (r a3 a2 a1)
  deriving (S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> Bool
/= :: S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> Bool
== :: S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> Bool
Eq, Int -> S3 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 -> S3 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)) =>
[S3 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)) =>
S3 l r a3 a2 a1 -> String
showList :: [S3 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)) =>
[S3 l r a3 a2 a1] -> ShowS
show :: S3 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)) =>
S3 l r a3 a2 a1 -> String
showsPrec :: Int -> S3 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 -> S3 l r a3 a2 a1 -> ShowS
Show, ReadPrec [S3 l r a3 a2 a1]
ReadPrec (S3 l r a3 a2 a1)
ReadS [S3 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 [S3 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 (S3 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 (S3 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 [S3 l r a3 a2 a1]
readListPrec :: ReadPrec [S3 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 [S3 l r a3 a2 a1]
readPrec :: ReadPrec (S3 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 (S3 l r a3 a2 a1)
readList :: ReadS [S3 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 [S3 l r a3 a2 a1]
readsPrec :: Int -> ReadS (S3 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 (S3 l r a3 a2 a1)
Read, S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> Bool
S3 l r a3 a2 a1 -> S3 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 (S3 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)) =>
S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> S3 l r a3 a2 a1
min :: S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> S3 l r a3 a2 a1
max :: S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> S3 l r a3 a2 a1
>= :: S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> Bool
> :: S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> Bool
<= :: S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> Bool
< :: S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 l r a3 a2 a1 -> Bool
compare :: S3 l r a3 a2 a1 -> S3 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)) =>
S3 l r a3 a2 a1 -> S3 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 (S3 l r a3 a2 a1) x -> S3 l r a3 a2 a1
forall k3 k2 k1 (l :: k3 -> k2 -> k1 -> *)
       (r :: k3 -> k2 -> k1 -> *) (a3 :: k3) (a2 :: k2) (a1 :: k1) x.
S3 l r a3 a2 a1 -> Rep (S3 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 (S3 l r a3 a2 a1) x -> S3 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.
S3 l r a3 a2 a1 -> Rep (S3 l r a3 a2 a1) x
Generic)

-- | Like 'S1', but for @l@ and @r@ taking four type indexes.
data S4 l r (a4 :: k4) (a3 :: k3) (a2 :: k2) (a1 :: k1)
  = S4L (l a4 a3 a2 a1) | S4R (r a4 a3 a2 a1)
  deriving (S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> Bool
/= :: S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> Bool
== :: S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> Bool
Eq, Int -> S4 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 -> S4 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)) =>
[S4 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)) =>
S4 l r a4 a3 a2 a1 -> String
showList :: [S4 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)) =>
[S4 l r a4 a3 a2 a1] -> ShowS
show :: S4 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)) =>
S4 l r a4 a3 a2 a1 -> String
showsPrec :: Int -> S4 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 -> S4 l r a4 a3 a2 a1 -> ShowS
Show, ReadPrec [S4 l r a4 a3 a2 a1]
ReadPrec (S4 l r a4 a3 a2 a1)
ReadS [S4 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 [S4 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 (S4 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 (S4 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 [S4 l r a4 a3 a2 a1]
readListPrec :: ReadPrec [S4 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 [S4 l r a4 a3 a2 a1]
readPrec :: ReadPrec (S4 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 (S4 l r a4 a3 a2 a1)
readList :: ReadS [S4 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 [S4 l r a4 a3 a2 a1]
readsPrec :: Int -> ReadS (S4 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 (S4 l r a4 a3 a2 a1)
Read, S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> Bool
S4 l r a4 a3 a2 a1 -> S4 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 (S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1
min :: S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1
max :: S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1
>= :: S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> Bool
> :: S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> Bool
<= :: S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> Bool
< :: S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 l r a4 a3 a2 a1 -> Bool
compare :: S4 l r a4 a3 a2 a1 -> S4 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)) =>
S4 l r a4 a3 a2 a1 -> S4 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 (S4 l r a4 a3 a2 a1) x -> S4 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.
S4 l r a4 a3 a2 a1 -> Rep (S4 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 (S4 l r a4 a3 a2 a1) x -> S4 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.
S4 l r a4 a3 a2 a1 -> Rep (S4 l r a4 a3 a2 a1) x
Generic)