================================================================================
tiny module
================================================================================

module A where

fun a = a

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

(purescript
  name: (qualified_module
    (module))
  (where)
  (function
    name: (variable)
    patterns: (patterns
      (pat_name
        (variable)))
    rhs: (exp_name
      (variable))))

================================================================================
module name with dots
================================================================================

module A.B.C.D where

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

(purescript
  (qualified_module
    (module)
    (module)
    (module)
    (module))
  (where))

================================================================================
bigger module
================================================================================

module A where

fun a = a

fun a = 1

fun a = { a }

fun a = { a : 1 }

fun a = a { a = 1 }

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

(purescript
  name: (qualified_module
    (module))
  (where)
  (function
    name: (variable)
    patterns: (patterns
      (pat_name
        (variable)))
    rhs: (exp_name
      (variable)))
  (function
    name: (variable)
    patterns: (patterns
      (pat_name
        (variable)))
    rhs: (exp_literal
      (integer)))
  (function
    name: (variable)
    patterns: (patterns
      (pat_name
        (variable)))
    rhs: (exp_record
      (exp_field
        field: (variable))))
  (function
    name: (variable)
    patterns: (patterns
      (pat_name
        (variable)))
    rhs: (exp_record
      (exp_field
        field: (variable)
        (exp_literal
          (integer)))))
  (function
    name: (variable)
    patterns: (patterns
      (pat_name
        (variable)))
    rhs: (exp_record_mutation
      (variable)
      (exp_field_assignment
        field: (variable)
        (exp_literal
          (integer))))))

================================================================================
data definition
================================================================================

module A where

data A = A | B | C

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

(purescript
  (qualified_module
    (module))
  (where)
  (data
    (type)
    (type_name
      (type))
    (type_name
      (type))
    (type_name
      (type))))

================================================================================
data definition with extra info
================================================================================

module A where

data A a =
  A a a
  | B a
  | C a a
  | D

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

(purescript
  (qualified_module
    (module))
  (where)
  (data
    (type)
    (type_variable)
    (type_apply
      (type_name
        (type))
      (type_name
        (type_variable))
      (type_name
        (type_variable)))
    (type_apply
      (type_name
        (type))
      (type_name
        (type_variable)))
    (type_apply
      (type_name
        (type))
      (type_name
        (type_variable))
      (type_name
        (type_variable)))
    (type_name
      (type))))

================================================================================
type definition
================================================================================

module A where

type A = A

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

(purescript
  (qualified_module
    (module))
  (where)
  (type_alias
    (type)
    (type_name
      (type))))

================================================================================
newtype definition
================================================================================

module A where

newtype A = A abc

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

(purescript
  (qualified_module
    (module))
  (where)
  (newtype
    (ERROR)
    (newtype_constructor
      (constructor)
      (type_name
        (type_variable)))))

================================================================================
kind definition
================================================================================

module A where

data A

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

(purescript
  (qualified_module
    (module))
  (where)
  (kind
    (type)))

================================================================================
kind value definition
================================================================================

module A where

foreign import data A :: B

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

(purescript
  (qualified_module
    (module))
  (where)
  (kind_value
      (type)
      (type_name
        (type))))

================================================================================
simple class
================================================================================

module A where

class A

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

(purescript
  (qualified_module
    (module))
  (where)
  (class
    (class_head
      (class_name
        (type)))))

================================================================================
simple class with member
================================================================================

module A where

class B where
  a :: Int

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

(purescript
  (qualified_module
    (module))
  (where)
  (class
    (class_head
      (class_name
        (type)))
    (class_body
      (where)
      (signature
        (variable)
        (type_name
          (type))))))

================================================================================
simple class with two member
================================================================================

module A where

class B where
  a :: Int
  b :: Int

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

(purescript
  (qualified_module
    (module))
  (where)
  (class
    (class_head
      (class_name
        (type)))
    (class_body
      (where)
      (signature
        (variable)
        (type_name
          (type)))
      (signature
        (variable)
        (type_name
          (type))))))

================================================================================
class with deps and 3 members
================================================================================

module A where

class (A a) <= B a where
  a :: Int
  b :: Int
  c :: Int

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

(purescript
  (qualified_module
    (module))
  (where)
  (class
    (class_head
      (type_infix
        (type_parens
          (type_apply
            (type_name
              (type))
            (type_name
              (type_variable))))
        (type_operator)
        (type_apply
          (type_name
            (type))
          (type_name
            (type_variable)))))
    (class_body
      (where)
      (signature
        (variable)
        (type_name
          (type)))
      (signature
        (variable)
        (type_name
          (type)))
      (signature
        (variable)
        (type_name
          (type))))))

================================================================================
module with import
================================================================================

module A where

import A

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

(purescript
  (qualified_module
    (module))
  (where)
  (import
    (qualified_module
      (module))))

================================================================================
module with imports - varied
================================================================================

module A where

import A

import B as C

