    --------------------------------------------------------------------
    -- |
    -- Module    : Codec.MIME.Utils
    -- Copyright : (c) 2006-2009, Galois, Inc.
    -- License   : BSD3
    --
    -- Maintainer: Sigbjorn Finne <sigbjorn.finne@gmail.com>
    -- Stability : provisional
    -- Portability: portable
    --
    -- Extracting content from MIME values and types.
    --
    --------------------------------------------------------------------
    module Codec.MIME.Utils
      ( findMultipartNamed -- :: String -> MIMEValue -> Maybe MIMEValue
      )  where

    import Codec.MIME.Type
    import Data.List ( find )
    import Control.Monad ( msum )
    import Data.Text(Text)

    -- | Given a parameter name, locate it within a MIME value,
    -- returning the corresponding (sub) MIME value.
    findMultipartNamed :: Text -> MIMEValue -> Maybe MIMEValue
    findMultipartNamed nm mv =
     case mime_val_content mv of
       Multi ms  -> msum (map (findMultipartNamed nm) ms)
       Single {} -> do cd <- mime_val_disp mv
                       _ <- find (withDispName nm) (dispParams cd)
                       return mv
     where withDispName a (Name b) = a == b
           withDispName _ _ = False