/
Headers.purs
53 lines (40 loc) · 1.47 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
module Web.Fetch.Headers
( Headers
, fromFoldable
, fromRecord
, fromObject
, toArray
, toUnfoldable
, empty
) where
import Prelude
import Data.Array as Array
import Data.Foldable (class Foldable, foldM)
import Data.Function.Uncurried (Fn2, runFn2)
import Data.Tuple (Tuple(..))
import Data.Unfoldable (class Unfoldable)
import Effect (Effect)
import Effect.Uncurried (EffectFn3, runEffectFn3)
import Effect.Unsafe (unsafePerformEffect)
import Foreign.Object (Object)
import Type.Row.Homogeneous (class Homogeneous)
foreign import data Headers :: Type
foreign import unsafeNew :: Effect Headers
foreign import unsafeAppend :: EffectFn3 String String Headers Unit
foreign import unsafeFromRecord :: forall r. { | r } -> Headers
foreign import _toArray :: Fn2 (forall a b. a -> b -> Tuple a b) Headers (Array (Tuple String String))
foreign import fromObject :: Object String -> Headers
fromFoldable :: forall f. Foldable f => f (Tuple String String) -> Headers
fromFoldable f = unsafePerformEffect do
init <- unsafeNew
foldM (\headers (Tuple key value) -> do
runEffectFn3 unsafeAppend key value headers
pure headers) init f
fromRecord :: forall r. Homogeneous r String => { | r } -> Headers
fromRecord = unsafeFromRecord
toArray :: Headers -> Array (Tuple String String)
toArray = runFn2 _toArray Tuple
toUnfoldable :: forall f. Unfoldable f => Headers -> f (Tuple String String)
toUnfoldable = Array.toUnfoldable <<< toArray
empty :: Headers
empty = fromFoldable []