Skip to content
This repository was archived by the owner on Oct 4, 2020. It is now read-only.

Wrap FormData effects. #120

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 6 additions & 16 deletions src/DOM/XHR/FormData.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,12 @@ exports.newFormData = function () {
return new FormData();
};

exports.appendString = function (form) {
return function (key) {
return function (val) {
form.append(key, val);
return {};
};
};
exports.appendStringImpl = function (form, key, val) {
form.append(key, val);
return {};
};

exports.appendWithName = function (form) {
return function (key) {
return function (val) {
return function (name) {
form.append(key, val, name);
return {};
};
};
};
exports.appendWithNameImpl = function (form, key, val, name) {
form.append(key, val, name);
return {};
};
43 changes: 20 additions & 23 deletions src/DOM/XHR/FormData.purs
Original file line number Diff line number Diff line change
@@ -1,30 +1,27 @@
module DOM.XHR.FormData (FormDataValue(..), toFormData) where
module DOM.XHR.FormData
( FormDataValue(..)
, toFormData
) where

import Prelude
import Data.Foldable (class Foldable, foldMap)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Uncurried (EffFn3, runEffFn3, EffFn4, runEffFn4)
import Control.Monad.ST (ST)
import Data.Foldable (class Foldable, for_)
import Data.Tuple (Tuple(..))
import DOM (DOM)
import DOM.File.Types (Blob, File)
import DOM.XHR.Types (FormData)
import DOM.XHR.FormData.ST (newFormData, appendString, appendWithName, freeze, thaw)
import DOM.XHR.Types (FormData, FormDataValue)

-- | Possible values of a `FormData`.
data FormDataValue =
FormDataString String
| FormDataFile String File -- ^ File name and `File` object.
| FormDataBlob String Blob -- ^ Blob name and `Blob` object.
-- | Convert an associated array of keys and values to a `FormData`.
toFormData :: forall eff f h. Foldable f => f (Tuple String FormDataValue) -> FormData
toFormData dat = runPure $ runST $ do
result <- newFormData

-- | Convert an associated array of keys and values to a `FormData`.
toFormData :: forall f . (Foldable f) => f (Tuple String FormDataValue) -> FormData
toFormData dat =
let form = newFormData unit in
let _unit = foldMap (appendData form) dat in
form

where
appendData form (Tuple key (FormDataString val)) = appendString form key val
appendData form (Tuple key (FormDataFile name val)) = appendWithName form key val name
appendData form (Tuple key (FormDataBlob name val)) = appendWithName form key val name
for_ dat $ case _ of
Tuple key (FormDataString val) -> appendString result key val
Tuple key (FormDataFile name val) -> appendWithName result key val name
Tuple key (FormDataBlob name val) -> appendWithName result key val name

foreign import newFormData :: Unit -> FormData

foreign import appendString :: FormData -> String -> String -> Unit
foreign import appendWithName :: forall a . FormData -> String -> a -> String -> Unit
freeze result
27 changes: 27 additions & 0 deletions src/DOM/XHR/FormData/ST.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"use strict";

exports.emptySTFormData = function () {
return new FormData();
};

exports.appendSTFormDataImpl = function (formData, name, value) {
formData.append(name, value);
return {};
};

exports.setSTFormDataImpl = function (formData, name, value) {
formData.set(name, value);
return {};
};

exports.freezeImpl = function (formData) {
var result = new FormData();

formData.forEach(function (value, key) {
result.append(key, value);
});

return result;
};

exports.thawImpl = exports.freeze;
36 changes: 36 additions & 0 deletions src/DOM/XHR/FormData/ST.purs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
module DOM.XHR.FormData.ST
( newFormData
, emptySTFormData
, appendSTFormData
, freeze
, thaw
) where

-- | Create a new, empty FormData object that is ready for mutation.
foreign import emptySTFormData
:: forall a eff h.
Eff (st :: ST h | r) (STFormData h a)

foreign import appendSTFormDataImpl
:: forall a h r.
EffFn3 (st :: ST h | r) STFormData String a Unit

appendSTFormData = runEffFn3 appendSTFormDataImpl

foreign import setSTFormDataImpl
:: forall a h r.
EffFn3 (st :: ST h | r) STFormData String a Unit

setSTFormData = runEffFn3 setSTFormDataImpl

foreign import freezeImpl
:: forall a h r.
EffFn1 (st :: ST h | r) STFormData FormData

freeze = runEff1 freezeImpl

foreign import thawImpl
:: forall a h r.
EffFn1 (st :: ST h | r) FormData STFormData

thaw = runEff1 thawImpl
6 changes: 6 additions & 0 deletions src/DOM/XHR/Types.purs
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,9 @@ foreign import data XMLHttpRequestEventTarget :: Type
foreign import data XMLHttpRequestUpload :: Type
foreign import data XMLHttpRequest :: Type
foreign import data FormData :: Type

-- | Possible values of a `FormData`.
data FormDataValue
= FormDataString String
| FormDataFile String File -- ^ File name and `File` object.
| FormDataBlob String Blob -- ^ Blob name and `Blob` object.