diff --git a/src/DOM/XHR/FormData.js b/src/DOM/XHR/FormData.js index 683f2f6..cada302 100644 --- a/src/DOM/XHR/FormData.js +++ b/src/DOM/XHR/FormData.js @@ -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 {}; }; diff --git a/src/DOM/XHR/FormData.purs b/src/DOM/XHR/FormData.purs index 4921393..9c172c4 100644 --- a/src/DOM/XHR/FormData.purs +++ b/src/DOM/XHR/FormData.purs @@ -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 diff --git a/src/DOM/XHR/FormData/ST.js b/src/DOM/XHR/FormData/ST.js new file mode 100644 index 0000000..c4e4ba6 --- /dev/null +++ b/src/DOM/XHR/FormData/ST.js @@ -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; diff --git a/src/DOM/XHR/FormData/ST.purs b/src/DOM/XHR/FormData/ST.purs new file mode 100644 index 0000000..1a5f35b --- /dev/null +++ b/src/DOM/XHR/FormData/ST.purs @@ -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 diff --git a/src/DOM/XHR/Types.purs b/src/DOM/XHR/Types.purs index 178442a..ab8e8a1 100644 --- a/src/DOM/XHR/Types.purs +++ b/src/DOM/XHR/Types.purs @@ -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.