================================================================================
family: closed, nullary
================================================================================

type family A where
  A = A

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (name)
      (equations
        (equation
          (name)
          (name))))))

================================================================================
family: closed, tyvars
================================================================================

type family A a b c where
  A a 'A c = b c

--------------------------------------------------------------------------------

(haskell
  declarations: (declarations
    (type_family
      name: (name)
      patterns: (type_params
        bind: (variable)
        bind: (variable)
        bind: (variable))
      closed_family: (equations
        equation: (equation
          name: (name)
          patterns: (type_patterns
            (variable)
            (promoted
              (constructor))
            (variable))
          (apply
            constructor: (variable)
            argument: (variable)))))))

================================================================================
family: closed, pattern matching
================================================================================

type family A a b c where
  A (Maybe a) [c] = a (Maybe c)

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (name)
      (type_params
        (variable)
        (variable)
        (variable))
      (equations
        (equation
          (name)
          (type_patterns
            (parens
              (apply
                (name)
                (variable)))
            (list
              (variable)))
          (apply
            (variable)
            (parens
              (apply
                (name)
                (variable)))))))))

================================================================================
family: closed, signature
================================================================================

type family A a :: (k -> *) -> 'Just k where
  A a = a

--------------------------------------------------------------------------------

(haskell
  declarations: (declarations
    (type_family
      name: (name)
      patterns: (type_params
        bind: (variable))
      kind: (function
        parameter: (parens
          type: (function
            parameter: (variable)
            result: (star)))
        result: (apply
          constructor: (promoted
            (constructor))
          argument: (variable)))
      closed_family: (equations
        equation: (equation
          name: (name)
          patterns: (type_patterns
            (variable))
          (variable))))))

================================================================================
family: closed, variable kind
================================================================================

type family A (a :: ([k] -> *) -> k) where
  A a = a

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (name)
      (type_params
        (parens
          (annotated
            (variable)
            (function
              (parens
                (function
                  (list
                    (variable))
                  (star)))
              (variable)))))
      (equations
        (equation
          (name)
          (type_patterns
            (variable))
          (variable))))))

================================================================================
family: closed, multiple equations
================================================================================

type family A a where
  A a = a
  A a = a
  A a = a

--------------------------------------------------------------------------------

(haskell
  declarations: (declarations
    (type_family
      name: (name)
      patterns: (type_params
        bind: (variable))
      closed_family: (equations
        equation: (equation
          name: (name)
          patterns: (type_patterns
            (variable))
          (variable))
        equation: (equation
          name: (name)
          patterns: (type_patterns
            (variable))
          (variable))
        equation: (equation
          name: (name)
          patterns: (type_patterns
            (variable))
          (variable))))))

================================================================================
family: open
================================================================================

type family A (a :: a) :: *
type instance A [A] = A
type instance A (A A) = A

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (name)
      (type_params
        (parens
          (annotated
            (variable)
            (variable))))
      (star))
    (type_instance
      (name)
      (type_patterns
        (list
          (name)))
      (name))
    (type_instance
      (name)
      (type_patterns
        (parens
          (apply
            (name)
            (name))))
      (name))))

================================================================================
family: data family
================================================================================

data family A a (a :: [a]) :: Type -> *

--------------------------------------------------------------------------------

(haskell
  (declarations
    (data_family
      (name)
      (type_params
        (variable)
        (parens
          (annotated
            (variable)
            (list
              (variable)))))
      (function
        (name)
        (star)))))

================================================================================
family: data instance adt
================================================================================

data instance ∀ a . A a A =
  A a A a
  |
  A { a :: A }

--------------------------------------------------------------------------------

(haskell
  (declarations
    (data_instance
      (data_type
        (forall
          (quantified_variables
            (variable)))
        (name)
        (type_patterns
          (variable)
          (name))
        (data_constructors
          (data_constructor
            (prefix
              (constructor)
              (variable)
              (name)
              (variable)))
          (data_constructor
            (record
              (constructor)
              (fields
                (field
                  (field_name
                    (variable))
                  (name))))))))))

================================================================================
family: data instance gadt
================================================================================

data instance A a where
  A :: A -> A a
  deriving (A, A)

--------------------------------------------------------------------------------

(haskell
  (declarations
    (data_instance
      (data_type
        (name)
        (type_patterns
          (variable))
        (gadt_constructors
          (gadt_constructor
            (constructor)
            (prefix
              (function
                (name)
                (apply
                  (name)
                  (variable))))))
        (deriving
          (tuple
            (name)
            (name)))))))

================================================================================
family: data instance newtype simple
================================================================================

newtype instance A a A = A a deriving A

--------------------------------------------------------------------------------

(haskell
  (declarations
    (data_instance
      (newtype
        (name)
        (type_patterns
          (variable)
          (name))
        (newtype_constructor
          (constructor)
          (field
            (variable)))
        (deriving
          (name))))))

================================================================================
family: data instance newtype gadt
================================================================================

newtype instance A A where
  A :: A %1 -> A A

newtype instance ∀ a . A a => A (a :: a) :: A where
  A :: A %1 -> A [a] deriving A

--------------------------------------------------------------------------------

