@@ -280,39 +280,53 @@ parseBoundedTextData :: (TextShow a, Bounded a, Enum a) => Text -> Either Text a
280280-- Right Foo
281281parseBoundedTextData :: (Show a, Bounded a, Enum a) => Text -> Either Text a
282282#endif
283−parseBoundedTextData = parseMaybeTextData (flip lookup values . T.toLower)
284− where
285− values = map (showTextData &&& id) [minBound..maxBound]
283+parseBoundedTextData = parseBoundedEnumOfI showTextData
284+
285+-- | Lookup values based on a precalculated mapping of their representations.
286+lookupBoundedEnumOf :: (Bounded a, Enum a, Eq b) => (a -> b) -> b -> Maybe a
287+lookupBoundedEnumOf f = flip lookup (map (f &&& id) [minBound..maxBound])
288+
289+-- | Parse values based on a precalculated mapping of their @'Text'@ representation.
290+--
291+-- >>> parseBoundedEnumOf toUrlPiece "true" :: Either Text Bool
292+-- Right True
293+--
294+-- For case sensitive parser see 'parseBoundedEnumOfI'.
295+parseBoundedEnumOf :: (Bounded a, Enum a) => (a -> Text) -> Text -> Either Text a
296+parseBoundedEnumOf = parseMaybeTextData . lookupBoundedEnumOf
297+
298+-- | /Case insensitive/.
299+--
300+-- Parse values case insensitively based on a precalculated mapping
301+-- of their @'Text'@ representations.
302+--
303+-- >>> parseBoundedEnumOfI toUrlPiece "FALSE" :: Either Text Bool
304+-- Right False
305+--
306+-- For case sensitive parser see 'parseBoundedEnumOf'.
307+parseBoundedEnumOfI :: (Bounded a, Enum a) => (a -> Text) -> Text -> Either Text a
308+parseBoundedEnumOfI f = parseBoundedEnumOf (T.toLower . f) . T.toLower
286309
287310-- | /Case insensitive/.
288311--
289312-- Parse values case insensitively based on @'ToHttpApiData'@ instance.
290313-- Uses @'toUrlPiece'@ to get possible values.
291−--
292314parseBoundedUrlPiece :: (ToHttpApiData a, Bounded a, Enum a) => Text -> Either Text a
293−parseBoundedUrlPiece = parseMaybeTextData (flip lookup values . T.toLower)
294− where
295− values = map (toUrlPiece &&& id) [minBound..maxBound]
315+parseBoundedUrlPiece = parseBoundedEnumOfI toUrlPiece
296316
297317-- | /Case insensitive/.
298318--
299319-- Parse values case insensitively based on @'ToHttpApiData'@ instance.
300320-- Uses @'toQueryParam'@ to get possible values.
301−--
302321parseBoundedQueryParam :: (ToHttpApiData a, Bounded a, Enum a) => Text -> Either Text a
303−parseBoundedQueryParam = parseMaybeTextData (flip lookup values . T.toLower)
304− where
305− values = map (toQueryParam &&& id) [minBound..maxBound]
322+parseBoundedQueryParam = parseBoundedEnumOfI toQueryParam
306323
307−-- | /Case insensitive/.
308−--
309−-- Parse values case insensitively based on @'ToHttpApiData'@ instance.
324+-- | Parse values based on @'ToHttpApiData'@ instance.
310325-- Uses @'toHeader'@ to get possible values.
311−--
312−parseBoundedHeader :: (ToHttpApiData a, Bounded a, Enum a) => Text -> Either Text a
313−parseBoundedHeader = parseMaybeTextData (flip lookup values . T.toLower)
314− where
315− values = map (decodeUtf8 . toHeader &&& id) [minBound..maxBound]
326+parseBoundedHeader :: (ToHttpApiData a, Bounded a, Enum a) => ByteString -> Either Text a
327+parseBoundedHeader bs = case lookupBoundedEnumOf toHeader bs of
328+ Nothing -> defaultParseError (decodeUtf8 bs)
329+ Just x -> return x
316330
317331-- | Parse URL piece using @'Read'@ instance.
318332--