module Utils where

import Control.Concurrent.Chan
import Control.Exception

import System.Directory
import System.Environment
import System.Exit

import System.INotify

testName = do
    n <- getProgName
    return (n ++ "-playground")

withTempDir f = do
    path <- testName
    bracket
        ( createDirectory path >> return path )
        ( removeDirectoryRecursive )
        ( f )

withWatch inot events path action f =
    bracket
        ( addWatch inot events path action )
        ( removeWatch inot )
        ( const f )

inTestEnviron events action f = do
    withTempDir $ \testPath -> do
        inot <- initINotify
        chan <- newChan
        withWatch inot events testPath (writeChan chan) $ do
            action testPath
            events <- getChanContents chan
            f events

(~=) :: Eq a => [a] -> [a] -> Bool
[] ~= _ = True
(x:xs) ~= (y:ys) = x == y && xs ~= ys
_ ~= _ = False

asMany :: [a] -> [a] -> [a]
asMany xs ys = take (length xs) ys

explainFailure expected reality = do
    putStrLn "Expected:"
    mapM_ (\x -> putStr "> " >> print x) expected
    putStrLn "But got:"
    mapM_ (\x -> putStr "< " >> print x) (asMany expected reality)
    testFailure

testFailure = exitFailure 

testSuccess = exitWith ExitSuccess
