module Util.TempFile(
newTempFile,
) where
import System.Directory
import Control.Concurrent
import System.IO.Unsafe
import Util.IOExtras
import Util.WBFiles
import Util.UniqueFile
import Util.FileNames
data TempFileSource = TempFileSource {
fileStore :: UniqueFileStore,
fileSource :: MVar UniqueFileCounter
}
tempFileSource :: TempFileSource
tempFileSource = unsafePerformIO (
do
workingDir <- getWorkingDir
let directory = combineNames workingDir "#"
catchAlreadyExists (createDirectory workingDir)
catchAlreadyExists (createDirectory directory)
fileStore <- newUniqueFileStore directory createDirectory
fileSource <- newMVar initialUniqueFileCounter
return (TempFileSource {fileStore = fileStore,fileSource = fileSource})
)
newTempFile :: IO FilePath
newTempFile =
do
let
TempFileSource {fileStore = fileStore,fileSource = fileSource} =
tempFileSource
fileCounter <- takeMVar fileSource
let (newName,nextFileCounter) = stepUniqueFileCounter fileCounter
putMVar fileSource nextFileCounter
ensureDirectories fileStore newName
return (getFilePath fileStore newName)