on master help sign in
Minor bug fixes for foreign imports/exports. Update changelog
commit882a381abafd3d45d12b520c7a2215d7f5664692 authorevancz <info@elm-lang.org> dateThu 28 Jun 2012, 12:58 (14 years ago) parent0934ab6
7 files changed+74−20
elm/changelog.txt+31−4 elm/elm-runtime-0.3.5.js+26−7 elm/src/Gen/CompileToJS.hs+5−5 elm/src/Initialize.hs+1 elm/src/Parse/ParseForeign.hs+3−2 elm/src/Parse/ParseTypes.hs+1−1 elm/src/Types/Hints.hs+7−1
elm/changelog.txt+31−4
@@ -1,17 +1,44 @@
1+
12Release 0.3.5
23=============
34
45* Add JavaScript event interface. Allows Elm to import and export JS values
56 and events. This makes it possible to import and export Elements, so users
67 can use JS techniques and libraries if necessary.
8+
79* Add new flags to help with JavaScript event interface.
10+
11+* Add three built-in event listeners (elm_title, elm_log, elm_redirect) that
12+ make it possible to make some common/simple imperative actions without
13+ having to worry about writing the JS yourself. For example:
14+ foreign export jsevent "elm_title"
15+ title :: Signal JSString
16+ will update the page's title to the current value of the title signal.
17+ Empty strings are ignored. "elm_redirect" and "elm_log" events work much
18+ the same way, except that "elm_log" does not skip empty strings.
19+
820* Add new Signal functions:
9− count :: Signal a -> Signal Int
10− keepIf :: a -> (a -> Bool) -> Signal a -> Signal a
11− dropIf :: a -> (a -> Bool) -> Signal a -> Signal a
21+ count :: Signal a -> Signal Int
22+ keepIf :: (a -> Bool) -> a -> Signal a -> Signal a
23+ dropIf :: (a -> Bool) -> a -> Signal a -> Signal a
24+ keepWhen :: Signal Bool -> a -> Signal a -> Signal a
25+ dropWhen :: Signal Bool -> a -> Signal a -> Signal a
1226 dropRepeats :: Signal a -> Signal a
1327 The keep and drop functions make it possible to filter events, which
14− was not possible in prior releases.
28+ was not possible in prior releases. More documentation:
29+ http://elm-lang.org/docs/Signal/Signal.elm
30+
31+* Add examples of JS event interface and new signal functions:
32+ https://github.com/evancz/Elm/tree/master/Examples/elm-js
33+
34+* Use more compressed format for strings. Should make strings 10-12 times
35+ more space efficient than in previous releases. Anecdotal evidence:
36+ Elm's home page is now 70% of its previous size.
37+
38+* Add new function to Data.List:
39+ last :: [a] -> a
40+
41+* Fix parenthesization bug with binary operators.
1542
1643
1744
elm/elm-runtime-0.3.5.js+26−7
@@ -255,6 +255,17 @@ var Value = function(){
255255 }
256256 return v[2];
257257 }
258+ function last(v) {
259+ if (v[0] !== "Cons") {
260+ throw "Error: 'last' only accepts lists of length greater than one.";
261+ }
262+ var out = v[1];
263+ while (v[0] === "Cons") {
264+ out = v[1];
265+ v = v[2];
266+ }
267+ return out;
268+ }
258269 function map(f) {
259270 return function(xs) {
260271 if (xs[0] === "Nil") { return xs; }
@@ -634,6 +645,7 @@ var Value = function(){
634645 }
635646 return {head:head,
636647 tail:tail,
648+ last:last,
637649 map:map,
638650 foldl:foldl,
639651 foldr:foldr,
@@ -713,6 +725,7 @@ var Maybe = function() {
713725 };
714726}();
715727
728+/*
716729var String = function() {
717730
718731 function append(s1) { return function(s2) {
@@ -784,16 +797,14 @@ var String = function() {
784797 concatMap : concatMap,
785798 forall : forall,
786799 exists : exists,
787− /*
788− filter : filter,
789− take:,
790− drop:,
791− */
800+ //filter : filter,
801+ //take:,
802+ //drop:,
792803 toText : Value.toText,
793804 properEscape : Value.properEscape
794805 };
795806}();
796−
807+*/
797808return {String: {toText:Value.toText, properEscape:Value.properEscape},
798809 Char:Char,
799810 Maybe:Maybe,
@@ -1910,7 +1921,8 @@ var Signal = function() {
19101921 button:button};
19111922 }();
19121923
1913− return {Mouse:Mouse,
1924+ return {addListener:addListener,
1925+ Mouse:Mouse,
19141926 Keyboard:Keyboard,
19151927 Time:Time,
19161928 Window:Window,
@@ -1992,6 +2004,7 @@ var Prelude = function() {
19922004 filter : Data.List.filter,
19932005 head : Data.List.head,
19942006 tail : Data.List.tail,
2007+ last : Data.List.last,
19952008 length : Data.List.length,
19962009 reverse : Data.List.reverse,
19972010 foldr : Data.List.foldr,
@@ -2028,6 +2041,12 @@ var Prelude = function() {
20282041}();
20292042var eq = Value.eq;
20302043
2044+Signal.addListener(document, 'elm_log', function(e) { console.log(e.value); });
2045+Signal.addListener(document, 'elm_title', function(e) { document.title = e.value; });
2046+Signal.addListener(document, 'elm_redirect', function(e) {
2047+ if (e.value.length > 0) { window.location = e.value; }
2048+ });
2049+
20312050var includeGlobal = this;
20322051(function() {
20332052 var include = function(library) {
elm/src/Gen/CompileToJS.hs+5−5
@@ -61,15 +61,15 @@ jsModule (Module names exports imports defs foreigns) =
6161 (concatMap importEvent i, concatMap exportEvent e)
6262
6363importEvent (js,base,elm,_) =
64− concat [ "var " ++ elm ++ " = Elm.Input(" ++ toJS base ++ ");"
65− , "Signal.addListener(document, '" ++ js
64+ concat [ "\nvar " ++ elm ++ " = Elm.Input(" ++ toJS base ++ ");"
65+ , "\nSignal.addListener(document, '" ++ js
6666 , "', function(e) { Dispatcher.notify(" ++ elm
6767 , ".id, e.value); });" ]
6868exportEvent (js,elm,_) =
69− concat [ "lift (function(v) { var e = document.createEvent('Event');"
69+ concat [ "\nlift(function(v) { var e = document.createEvent('Event');"
7070 , "e.initEvent('" ++ js ++ "', true, true);"
7171 , "e.value = v;"
72− , "document.dispatchEvent(e); return v; })(" ++ elm ++ ")"
72+ , "document.dispatchEvent(e); return v; })(" ++ elm ++ ");"
7373 ]
7474
7575jsImport (modul, how) =
@@ -158,6 +158,6 @@ binop (o:p) e1 e2
158158 "." -> jsFunc "x" . ret $ e1 ++ parens (e2 ++ parens "x")
159159 "==" -> "eq(" ++ e1 ++ "," ++ e2 ++ ")"
160160 "/=" -> "not(eq(" ++ e1 ++ "," ++ e2 ++ "))"
161− _ -> e1 ++ (o:p) ++ e2
161+ _ -> parens (e1 ++ (o:p) ++ e2)
162162
163163append e1 e2 = "Value.append" ++ parens (e1 ++ "," ++ e2)
elm/src/Initialize.hs+1
@@ -10,6 +10,7 @@ import Unify
1010import Rename
1111import Optimize
1212
13+
1314initialize str = do
1415 (Module name ex im defs (ims,exs), tipes) <- parseProgram str
1516 let (Let ds _) = rename . Let defs $ Var "_"
elm/src/Parse/ParseForeign.hs+3−2
@@ -9,6 +9,7 @@ import Ast
99import ParseLib
1010import ParseExpr (term)
1111import ParseTypes
12+import Types (signalOf)
1213
1314
1415foreignDefs = do
@@ -28,7 +29,7 @@ exportEvent = do
2829 tipe <- typeExpr
2930 case tipe of
3031 ADTPT "Signal" [pt] ->
31− either fail (return . (,,) js elm) (toForeignType pt)
32+ either fail (return . (,,) js elm . signalOf) (toForeignType pt)
3233 _ -> fail "When exporting events, the exported value must be a Signal."
3334
3435importEvent = do
@@ -41,7 +42,7 @@ importEvent = do
4142 tipe <- typeExpr
4243 case tipe of
4344 ADTPT "Signal" [pt] ->
44− either fail (return . (,,,) js base elm) (toForeignType pt)
45+ either fail (return . (,,,) js base elm . signalOf) (toForeignType pt)
4546 _ -> fail "When importing events, the imported value must be a Signal."
4647
4748
elm/src/Parse/ParseTypes.hs+1−1
@@ -99,4 +99,4 @@ toForeignType (VarPT x@(c:_))
9999 | otherwise = Left $ "'" ++ x ++ "' is not an exportable type. Only JSTypes are exportable."
100100
101101isJsStructure name = name == "JSArray" || isTuple
102− where isTuple = "JSTuple" == take 7 name && name `elem` map show [2..5]
102+ where isTuple = "JSTuple" == take 7 name && drop 7 name `elem` map show [2..5]
elm/src/Types/Hints.hs+7−1
@@ -56,7 +56,7 @@ casts =
5656 , "castBoolToJSBool" -: BoolT ==> jsBool
5757 , "castJSNumberToInt" -: jsNumber ==> IntT
5858 , "castIntToJSNumber" -: IntT ==> jsNumber
59− , "castJSElementToElement" -: jsElement ==> element
59+ , "castJSElementToElement" -: IntT ==> IntT ==> jsElement ==> element
6060 , "castElementToJSElement" -: element ==> jsElement
6161 , "castJSStringToString" -: jsString ==> string
6262 , "castStringToJSString" -: string ==> jsString
@@ -92,6 +92,12 @@ signals = sequence
9292 , do [a,b] <- vars 2
9393 "foldp" -:: (a ==> b ==> b) ==> b ==> signalOf a ==> signalOf b
9494 , do a <- var ; "randomize" -:: IntT ==> IntT ==> signalOf a ==> signalOf IntT
95+ , do a <- var ; "count" -:: signalOf a ==> signalOf IntT
96+ , do a <- var ; "keepIf" -:: (a==>BoolT) ==> a ==> signalOf a ==> signalOf a
97+ , do a <- var ; "dropIf" -:: (a==>BoolT) ==> a ==> signalOf a ==> signalOf a
98+ , do a <- var ; "keepWhen" -:: signalOf BoolT ==>a==> signalOf a ==> signalOf a
99+ , do a <- var ; "dropWhen" -:: signalOf BoolT ==>a==> signalOf a ==> signalOf a
100+ , do a <- var ; "dropRepeats" -:: signalOf a ==> signalOf a
95101 ]
96102
97103concreteSignals =