module Data.Vhd.Utils
( divRoundUp
, resolveColocatedFilePath
, roundUpToModulo
, hAlign
, unlessM
) where
import Control.Monad (unless)
import qualified Data.ByteString as B
import System.FilePath.Posix
import System.IO
divRoundUp :: Integral a => a -> a -> a
divRoundUp a b = let (d, m) = a `divMod` b in d + if m > 0 then 1 else 0
resolveColocatedFilePath :: FilePath -> FilePath -> FilePath
resolveColocatedFilePath baseFilePath colocatedFilePath =
if isAbsolute colocatedFilePath
then colocatedFilePath
else takeDirectory baseFilePath </> colocatedFilePath
roundUpToModulo :: Integral a => a -> a -> a
roundUpToModulo n m
| n `mod` m == 0 = n
| otherwise = n + m (n `mod` m)
hAlign :: Handle -> Int -> IO ()
hAlign h n = hTell h >>= \i -> unless ((i `mod` fromIntegral n) == 0) (realign i)
where realign i = B.hPut h $ B.replicate (n fromIntegral (i `mod` fromIntegral n)) 0
unlessM :: Monad m => m Bool -> m () -> m ()
unlessM condition elseBranch = do
c <- condition
unless c elseBranch