packages feed

hbro-0.6.8: Hbro/Extra/BookmarksQueue.hs

module Hbro.Extra.BookmarksQueue where

-- {{{ Imports
import Hbro.Types

import Data.List
import qualified Data.Text as T
import qualified Data.Text.IO as T

import Graphics.UI.Gtk.WebKit.WebView

import System.Environment
-- }}}


-- | Add current URI to the end of the queue.
append :: Browser -> IO ()
append browser = do
    uri         <- webViewGetUri (mWebView $ mGUI browser)
    configHome  <- getEnv "XDG_CONFIG_HOME"

    case uri of
        Just u -> appendFile (configHome ++ "/hbro/queue") (u ++ "\n")
        _ -> return ()

-- | Add current URI to the beginning of the queue.
push :: Browser -> IO ()
push browser = do
    uri         <- webViewGetUri (mWebView $ mGUI browser)
    configHome  <- getEnv "XDG_CONFIG_HOME"
    file        <- catch (T.readFile $ configHome ++ "/hbro/queue") (\_error -> return T.empty)

    case uri of 
        Just u ->
            if (file == T.empty)
                then return ()
                else do
                    let fileLines = T.lines file
                    let file' = T.unlines . nub $ (T.pack u):fileLines
                
                    T.writeFile (configHome ++ "/hbro/queue") file'

                    return ()
        _ -> return ()

-- | Return the first URI from the queue, while removing it.
popFront :: IO String
popFront = do
    configHome  <- getEnv "XDG_CONFIG_HOME"
    file        <- catch (T.readFile $ configHome ++ "/hbro/queue") (\_error -> return T.empty)

    if file == T.empty
        then return ""
        else do
            let fileLines = T.lines file
            let file' = T.unlines . tail . nub $ fileLines
        
            T.writeFile (configHome ++ "/hbro/queue.old") file
            T.writeFile (configHome ++ "/hbro/queue") file'

            return $ T.unpack (head fileLines)

-- | Return the last URI from the queue, while removing it.
popBack :: IO String
popBack = do
    configHome  <- getEnv "XDG_CONFIG_HOME"
    file        <- catch (T.readFile $ configHome ++ "/hbro/queue") (\_error -> return T.empty)

    if file == T.empty
        then return ""
        else do
            let fileLines = T.lines file
            let file' = T.unlines . reverse . tail . reverse. nub $ fileLines
        
            T.writeFile (configHome ++ "/hbro/queue.old") file
            T.writeFile (configHome ++ "/hbro/queue") file'

            return $ T.unpack (head $ reverse fileLines)

-- | Return a random URI from the queue, while removing it.
-- popRandom :: Browser -> IO String
-- popRandom browser = do
--     configHome  <- getEnv "XDG_CONFIG_HOME"
--     file        <- catch (T.readFile $ configHome ++ "/hbro/queue") (\e -> return T.empty)

--     if file == T.empty
--         then return ""
--         else do
--             let fileLines = T.lines file
--             let file' = T.unlines . reverse . tail . reverse. nub $ fileLines
--         
--             T.writeFile (configHome ++ "/hbro/queue.old") file
--             T.writeFile (configHome ++ "/hbro/queue") file'

--             return $ T.unpack (head $ reverse fileLines)