(haskell
  (declarations
    (data_instance
      (newtype
        (name)
        (type_patterns
          (name))
        (gadt_constructors
          (gadt_constructor
            (constructor)
            (prefix
              (linear_function
                (name)
                (modifier
                  (literal
                    (integer)))
                (apply
                  (name)
                  (name))))))))
    (data_instance
      (newtype
        (forall
          (quantified_variables
            (variable)))
        (context
          (apply
            (name)
            (variable)))
        (name)
        (type_patterns
          (parens
            (signature
              (variable)
              (variable))))
        (name)
        (gadt_constructors
          (gadt_constructor
            (constructor)
            (prefix
              (linear_function
                (name)
                (modifier
                  (literal
                    (integer)))
                (apply
                  (name)
                  (list
                    (variable)))))))
        (deriving
          (name))))))

================================================================================
family: data instance newtype record
================================================================================

newtype instance A = A { a :: A }

--------------------------------------------------------------------------------

(haskell
  (declarations
    (data_instance
      (newtype
        (name)
        (newtype_constructor
          (constructor)
          (record
            (field
              (field_name
                (variable))
              (name))))))))

================================================================================
family: injectivity annotation
================================================================================
module A where

type family A a = r

type family A a = (r :: A) | r -> a where
  A a = a

--------------------------------------------------------------------------------

(haskell
  (header
    (module
      (module_id)))
  (declarations
    (type_family
      (name)
      (type_params
        (variable))
      (type_family_result
        (variable)))
    (type_family
      (name)
      (type_params
        (variable))
      (type_family_result
        (parens
          (signature
            (variable)
            (name))))
      (type_family_injectivity
        (variable)
        (variable))
      (equations
        (equation
          (name)
          (type_patterns
            (variable))
          (variable))))))

================================================================================
family: infix basic
================================================================================

type family a <> a where
  a <> a = a

type instance A <> A = a

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (infix
        (variable)
        (operator)
        (variable))
      (equations
        (equation
          (infix
            (variable)
            (operator)
            (variable))
          (variable))))
    (type_instance
      (infix
        (name)
        (operator)
        (name))
      (variable))))

================================================================================
family: infix pattern mistaken as infix head
================================================================================

-- Many nodes to ensure the conflict is decided in favor of apply without prec
type family A a a a a a where
  a <> a = a

--------------------------------------------------------------------------------

(haskell
  (comment)
  (declarations
    (type_family
      (name)
      (type_params
        (variable)
        (variable)
        (variable)
        (variable)
        (variable))
      (equations
        (equation
          (infix
            (variable)
            (operator)
            (variable))
          (variable))))))

================================================================================
family: kind signature in pattern
================================================================================

type family A where
  A (a :: A, a) = a

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (name)
      (equations
        (equation
          (name)
          (type_patterns
            (tuple
              (signature
                (variable)
                (name))
              (variable)))
          (variable))))))

================================================================================
family: kind application
================================================================================

type family A where
  A @A @a @(A a) @(∀ a . A a :: A a) a = a

type instance A @a A = a

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (name)
      (equations
        (equation
          (name)
          (type_patterns
            (kind_application
              (name))
            (kind_application
              (variable))
            (kind_application
              (parens
                (apply
                  (name)
                  (variable))))
            (kind_application
              (parens
                (signature
                  (forall
                    (quantified_variables
                      (variable))
                    (apply
                      (name)
                      (variable)))
                  (apply
                    (name)
                    (variable)))))
            (variable))
          (variable))))
    (type_instance
      (name)
      (type_patterns
        (kind_application
          (variable))
        (name))
      (variable))))

================================================================================
family: symbolic prefix
================================================================================

type family (<>) where
  (<>) = A

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (prefix_id
        (operator))
      (equations
        (equation
          (prefix_id
            (operator))
          (name))))))

================================================================================
family: forall before equation
================================================================================

type family A a where
  ∀ a . A a = a

type instance ∀ a . A a = a

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (name)
      (type_params
        (variable))
      (equations
        (equation
          (forall
            (quantified_variables
              (variable)))
          (name)
          (type_patterns
            (variable))
          (variable))))
    (type_instance
      (forall
        (quantified_variables
          (variable)))
      (name)
      (type_patterns
        (variable))
      (variable))))

================================================================================
family: abstract closed family, hs-boot
================================================================================

type family A where
  ..

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (name)
      (abstract_family))))

================================================================================
family: arrow in pattern
================================================================================

type family A where
  A (a -> a) = a

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (name)
      (equations
        (equation
          (name)
          (type_patterns
            (parens
              (function
                (variable)
                (variable))))
          (variable))))))

================================================================================
family: infix asterisk
================================================================================

type family a * a

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (infix
        (variable)
        (operator)
        (variable)))))

================================================================================
family: closed qualified
================================================================================

type family A where
  A.A.A a = a
  a A.A.++ a = a

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_family
      (name)
      (equations
        (equation
          (qualified
            (module
              (module_id)
              (module_id))
            (name))
          (type_patterns
            (variable))
          (variable))
        (equation
          (infix
            (variable)
            (qualified
              (module
                (module_id)
                (module_id))
              (operator))
            (variable))
          (variable))))))

================================================================================
family: open qualified
================================================================================

type instance A.A.A a = a
type instance a A.A.++ a = a

--------------------------------------------------------------------------------

(haskell
  (declarations
    (type_instance
      (qualified
        (module
          (module_id)
          (module_id))
        (name))
      (type_patterns
        (variable))
      (variable))
    (type_instance
      (infix
        (variable)
        (qualified
          (module
            (module_id)
            (module_id))
          (operator))
        (variable))
      (variable))))
