-- | Funny operators that are mere type aliases for the constructs in
-- 'TypeSpec'
module Test.TypeSpecCrazy
      ( module Test.TypeSpecCrazy
      , module ReExport)
    where

import Test.TypeSpec as ReExport

-- * Crazy Type operators

-- | Create a 'TypeSpec' with an initial description or title followed by some
-- expectations. Note that the number of @#@s is alway a multiple of 3.
type (###) title expr = Explain title expr
type (######) title expr = Explain title expr
type (#########) title expr = Explain title expr
type (############) title expr = Explain title expr
type (###############) title expr = Explain title expr
type (##################) title expr = Explain title expr
type (#####################) title expr = Explain title expr
type (########################) title expr = Explain title expr
type (###########################) title expr = Explain title expr
type (##############################) title expr = Explain title expr
type (#################################) title expr = Explain title expr
type (####################################) title expr = Explain title expr
type (#######################################) title expr = Explain title expr
type (##########################################) title expr =
  Explain title expr
type (#############################################) title expr =
  Explain title expr
type (################################################) title expr =
  Explain title expr
type (###################################################) title expr =
  Explain title expr
type (######################################################) title expr =
  Explain title expr
type (#########################################################) title expr =
  Explain title expr
type (############################################################) title expr =
  Explain title expr
type (###############################################################) title expr =
  Explain title expr
type (##################################################################) title expr =
  Explain title expr
type (#####################################################################) title expr =
  Explain title expr
type (########################################################################) title expr =
  Explain title expr

infixr 0 ###
infixr 0 ######
infixr 0 #########
infixr 0 ############
infixr 0 ###############
infixr 0 ##################
infixr 0 #####################
infixr 0 ########################
infixr 0 ###########################
infixr 0 ##############################
infixr 0 #################################
infixr 0 ####################################
infixr 0 #######################################
infixr 0 ##########################################
infixr 0 #############################################
infixr 0 ################################################
infixr 0 ###################################################
infixr 0 ######################################################
infixr 0 #########################################################
infixr 0 ############################################################
infixr 0 ###############################################################
infixr 0 ##################################################################
infixr 0 #####################################################################
infixr 0 ########################################################################

-- | Specify an expectation using an underlined title using 'It'.
type (--*) title expr = It title expr
type (~~~) title expr = It title expr
type (~~~~~~) title expr = It title expr
type (~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr = It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr
type (~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) title expr =
  It title expr

infixl 2 --*
infixl 2 ~~~
infixr 2 ~~~~~~
infixr 2 ~~~~~~~~~
infixr 2 ~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
infixr 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

type expectation1 -*- expectation2 = expectation1 -/- expectation2
infixl 2 -*-