module Hedgehog.Classes.Common.IO
  ( genIO
  , showIO
  ) where

import Hedgehog
import System.IO.Unsafe (unsafePerformIO)

genIO :: Gen a -> Gen (IO a)
genIO :: Gen a -> Gen (IO a)
genIO Gen a
gen = (a -> IO a) -> Gen a -> Gen (IO a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Gen a
gen

showIO :: Show a => IO a -> String
showIO :: IO a -> String
showIO IO a
io = IO String -> String
forall a. IO a -> a
unsafePerformIO (IO String -> String) -> IO String -> String
forall a b. (a -> b) -> a -> b
$ do
  String
x <- (a -> String) -> IO a -> IO String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> String
forall a. Show a => a -> String
show IO a
io
  let y :: String
y = String
"IO " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x
  String -> IO String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
y