packages feed

movie-monad-0.0.5.0: src/Utils.hs

{-
  Movie Monad
  (C) 2017 David Lettier
  lettier.com
-}

module Utils where

import System.Exit
import System.Process
import System.FilePath
import Control.Monad
import Control.Exception
import Text.Read
import Data.List
import Data.Text
import Data.Int
import qualified GI.Gtk

fileNameFromFilePathName :: Data.Text.Text -> Data.Text.Text
fileNameFromFilePathName = Data.Text.pack . System.FilePath.takeFileName . Data.Text.unpack

enumToInt32 :: (Enum a, Ord a) => a -> Int32
enumToInt32 enum = fromIntegral (fromEnum enum) :: Int32

int64toDouble :: Int64 -> Double
int64toDouble i = fromIntegral i :: Double

doubleToInt64 :: Double -> Int64
doubleToInt64 d = fromIntegral (round d :: Int) :: Int64

isTextEmpty :: Data.Text.Text -> Bool
isTextEmpty = Data.Text.null . Data.Text.strip

getDesiredWindowWidth :: GI.Gtk.ComboBoxText -> GI.Gtk.Window -> IO Int
getDesiredWindowWidth windowWidthSelectionComboBoxText window = do
  maybeSelectedWindowWidth <- getSelectedWindowWidth windowWidthSelectionComboBoxText
  case maybeSelectedWindowWidth of
    Just selectedWidth -> return selectedWidth
    _                  -> do
      (windowWidth, _) <- GI.Gtk.windowGetSize window
      return (fromIntegral windowWidth :: Int)

getSelectedWindowWidth :: GI.Gtk.ComboBoxText -> IO (Maybe Int)
getSelectedWindowWidth windowWidthSelectionComboBoxText = do
  activeId <- GI.Gtk.comboBoxGetActive windowWidthSelectionComboBoxText
  if activeId == (-1)
    then return Nothing
    else do
      string <-
        Data.Text.unpack <$>
          GI.Gtk.comboBoxTextGetActiveText
            windowWidthSelectionComboBoxText
      return (readMaybe string :: Maybe Int)

linuxProcessIsRunning :: String -> IO Bool
linuxProcessIsRunning processName = do
  (_, out, _) <- safeRunProcessGetOutput "pgrep" ["-f", processName]
  return (not $ Data.List.null out)

spawnLinuxProcessAndDisown :: String -> IO ()
spawnLinuxProcessAndDisown processCommand =
  void $
    System.Process.spawnCommand
      (  "nohup "
      ++ processCommand
      ++ " </dev/null &>/dev/null & disown"
      )

safeRunProcessGetOutput :: String -> [String] -> IO (System.Exit.ExitCode, String, String)
safeRunProcessGetOutput processName args =
  catch readProcess' catchError
  where
    readProcess' :: IO (System.Exit.ExitCode, String, String)
    readProcess' =
      readProcessWithExitCode
        processName
        args
        ""
    catchError :: Control.Exception.IOException -> IO (System.Exit.ExitCode, String, String)
    catchError e = do
      putStr $ show e
      return (ExitFailure 1, "", "")

clamp :: Ord a => a -> a -> a -> a
clamp minimum' maximum' el
  | el < minimum' = minimum'
  | el > maximum' = maximum'
  | otherwise     = el