import D (tA, TB, class TC, TD(..)) as E
import F (tA, TB, class TC, TD(..))

import G hiding (h)
import G hiding ()
import G ()

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

(purescript
  (qualified_module
    (module))
  (where)
  (import
    (qualified_module
      (module)))
  (import
    (qualified_module
      (module))
    (module))
  (import
    (qualified_module
      (module))
    (import_list
      (import_item
        (var_import
          (variable)))
      (comma)
      (import_item
        (type_import
          (type)))
      (comma)
      (import_item
        (class_import
          (type_name
            (type))))
      (comma)
      (import_item
        (type_import
          (type)
          (import_con_names
            (all_names)))))
    (module))
  (import
    (qualified_module
      (module))
    (import_list
      (import_item
        (var_import
          (variable)))
      (comma)
      (import_item
        (type_import
          (type)))
      (comma)
      (import_item
        (class_import
          (type_name
            (type))))
      (comma)
      (import_item
        (type_import
          (type)
          (import_con_names
            (all_names))))))
  (import
    (qualified_module
      (module))
    (import_list
      (import_item
        (var_import
          (variable)))))
  (import
    (qualified_module
      (module))
    (import_list))
  (import
    (qualified_module
      (module))
    (import_list)))

================================================================================
module with imports - constructors
================================================================================

module A where

import D (TD(..))

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

(purescript
  (qualified_module
    (module))
  (where)
  (import
    (qualified_module
      (module))
    (import_list
      (import_item
        (type_import
          (type)
          (import_con_names
            (all_names)))))))

================================================================================
module with imports - class
================================================================================

module A where

import D (class TC)

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

(purescript
  (qualified_module
    (module))
  (where)
  (import
    (qualified_module
      (module))
    (import_list
      (import_item
        (class_import
          (type_name
            (type)))))))

================================================================================
module with imports - operators
================================================================================

module A where

import D (type (++), (++))

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

(purescript
  (qualified_module
    (module))
  (where)
  (import
    (qualified_module
      (module))
    (import_list
      (import_item
        (type_operator_import
          (operator)))
      (comma)
      (import_item
        (type_import
          (type_operator))))))

================================================================================
switch expressions
================================================================================
module A where

f = case 1 + 1 of
      2 | someCondition f -> 3
      2 -> 4

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

(purescript
  (qualified_module
    (module))
  (where)
  (function
    (variable)
    (exp_case
      (exp_infix
        (exp_literal
          (integer))
        (operator)
        (exp_literal
          (integer)))
      (alts
        (alt
          (pat_literal
            (integer))
          (gdpat
            (guards
              (guard
                (exp_apply
                  (exp_name
                    (variable))
                  (exp_name
                    (variable)))))
            (exp_literal
              (integer))))
        (alt
          (pat_literal
            (integer))
          (exp_literal
            (integer)))))))

================================================================================
Basic record syntax
================================================================================
module A where

a a = { a: 1 }

b b = { a: 1, b: 1 + 1, c }

c c = b { a = 1 }

d d = {}

e = A.a { b = 1 }

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

(purescript
  (qualified_module
    (module))
  (where)
  (function
    (variable)
    (patterns
      (pat_name
        (variable)))
    (exp_record
      (exp_field
        (variable)
        (exp_literal
          (integer)))))
  (function
    (variable)
    (patterns
      (pat_name
        (variable)))
    (exp_record
      (exp_field
        (variable)
        (exp_literal
          (integer)))
      (comma)
      (exp_field
        (variable)
        (exp_infix
          (exp_literal
            (integer))
          (operator)
          (exp_literal
            (integer))))
      (comma)
      (exp_field
        (variable))))
  (function
    (variable)
    (patterns
      (pat_name
        (variable)))
    (exp_record_mutation
      (variable)
      (exp_field_assignment
        (variable)
        (exp_literal
          (integer)))))
  (function
    (variable)
    (patterns
      (pat_name
        (variable)))
    (exp_record))
  (function
    (variable)
    (exp_record_mutation
      (qualified_variable
        (module)
        (variable))
      (exp_field_assignment
        (variable)
        (exp_literal
          (integer))))))

================================================================================
Foreign imports
================================================================================
module A where

foreign import f :: A -> A

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

(purescript
  (qualified_module
    (module))
  (where)
  (foreign_import
    (variable)
    (fun
      (type_name
        (type))
      (type_name
        (type)))))

================================================================================
Just two decls
================================================================================
module A where

f = 1;

g = 2;

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

(purescript
  (qualified_module
    (module))
  (where)
  (function
    (variable)
    (exp_literal
      (integer)))
  (function
    (variable)
    (exp_literal
      (integer))))

================================================================================
Strings and triple-quoted strings don't conflict
================================================================================

module A where

a = "a"

b = """
  b
"""

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

(purescript
  (qualified_module
    (module))
  (where)
  (function
    (variable)
    (exp_literal
      (string)))
  (function
    (variable)
    (exp_literal
      (triple_quote_string))))

