bower install
elm-package install
elm-make Main.elm Counter.elm --output=elm.js
elm-reactor
and then visit:
bower install
elm-package install
elm-make Main.elm Counter.elm --output=elm.js
elm-reactor
and then visit:
{ | |
"name": "elm-counter-exploration", | |
"authors": [ | |
"Peter Damoc <[email protected]>" | |
], | |
"description": "", | |
"main": "", | |
"moduleType": [], | |
"license": "MIT", | |
"homepage": "", | |
"ignore": [ | |
"**/.*", | |
"node_modules", | |
"bower_components", | |
"test", | |
"tests" | |
], | |
"dependencies": { | |
"polymer": "polymer/polymer#~1.2.3" | |
} | |
} |
port module Counter exposing (..) | |
import Html exposing (..) | |
import Html.App exposing (..) | |
import Html.Attributes exposing (..) | |
import Html.Events exposing (..) | |
import Json.Decode as Json exposing (Value) | |
type alias Model = | |
Int | |
init : Int -> ( Model, Cmd Msg ) | |
init val = | |
( val, Cmd.none ) | |
view : Model -> Html Msg | |
view model = | |
div [ style [ ( "backgroundColor", "#faa" ) ] ] | |
[ button [ onClick Decrement ] [ text "-" ] | |
, span [] [ text <| toString model ] | |
, button [ onClick Increment ] [ text "+" ] | |
] | |
type Msg | |
= Increment | |
| Decrement | |
| Set Int | |
port change : Int -> Cmd msg | |
port set : (Model -> msg) -> Sub msg | |
update : Msg -> Model -> ( Model, Cmd Msg ) | |
update msg model = | |
case msg of | |
Increment -> | |
( model + 1, change (model + 1) ) | |
Decrement -> | |
( model - 1, change (model - 1) ) | |
Set value -> | |
( value, change value ) | |
main : Program Int | |
main = | |
programWithFlags | |
{ init = init | |
, view = view | |
, update = update | |
, subscriptions = \_ -> set Set | |
} | |
---- | |
value : Int -> Attribute msg | |
value val = | |
Html.Attributes.attribute "value" (toString val) | |
counter : List (Attribute msg) -> Html msg | |
counter attrs = | |
Html.node "elm-counter" attrs [] | |
detailValue : Json.Decoder Int | |
detailValue = | |
Json.at [ "detail", "value" ] Json.int | |
onValueChanged : (Int -> a) -> Attribute a | |
onValueChanged tagger = | |
on "value-changed" <| Json.map tagger detailValue |
{ | |
"version": "1.0.0", | |
"summary": "helpful summary of your project, less than 80 characters", | |
"repository": "https://github.com/user/project.git", | |
"license": "BSD3", | |
"source-directories": [ | |
"." | |
], | |
"exposed-modules": [], | |
"dependencies": { | |
"elm-lang/core": "4.0.5 <= v < 5.0.0", | |
"elm-lang/html": "1.1.0 <= v < 2.0.0" | |
}, | |
"elm-version": "0.17.1 <= v < 0.18.0" | |
} |
<!DOCTYPE HTML> | |
<html> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Elm • Multi</title> | |
<link rel="import" href="/bower_components/polymer/polymer.html"/> | |
<script type="text/javascript" src="elm.js"></script> | |
</head> | |
<body style="margin: 0px;"> | |
</body> | |
<script> | |
// register an element | |
var counter = Polymer( | |
{ is: 'elm-counter' | |
, properties: | |
{ value : | |
{ type: Number | |
, value: 0 | |
, notify: true | |
} | |
} | |
, ready: function() | |
{ | |
var app = Elm.Counter.embed(this, this.value); | |
app.ports.change.subscribe(value => { | |
this.value = value; | |
}); | |
} | |
}); | |
</script> | |
<script type="text/javascript"> | |
Elm.Main.fullscreen(); | |
</script> | |
</html> |
module Main exposing (..) | |
import Html exposing (..) | |
import Html.App exposing (..) | |
import Counter exposing (counter, value, onValueChanged) | |
type alias Model = | |
Int | |
view : Model -> Html Msg | |
view model = | |
div [] | |
[ counter [ value 2, onValueChanged ValueChanged ] | |
] | |
type Msg | |
= ValueChanged Int | |
update : Msg -> Model -> Model | |
update msg model = | |
case msg of | |
ValueChanged val -> | |
Debug.log "val" val | |
main : Program Never | |
main = | |
beginnerProgram | |
{ model = 0 | |
, view = view | |
, update = update | |
} |