import Data.Functor ((<$>))
import Data.Int (Int)
import Data.Kind (Constraint, Type)
-import Data.List.NonEmpty (NonEmpty (..))
+import Data.List.NonEmpty (NonEmpty (..), (<|))
import Data.Maybe (Maybe (..), isJust, maybe)
import Data.Monoid (Monoid (..))
import Data.Proxy (Proxy (..))
-- * Class 'MediaTypeFor'
class (Typeable fmt, FileExtension fmt) => MediaTypeFor fmt where
mediaTypeFor :: Proxy fmt -> MediaType
- mediaTypesFor :: Proxy fmt -> NonEmpty MediaType
- mediaTypesFor fmt = mediaTypeFor fmt :| []
instance MediaTypeFor () where
mediaTypeFor _t = mimeAny
instance FileExtension () where
data JSON deriving (Typeable)
instance MediaTypeFor JSON where
mediaTypeFor _t = charsetUTF8 $ "application" Media.// "json"
- mediaTypesFor fmt = mediaTypeFor fmt :| ["application" Media.// "json"]
instance FileExtension JSON where
fileExtension = "json"
data HTML deriving (Typeable)
instance MediaTypeFor HTML where
mediaTypeFor _t = charsetUTF8 $ "text" Media.// "html"
- mediaTypesFor fmt = mediaTypeFor fmt :| ["text" Media.// "html"]
instance FileExtension HTML where
fileExtension = "html"
mimeTypesMap :: NonEmpty (MediaType, MimeType c)
instance (MediaTypeFor fmt, c fmt) => MimeTypes '[fmt] c where
- mimeTypesMap = (,MimeType @c @fmt Proxy) <$> mediaTypesFor (Proxy @fmt)
+ mimeTypesMap = (mediaTypeFor (Proxy @fmt), MimeType @c @fmt Proxy) :| []
instance (MediaTypeFor fmt, MimeTypes (t1 ': ts) c, c fmt) => MimeTypes (fmt ': t1 ': ts) c where
mimeTypesMap =
- ( (,MimeType @c @fmt Proxy)
- <$> mediaTypesFor (Proxy @fmt)
- )
- <> mimeTypesMap @(t1 ': ts) @c
+ (mediaTypeFor (Proxy @fmt), MimeType @c @fmt Proxy)
+ <| mimeTypesMap @(t1 ': ts) @c
matchAccept ::
forall ts c.