###############################################################################
#group decl/binding/basic
###############################################################################

#test basic 1
func x = x

#test infix 1
x *** y = x

#test symbol prefix
(***) x y = x

#test infix more args simple
(f >=> g) k = f k >>= g

#test infix more args alignment
(Left  a <$$> Left  dd) e f = True
(Left  a <$$> Right d ) e f = True
(Right a <$$> Left  d ) e f = False
(Right a <$$> Right dd) e f = True


###############################################################################
#group decl/binding/patterns
###############################################################################

#test wildcard
func _ = x

#test simple long pattern
func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable =
  x

#test simple multiline pattern
func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable
  = x

#test another multiline pattern
func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable a b
  = x

#test simple constructor
func (A a) = a

#test list constructor
func (x : xr) = x

#test some other constructor symbol
func (x :+: xr) = x

#test normal infix constructor
func (x `Foo` xr) = x


###############################################################################
#group decl/binding/guards
###############################################################################

#test simple guard
func | True = x

#test multiple-clauses-1
func x | x         = simple expression
       | otherwise = 0

#test multiple-clauses-2
func x
  | a somewhat longer guard x = "and a somewhat longer expession that does not"
  | otherwise                 = "fit without putting the guards in new lines"

#test multiple-clauses-3
func x
  | very long guard, another rather long guard that refers to x
  = nontrivial expression foo bar alsdkjlasdjlasj
  | otherwise
  = 0

#test multiple-clauses-4
func x
  | very long guard, another rather long guard that refers to x
  = nontrivialexpression foo bar alsdkjlasdjlasj
  | otherwise
  = 0

#test multiple-clauses-5
func x
  | very loooooooooooooooooooooooooooooong guard
  , another rather long guard that refers to x
  = nontrivial expression foo bar alsdkjlasdjlasj
  | otherwise
  = 0