From c2b222141b59c5dd5710b37e00ce6acc690e2def 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) --- js/runtime.js | 25 +++++++++++++++++++++++-- tests/AutomaticList | 11 +++++++++++ tests/AutomaticList.hs | 36 ++++++++++++++++++++++++++++++++++++ tests/asPatternMatch | 11 ++++------- 4 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 tests/AutomaticList create mode 100644 tests/AutomaticList.hs diff --git a/js/runtime.js b/js/runtime.js index b8aee49..08ff557 100644 --- a/js/runtime.js +++ b/js/runtime.js @@ -186,7 +186,6 @@ function Fay$$fayToJs(type,fayObj){ fayObj = Fay$$_(fayObj.cdr); } jsObj = arr; - } else if(base == "tuple") { // Serialize Fay tuple to JavaScript array. @@ -228,14 +227,29 @@ function Fay$$fayToJs(type,fayObj){ else if(base == "automatic" || base == "user") { if(fayObj instanceof Fay$$$) fayObj = Fay$$_(fayObj); - jsObj = Fay$$fayToJsUserDefined(type,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 { + jsObj = Fay$$fayToJsUserDefined(type,fayObj); + } } else throw new Error("Unhandled Fay->JS translation type: " + base); return jsObj; } +function listToArr(args, fayObj){ + +} + // Specialized serializer for string. function Fay$$fayToJs_string(fayObj){ // Serialize Fay string to JavaScript string. @@ -363,6 +377,13 @@ function Fay$$jsToFay(type,jsObj){ if (jsObj && jsObj['instance']) { fayObj = Fay$$jsToFayUserDefined(type,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 b/tests/AutomaticList new file mode 100644 index 0000000..2ad377b --- /dev/null +++ b/tests/AutomaticList @@ -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/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/asPatternMatch b/tests/asPatternMatch index 4092580..f334e29 100644 --- a/tests/asPatternMatch +++ b/tests/asPatternMatch @@ -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' ]