content: {-# LANGUAGE CPP #-}
  {-# LANGUAGE RecordWildCards #-}
  {-# OPTIONS_GHC -Wno-partial-type-signatures #-}
  {-# LANGUAGE ExtendedDefaultRules, FlexibleContexts #-}
  {-# LANGUAGE RankNTypes #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE PackageImports #-}
  {-# LANGUAGE PartialTypeSignatures #-}
  {-# LANGUAGE ViewPatterns #-}
  {-# LANGUAGE TemplateHaskell #-}
  -- {-# OPTIONS_GHC -dth-dec-file #-} -- turn on to debug TH
  module Hoed(main) where
  
  import Control.Exception.Extra
  import Debug.Hoed
  import Control.Monad
  import Data.Aeson
  import qualified Data.ByteString.Lazy as B
  import Util
  
  #if __GLASGOW_HASKELL__ >= 802
  debug [d|
      quicksort :: (a -> a -> Bool) -> [a] -> [a]
      quicksort op [] = []
      quicksort op (x:xs) = quicksort op lt ++ [x] ++ quicksort op gt
          where (lt, gt) = partition (op x) xs
  
      partition               :: (a -> Bool) -> [a] -> ([a],[a])
      {-# INLINE partition #-}
      partition p = foldr (select p) ([],[])
  
      select :: (a -> Bool) -> a -> ([a], [a]) -> ([a], [a])
      select p x ~(ts,fs) | p x       = (x:ts,fs)
                          | otherwise = (ts, x:fs)
    |]
  #endif
  
  debug [d|
      foo :: m a -> m a
      foo = id
  
      listcomp, listmap :: Num a => a -> a
      listcomp y = sum [x*2 | x <- [1..y]]
      listmap y = sum $ map (\x -> 1+x*2) [1..y]
    |]
  
  main :: IO ()
  main = do
      trace <- getDebugTrace defaultHoedOptions $ do
  #if __GLASGOW_HASKELL__ >= 802
        print (quicksort (<) "haskell")
  #endif
        print (listmap (3::Int))
        print (listcomp (3::Int))
      -- see https://github.com/feuerbach/ansi-terminal/issues/47 as this test fails on Appveyor
      -- can remove once ansi-terminal-0.8 is available in Stackage LTS (which will be v11)
      try_ $ debugPrintTrace trace
      B.writeFile "hoed.json" $ encode trace
  #if __GLASGOW_HASKELL__ >= 802
      Just refTrace <- decode <$> B.readFile "test/ref/hoed.json"
  #else
      Just refTrace <- decode <$> B.readFile "test/ref/hoed80.json"
  #endif
      unless (equivalentTrace trace refTrace) $
        error "Trace does not match the reference value"
      print (foo ['c'])
  