У меня есть следующая функция:
safeWrite :: Text -> IO ()
safeWrite c = bracket (openTempFile "/tmp" "list.tmp")
(\(path, h) -> hClose h
>> copyFile path dataFile
>> removeFile path)
(\(_, h) -> TI.hPutStr h c)
У меня сложилось впечатление, что это будет безопасно, копирование не произойдет, если в любой момент возникнут ошибки, а исходный файл все еще будет пригоден для использования. Однако буквально вчера у меня появился пустой файл, и я понятия не имею, куда его посмотреть. Программа работала более месяца без каких-либо сбоев, что указывает на какой-то угловой случай, о котором я не думал.
Гарантирует ли метод атомарность, то есть ошибка в другом месте, а если нет, то почему? Что я должен сделать, чтобы гарантировать атомарность?