module Codec.Audio.FLAC.Util
( maybePtr
, toEnum'
, fromEnum'
, peekCStringText
, withCStringText
, withTempFile' )
where
import Control.Exception
import Data.Text (Text)
import Foreign
import Foreign.C.String
import System.Directory
import System.FilePath
import System.IO
import Unsafe.Coerce
import qualified Data.ByteString as B
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
maybePtr :: a -> Maybe a
maybePtr a
| unsafeCoerce a == nullPtr = Nothing
| otherwise = Just a
toEnum' :: (Integral a, Enum b) => a -> b
toEnum' = toEnum . fromIntegral
fromEnum' :: (Integral a, Enum b) => b -> a
fromEnum' = fromIntegral . fromEnum
peekCStringText :: CString -> IO Text
peekCStringText = fmap T.decodeUtf8 . B.packCString
withCStringText :: Text -> (CString -> IO a) -> IO a
withCStringText text = B.useAsCString bytes
where bytes = T.encodeUtf8 (T.filter (/= '\0') text)
withTempFile' :: FilePath -> (FilePath -> IO a) -> IO a
withTempFile' path = bracketOnError acquire cleanup
where
acquire = do
(path',h) <- openBinaryTempFile dir file
hClose h
return path'
cleanup = ignoringIOErrors . removeFile
dir = takeDirectory path
file = takeFileName path
ignoringIOErrors :: IO () -> IO ()
ignoringIOErrors ioe = ioe `catch` handler
where
handler :: IOError -> IO ()
handler = const (return ())