packages feed

animascii-0.1.0.0: src/Export/Queue.hs

module Export.Queue where

import Terminal.Game
import Export.Gif
import Parse
import Config

import Control.Concurrent
import System.FilePath
import Control.Monad

import System.Directory
import System.FilePath


-- queue of files to process.
type JobQueue = MVar [FilePath]
createQueue :: IO (MVar [FilePath])
createQueue = newMVar []

startQueue :: Config -> JobQueue -> ResQueue -> IO ()
startQueue c mv mrq = -- mvar sarà sempre piena
                  takeMVar mv >>= \fl ->
                  case fl of
                    []     -> putMVar mv []
                    (f:fs) -> putMVar mv fs   >>
                              doRenderJob c f mrq
                  >> threadDelay second
                  >> startQueue c mv mrq
    where
          second = 10^6

addRenderJob :: FilePath -> MVar [FilePath] -> IO ()
addRenderJob fp mv = takeMVar mv >>= putMVar mv . (\fs -> fs ++ [fp])

-- Nothing == Ok, String == Exception
doRenderJob :: Config -> FilePath -> MVar [String] -> IO ()
doRenderJob c f rq =
        let gb  = cGif c
            sb  = cSerial c
            fps = cFPS c
            clp = cColours c

            flg = replaceOutExt c f "gif"
            fls = replaceOutExt c f "slz"
        in

        readAnimation f >>= \efms ->

        case efms of
          Left e    -> addResult rq f "failed on readAnimation"
          Right fms -> when gb (addResult rq flg "GIF export in progress..." >>
                                writeGif fps flg clp fms >>= \r ->
                                let r' = maybe "GIF done!" show r in
                                addResult rq flg r'
                               ) >>
                       when sb (addResult rq fls "Serialising..." >>
                                encodeAni fls fms >>
                                addResult rq fls ": serialisation done!"
                               )

-- in $outfolder
replaceOutExt :: Config -> FilePath -> String -> FilePath
replaceOutExt c fp ne = let out = cODir c
                            (dir, file) = splitFileName fp
                            name = dropExtension file
                            bdir = takeDirectory . takeDirectory $ dir
                        in
                        bdir </> out </> name <.> ne

-- queue of results of processing
type ResQueue = MVar [String]
createResultQueue :: IO (MVar [String])
createResultQueue = newMVar []

addResult :: MVar [String] -> FilePath -> String -> IO ()
addResult mrs fp r =
                takeMVar mrs        >>= \rs ->
                getCurrentDirectory >>= \cwd ->
                let fp' = makeRelative cwd fp
                    rs' = rs ++ [stringResult fp' r] in
                putMVar mrs rs'
    where
          stringResult :: FilePath -> String -> String
          stringResult fp r = fp ++ ": " ++ r

getResults :: ResQueue -> IO [String]
getResults rq = takeMVar rq   >>= \rs ->
                putMVar rq [] >>
                return rs