{-# Language QualifiedDo #-} {-# OPTIONS_GHC -Wno-unused-matches #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} {-# HLINT ignore "Evaluate" #-} module Main (main) where import Control.Exception (ErrorCall (..), catch) import qualified Data.Forced as DF import Data.Forced hiding (pure, fmap, (<*>), return, (>>=), (>>)) import Data.Map.Lazy qualified as ML import Test.HUnit (Counts, Test (TestList), runTestTT, (~:)) main :: IO Counts main = runTestTT tests tests :: Test tests = TestList [ "test1" ~: "noThunksForWHNF" ~: errorCalledWithMsg "argument evaluated" noThunksForWHNF , "test2" ~: "thunksForWHNFMaybe" ~: thunksForWHNFMaybe , "test3" ~: "noThunksForNFMaybe" ~: errorCalledWithMsg "argument evaluated" noThunksForNFMaybe ] errorCalledWithMsg :: String -> IO a -> IO Bool errorCalledWithMsg msg io = catch (False <$ io) (\(ErrorCall msg1) -> pure (msg == msg1)) noThunksForWHNF :: IO () noThunksForWHNF = do let map0 :: Demand (ML.Map Char (ForcedWHNF Int)) map0 = DF.do v <- demandWHNF (error "argument evaluated") DF.pure $ ML.insert 'a' v ML.empty map1 <- extractDemand map0 pure () -- | Should not fail. thunksForWHNFMaybe :: IO () thunksForWHNFMaybe = do let map0 :: Demand (ML.Map Char (ForcedWHNF (Maybe Int))) map0 = DF.do v <- demandWHNF (const (Just (error "argument evaluated")) 'a') DF.pure $ ML.insert 'a' v ML.empty map1 <- extractDemand map0 pure () noThunksForNFMaybe :: IO () noThunksForNFMaybe = do let map0 :: Demand (ML.Map Char (ForcedNF (Maybe Int))) map0 = DF.do v <- demandNF (const (Just (error "argument evaluated")) 'a') DF.pure $ ML.insert 'a' v ML.empty map1 <- extractDemand map0 pure ()