content: -- |
  -- Module      : Test.LeanCheck.Function.Show
  -- Copyright   : (c) 2015-2024 Rudy Matela
  -- License     : 3-Clause BSD  (see the file LICENSE)
  -- Maintainer  : Rudy Matela <rudy@matela.com.br>
  --
  -- This module is part of LeanCheck,
  -- a simple enumerative property-based testing library.
  --
  -- This module exports an orphan 'Show' instance for functions.
  -- It shows functions as up to 8 case distinctions, one per line.
  --
  -- /Warning: this is only intended to be used in testing modules./
  -- /Avoid importing this on modules that are used as libraries./
  --
  -- This is intended to 'Show' functions
  -- generated by the 'Test.LeanCheck.Listable' instance for functions
  -- defined in "Test.LeanCheck.Function.Listable":
  -- functions that have finite exceptions to a constant function.
  -- It does work on other types of functions, albeit using @"..."@.
  --
  -- > > print (&&)
  -- > \x y -> case (x,y) of
  -- >         (True,True) -> True
  -- >         _ -> False
  --
  -- > > print (==>)
  -- > \x y -> case (x,y) of
  -- >         (True,False) -> False
  -- >         _ -> True
  --
  -- > > print (==2)
  -- > \x -> case x of
  -- >       2 -> True
  -- >       _ -> False
  --
  -- > > print (\x -> abs x < 2)
  -- > \x -> case x of
  -- >       0 -> True
  -- >       1 -> True
  -- >       -1 -> True
  -- >       _ -> False
  --
  -- When the function cannot be defined by finite exceptions to a constant
  -- function using 8 case-patterns, the rest of the function is represented by
  -- @"..."@.
  --
  -- > > print (+)
  -- > \x y -> case (x,y) of
  -- >         (0,0) -> 0
  -- >         (0,1) -> 1
  -- >         (1,0) -> 1
  -- >         (0,-1) -> -1
  -- >         (1,1) -> 2
  -- >         (-1,0) -> -1
  -- >         (0,2) -> 2
  -- >         (1,-1) -> 0
  -- >         ...
  --
  -- The exported orphan 'Show' '->' instance is actually defined in
  -- "Test.LeanCheck.Function.Show.EightLines".  An alternative is provided in
  -- "Test.LeanCheck.Function.Show.FourCases".
  --
  -- The exported 'Show' instance only works for functions whose ultimate return
  -- types are instances of 'Test.LeanCheck.Function.ShowFunction.ShowFunction'.
  -- For user-defined algebraic datatypes that are instances of 'Show', their
  -- ShowFunction instance can be defined by using
  -- 'Test.LeanCheck.Function.ShowFunction.bindtiersShow':
  --
  -- > import Test.LeanCheck.Function.ShowFunction
  -- >
  -- > instance ShowFunction Ty where
  -- >   bindtiers  =  bindtiersShow
  module Test.LeanCheck.Function.Show () where
  
  import Test.LeanCheck.Function.Show.EightLines ()
  