module Sound.Freesound.Search.Query ( Query , include , exclude , (&) ) where import Data.Char (isSpace) import Data.Text (Text) import qualified Data.Text as Text import Network.HTTP.Types.QueryLike (QueryValueLike(..)) newtype Query = Query [Term] deriving (Eq, Show) instance QueryValueLike Query where toQueryValue (Query ts) = toQueryValue $ Text.unwords (map f ts) where quote t | Text.any isSpace t = Text.cons '"' (Text.snoc t '"') | otherwise = t f (Include t) = Text.cons '+' (quote t) f (Exclude t) = Text.cons '-' (quote t) data Term = Include Text | Exclude Text deriving (Eq, Show) include :: Text -> Query include string = Query [Include string] exclude :: Text -> Query exclude string = Query [Exclude string] append :: Query -> Query -> Query append (Query xs) (Query ys) = Query (xs ++ ys) (&) :: Query -> Query -> Query (&) = append