/
Headers.purs
56 lines (43 loc) · 1.58 KB
/
Headers.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
module Payload.Headers
( Headers
, empty
, fromFoldable
, lookup
, set
, setIfNotDefined
, toUnfoldable
) where
import Prelude
import Data.Foldable (class Foldable, foldl)
import Data.Map (Map)
import Data.Map as Map
import Data.Maybe (Maybe)
import Data.Newtype (over)
import Data.Tuple (Tuple(..))
import Data.Unfoldable (class Unfoldable)
import Payload.Internal.Utils as Utils
newtype Headers = Headers (Map String String)
instance showHeaders :: Show Headers where
show (Headers h) = show h
instance eqHeaders :: Eq Headers where
eq (Headers a) (Headers b) = eq a b
-- This prefers values on the right in the case
-- of duplicate keys
instance semigroupHeaders :: Semigroup Headers where
append (Headers a) (Headers b) = Headers (b <> a)
empty :: Headers
empty = Headers Map.empty
set :: String -> String -> Headers -> Headers
set name value (Headers headers) =
Headers (Map.insert (Utils.toLowerCase name) value headers)
setIfNotDefined :: String -> String -> Headers -> Headers
setIfNotDefined name value headers | member name headers = headers
setIfNotDefined name value headers = set name value headers
fromFoldable :: forall f. Foldable f => f (Tuple String String) -> Headers
fromFoldable f = foldl (\m (Tuple k v) -> set k v m) empty f
toUnfoldable :: forall f. Unfoldable f => Headers -> f (Tuple String String)
toUnfoldable (Headers h) = Map.toUnfoldable h
lookup :: String -> Headers -> Maybe String
lookup key (Headers h) = Map.lookup (Utils.toLowerCase key) h
member :: String -> Headers -> Boolean
member key (Headers h) = Map.member (Utils.toLowerCase key) h