module Sound.Freesound.Util (
    readMaybe,
    findAttr,
    findChild,
    findChildren,
    strContent,
    findString
) where

import Data.List                (isPrefixOf)
import qualified Text.XML.Light as XML

-- | Find substring.
findString :: String -> String -> Maybe String
findString "" xs        = Just xs
findString a  ""        = Nothing
findString a xs
    | isPrefixOf a xs   = Just xs
findString a (_:xs)     = findString a xs

-- | Read a value from a 'String', returning 'Nothing' when the parse fails.
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
                [(a, "")] -> Just a
                _         -> Nothing

-- | Find an attribute of an 'XML.Element'.
findAttr :: String -> XML.Element -> Maybe String
findAttr name = XML.findAttr (XML.unqual name)

-- | Find a child element of an 'XML.Element'.
findChild :: String -> XML.Element -> Maybe XML.Element
findChild name = XML.findChild (XML.unqual name)

-- | Find all child elements of an 'XML.Element'.
findChildren :: String -> XML.Element -> [XML.Element]
findChildren name = XML.findChildren (XML.unqual name)

-- | Return the string content of an 'XML.Element' in the 'Maybe' monad.
strContent :: XML.Element -> Maybe String
strContent = return . XML.strContent