import Test.Speculate
import Data.List (sort,insert)

ordered :: Ord a => [a] -> Bool
ordered (x:y:xs) = x <= y && ordered (y:xs)
ordered _        = True

main :: IO ()
main = speculate args
  { constants =
      [ background
      , constant "False"     False
      , constant "True"      True
      , showConstant ([] :: [Int])
      , constant ":"       $ (:)     -:>  int
      , constant "++"      $ (++)    -:> [int]
      , constant "elem"    $ elem   ->:> [int]
      , constant "ordered" $ ordered -:> [int]
      , constant "all"     $ all    ->:> [int]

      , foreground
      , constant "insert"  $ insert  -:>  int
      , constant "sort"    $ sort    -:> [int]

      , background
      , constant "=="      $ (==)    -:>  int
      , constant "<="      $ (<=)    -:>  int
      , constant "<"       $ (<)     -:>  int
      ]
  , maxVars = 2
  , showConditions = True
  }

import Test.Speculate
import Data.List (sort,insert)

ordered :: Ord a => [a] -> Bool
ordered (x:y:xs) = x <= y && ordered (y:xs)
ordered _        = True

main :: IO ()
main = speculate args
  { constants =
      [ background
      , constant "False"     False
      , constant "True"      True
      , showConstant ([] :: [Int])
      , constant ":"       $ (:)     -:>  int
      , constant "++"      $ (++)    -:> [int]
      , constant "elem"    $ elem   ->:> [int]
      , constant "ordered" $ ordered -:> [int]
      , constant "all"     $ all    ->:> [int]

      , foreground
      , constant "insert"  $ insert  -:>  int
      , constant "sort"    $ sort    -:> [int]

      , background
      , constant "=="      $ (==)    -:>  int
      , constant "<="      $ (<=)    -:>  int
      , constant "<"       $ (<)     -:>  int
      ]
  , maxVars = 2
  , showConditions = True
  }
