From 73b31d424bf30980627f81f855ee57f2747f9426 Mon Sep 17 00:00:00 2001 From: Adam Bergmark Date: Tue, 2 Jul 2013 00:15:06 +0200 Subject: [PATCH] Automatic now handles lists and tuples. Works for Array <=> Automatic a, Automatic [a], and Automatic (,) (fixes #251) --- fay.cabal | 2 ++ js/runtime.js | 24 +++++++++++++++++++++--- tests/AutomaticList.hs | 36 ++++++++++++++++++++++++++++++++++++ tests/AutomaticList.res | 11 +++++++++++ tests/asPatternMatch.res | 11 ++++------- 5 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 tests/AutomaticList.hs create mode 100644 tests/AutomaticList.res diff --git a/fay.cabal b/fay.cabal index ef974bb..a44014f 100644 --- a/fay.cabal +++ b/fay.cabal @@ -47,6 +47,8 @@ extra-source-files: tests/Api/Records.hs tests/asPatternMatch.hs tests/asPatternMatch.res + tests/AutomaticList.hs + tests/AutomaticList.res tests/baseFixities.hs tests/baseFixities.res tests/basicFunctions.hs diff --git a/js/runtime.js b/js/runtime.js index a8bba43..dd32c97 100644 --- a/js/runtime.js +++ b/js/runtime.js @@ -198,7 +198,6 @@ function Fay$$fayToJs(type,fayObj){ fayObj = Fay$$_(fayObj.cdr); } jsObj = arr; - } else if(base == "tuple") { // Serialize Fay tuple to JavaScript array. @@ -240,8 +239,20 @@ function Fay$$fayToJs(type,fayObj){ else if(base == "automatic" || base == "user") { if(fayObj instanceof Fay$$$) fayObj = Fay$$_(fayObj); - var fayToJsFun = Fay$$fayToJsHash[fayObj.constructor.name]; - jsObj = fayToJsFun ? fayToJsFun(type,type[2],fayObj) : fayObj; + + if(fayObj instanceof Fay$$Cons){ + // Serialize Fay list to JavaScript array. + var arr = []; + fayObj = Fay$$_(fayObj); + while(fayObj instanceof Fay$$Cons) { + arr.push(Fay$$fayToJs(["automatic"],fayObj.car)); + fayObj = Fay$$_(fayObj.cdr); + } + jsObj = arr; + } else { + var fayToJsFun = Fay$$fayToJsHash[fayObj.constructor.name]; + jsObj = fayToJsFun ? fayToJsFun(type,type[2],fayObj) : fayObj; + } } else throw new Error("Unhandled Fay->JS translation type: " + base); @@ -380,6 +391,13 @@ function Fay$$jsToFay(type,jsObj){ var jsToFayFun = Fay$$jsToFayHash[jsObj["instance"]]; fayObj = jsToFayFun ? jsToFayFun(type,type[2],jsObj) : jsObj; } + else if (jsObj instanceof Array) { + var list = null; + for (var i = jsObj.length - 1; i >= 0; i--) { + list = new Fay$$Cons(Fay$$jsToFay([base], jsObj[i]), list); + } + fayObj = list; + } else fayObj = jsObj; diff --git a/tests/AutomaticList.hs b/tests/AutomaticList.hs new file mode 100644 index 0000000..ed760f3 --- /dev/null +++ b/tests/AutomaticList.hs @@ -0,0 +1,36 @@ +module AutomaticList where + +import Prelude +import FFI + +main :: Fay () +main = do + printA [1,2,3] + printA [[1],[2],[3]] + printA (1,2) + printA ([1],[2]) + printArr [1,2,3] + printArr [[1],[2],[3]] + printT (1,2) + printT ([1],[2]) + printA . tail $ readA "[1,2,3]" + printA . tail $ readArr "[1,2,3]" + printA . snd $ readT "[1,2]" + +printA :: Automatic a -> Fay () +printA = ffi "console.log(%1)" + +printArr :: Automatic [a] -> Fay () +printArr = ffi "console.log(%1)" + +printT :: (Automatic a, Automatic b) -> Fay () +printT = ffi "console.log(%1)" + +readA :: String -> Automatic a +readA = ffi "JSON.parse(%1)" + +readArr :: String -> Automatic [a] +readArr = ffi "JSON.parse(%1)" + +readT :: String -> Automatic (a,b) +readT = ffi "JSON.parse(%1)" diff --git a/tests/AutomaticList.res b/tests/AutomaticList.res new file mode 100644 index 0000000..2ad377b --- /dev/null +++ b/tests/AutomaticList.res @@ -0,0 +1,11 @@ +[ 1, 2, 3 ] +[ [ 1 ], [ 2 ], [ 3 ] ] +[ 1, 2 ] +[ [ 1 ], [ 2 ] ] +[ 1, 2, 3 ] +[ [ 1 ], [ 2 ], [ 3 ] ] +[ 1, 2 ] +[ [ 1 ], [ 2 ] ] +[ 2, 3 ] +[ 2, 3 ] +2 diff --git a/tests/asPatternMatch.res b/tests/asPatternMatch.res index 4092580..f334e29 100644 --- a/tests/asPatternMatch.res +++ b/tests/asPatternMatch.res @@ -1,7 +1,4 @@ -{ car: { car: 1, cdr: { car: 2, cdr: [Object] } }, - cdr: { car: { car: 1, cdr: [Object] }, cdr: null } } -{ car: { car: 1, cdr: { car: 2, cdr: [Object] } }, - cdr: { car: 1, cdr: { car: [Object], cdr: null } } } -{ car: { car: 1, cdr: { car: 2, cdr: [Object] } }, - cdr: { car: 1, cdr: { car: [Object], cdr: null } } } -{ car: 'o', cdr: { car: 'k', cdr: null } } +[ [ 1, 2, 3 ], [ 1, 2, 3 ] ] +[ [ 1, 2, 3 ], 1, [ 2, 3 ] ] +[ [ 1, 2, 3 ], 1, [ 2, 3 ] ] +[ 'o', 'k' ]