{-# LANGUAGE OverloadedStrings #-}
module Network.MPD.Applicative.Util where
import Network.MPD.Commands.Parse
import Network.MPD.Commands.Types
import Network.MPD.Util
import Control.Monad (liftM)
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.UTF8 as UTF8
takeEntries :: [ByteString] -> Either String [LsResult]
takeEntries :: [ByteString] -> Either String [LsResult]
takeEntries = forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM [(ByteString, ByteString)] -> Either String LsResult
toEntry forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString]
-> [(ByteString, ByteString)] -> [[(ByteString, ByteString)]]
splitGroups [ByteString]
groupHeads forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> [(ByteString, ByteString)]
toAssocList
where
toEntry :: [(ByteString, ByteString)] -> Either String LsResult
toEntry xs :: [(ByteString, ByteString)]
xs@((ByteString
"file",ByteString
_):[(ByteString, ByteString)]
_) = Song -> LsResult
LsSong forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
`liftM` [(ByteString, ByteString)] -> Either String Song
parseSong [(ByteString, ByteString)]
xs
toEntry ((ByteString
"directory",ByteString
d):[(ByteString, ByteString)]
_) = (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. Path -> LsResult
LsDirectory forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Path
Path) ByteString
d
toEntry ((ByteString
"playlist",ByteString
pl):[(ByteString, ByteString)]
_) = (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. PlaylistName -> LsResult
LsPlaylist forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> PlaylistName
PlaylistName) ByteString
pl
toEntry [(ByteString, ByteString)]
_ = forall a. HasCallStack => String -> a
error String
"takeEntries: splitGroups is broken"
groupHeads :: [ByteString]
groupHeads = [ByteString
"file", ByteString
"directory", ByteString
"playlist"]
takeSongs :: [ByteString] -> Either String [Song]
takeSongs :: [ByteString] -> Either String [Song]
takeSongs = forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM [(ByteString, ByteString)] -> Either String Song
parseSong forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString]
-> [(ByteString, ByteString)] -> [[(ByteString, ByteString)]]
splitGroups [ByteString
"file"] forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> [(ByteString, ByteString)]
toAssocList
takeValues :: [ByteString] -> [ByteString]
takeValues :: [ByteString] -> [ByteString]
takeValues = forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. [(a, b)] -> ([a], [b])
unzip forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ByteString] -> [(ByteString, ByteString)]
toAssocList
decodePair :: (ByteString, ByteString) -> (String, String)
decodePair :: (ByteString, ByteString) -> (String, String)
decodePair (ByteString
x, ByteString
y) = (ByteString -> String
UTF8.toString ByteString
x, ByteString -> String
UTF8.toString ByteString
y)