module CompoundTypes.Private.Lazy.Product where


data Product2 v1 v2 =
  Product2 v1 v2

data Product3 v1 v2 v3 =
  Product3 v1 v2 v3

data Product4 v1 v2 v3 v4 =
  Product4 v1 v2 v3 v4

data Product5 v1 v2 v3 v4 v5 =
  Product5 v1 v2 v3 v4 v5

data Product6 v1 v2 v3 v4 v5 v6 =
  Product6 v1 v2 v3 v4 v5 v6

data Product7 v1 v2 v3 v4 v5 v6 v7 =
  Product7 v1 v2 v3 v4 v5 v6 v7


-- |
-- Automatically derives the product-type of the according arity
-- from expressions such as:
-- 
-- > Int * Char * Bool
-- 
-- In that case it will resolve to:
-- 
-- > Product3 Int Char Bool
type family (*) a b where
  Product6 v1 v2 v3 v4 v5 v6 * v7 =
    Product7 v1 v2 v3 v4 v5 v6 v7
  Product5 v1 v2 v3 v4 v5 * Product2 v6 v7 =
    Product7 v1 v2 v3 v4 v5 v6 v7
  Product5 v1 v2 v3 v4 v5 * v6 =
    Product6 v1 v2 v3 v4 v5 v6
  Product4 v1 v2 v3 v4 * Product3 v5 v6 v7 =
    Product7 v1 v2 v3 v4 v5 v6 v7
  Product4 v1 v2 v3 v4 * Product2 v5 v6 =
    Product6 v1 v2 v3 v4 v5 v6
  Product4 v1 v2 v3 v4 * v5 =
    Product5 v1 v2 v3 v4 v5
  Product3 v1 v2 v3 * Product4 v4 v5 v6 v7 =
    Product7 v1 v2 v3 v4 v5 v6 v7
  Product3 v1 v2 v3 * Product3 v4 v5 v6 =
    Product6 v1 v2 v3 v4 v5 v6
  Product3 v1 v2 v3 * Product2 v4 v5 =
    Product5 v1 v2 v3 v4 v5
  Product3 v1 v2 v3 * v4 =
    Product4 v1 v2 v3 v4
  Product2 v1 v2 * Product5 v3 v4 v5 v6 v7 =
    Product7 v1 v2 v3 v4 v5 v6 v7
  Product2 v1 v2 * Product4 v3 v4 v5 v6 =
    Product6 v1 v2 v3 v4 v5 v6
  Product2 v1 v2 * Product3 v3 v4 v5 =
    Product5 v1 v2 v3 v4 v5
  Product2 v1 v2 * Product2 v3 v4 =
    Product4 v1 v2 v3 v4
  Product2 v1 v2 * v3 =
    Product3 v1 v2 v3
  v1 * Product6 v2 v3 v4 v5 v6 v7 =
    Product7 v1 v2 v3 v4 v5 v6 v7
  v1 * Product5 v2 v3 v4 v5 v6 =
    Product6 v1 v2 v3 v4 v5 v6
  v1 * Product4 v2 v3 v4 v5 =
    Product5 v1 v2 v3 v4 v5
  v1 * Product3 v2 v3 v4 =
    Product4 v1 v2 v3 v4
  v1 * Product2 v2 v3 =
    Product3 v1 v2 v3
  v1 * v2 =
    Product2 v1 v2

infixl 1 *