{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GHC2021 #-}
module Main (main) where
import Control.Exception (SomeException, catch, evaluate)
import Data.Functor.Classes
import Data.Tuple.Classes
import Text.Read (readPrec_to_S)
#if defined(LENS)
import Control.Lens
#else
import Lens.Micro
#endif
import DocTest01 qualified
import DocTest02 qualified
main :: IO ()
main = do
DocTest01.main
DocTest02.main
testUncurryNLaziness
testTupleInsertLaziness
testFieldN
testShow2
testRead2
testUncurryNLaziness :: IO ()
testUncurryNLaziness = do
let f _ _ _ _ = putStrLn "OK"
test method = method f $ error "not lazy enough"
test $ uncurryN @4
test $ uncurryN' @4
testTupleInsertLaziness :: IO ()
testTupleInsertLaziness = do
let test x = (True <$ evaluate x) `catch` \(_ :: SomeException) ->
return False
lazyConverged <- test $
ith @2 $ tupleInsert @2 () (undefined :: Solo Int)
if lazyConverged then putStrLn "OK" else error "too strict"
strictConverged <- test $
ith @2 $ tupleInsert @2 () (undefined :: Identity Int)
if strictConverged then error "not strict enough" else putStrLn "OK"
testFieldN :: IO ()
testFieldN = putStrLn $ StrictTuple5 () () () () "OK" ^. _5
nestedS :: String
nestedS = "StrictTuple3 (StrictTuple3 1 2 3) 2 3"
nested :: StrictTuple3 (StrictTuple3 Int Int Int) Int Int
nested = StrictTuple3 (StrictTuple3 1 2 3) 2 3
testShow2 :: IO ()
testShow2 = do
let expected = nestedS
got = showsPrec2 0 nested ""
if expected == got
then putStrLn "OK"
else error $ "expected " ++ show expected ++ "; got " ++ show got
testRead2 :: IO ()
testRead2 = do
let expected = [(nested, "")]
got = readPrec_to_S readPrec2 0 nestedS
if expected == got
then putStrLn "OK"
else error $ "expected " ++ show expected ++ "; got " ++ show got