packages feed

vision-0.0.2.2: src/Playlist/Format/Format.hs

-- -*-haskell-*-
--  Vision (for the Voice): an XMMS2 client.
--
--  Author:  Oleg Belozeorov
--  Created: 23 Feb. 2010
--
--  Copyright (C) 2009-2010 Oleg Belozeorov
--
--  This program is free software; you can redistribute it and/or
--  modify it under the terms of the GNU General Public License as
--  published by the Free Software Foundation; either version 3 of
--  the License, or (at your option) any later version.
--
--  This program is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
--  General Public License for more details.
--

module Playlist.Format.Format
  ( Fe (..)
  , cookFormat
  , formatMediaInfo
  ) where

import Prelude hiding (lookup)

import Control.Applicative
import Control.Monad
import Control.Monad.Writer
import Control.Monad.Error

import Graphics.UI.Gtk (escapeMarkup)

import Properties


data Fe a
  = FeP a
  | FeL String
  | FeO [Fe a]


cookFormat fmt = runErrorT (mapM f fmt)
  where f (FeP n) =
          maybe (throwError "") (return . FeP) =<< (liftIO $ property n)
        f (FeL s) =
          return $ FeL s
        f (FeO l) =
          FeO <$> mapM f l

formatMediaInfo [] _         = Nothing
formatMediaInfo (fmt:fmts) m =
  execWriterT (mapM_ f fmt) `mplus` formatMediaInfo fmts m
  where f (FeP p) = tell . escapeMarkup =<< (lift $ lookup p m)
        f (FeL s) = tell s
        f (FeO l) = mapM_ f l `mplus` return ()