Now...this took me more time than expected, due to a couple of things...
a) Elm likes to handle Just and Maybe values...Haskell does the same...but Haskell provide alternative functions that deal with Just and Maybe...Elm does not...so I need to come up with some functions for it...
b) Elm doesn't provide a function to get elements from a list...so I need to build the function...
c) I'm still an Elm newbie
That put aside...Elm is still awesome and I love it -;)
Anyway...let's get to work...
Create an folder called LED_Numbers and type this into the terminal...
elm package install evancz/elm-html
elm package install evancz/start-app
Then, open your favorite editor and copy and paste the code...
| LED_Numbers.elm |
|---|
module LED_Numbers where
import Html exposing (..)
import Html.Events exposing (..)
import Html.Attributes exposing (..)
import StartApp.Simple as StartApp
import String exposing (toInt,toList)
import Dict
--MODEL
type alias Model =
{
number: String,
leds: Dict.Dict Char (List String),
line: String
}
initialModel: Model
initialModel =
{
number = "",
leds = Dict.fromList[('0',[" _ ","| | ","|_| "]),('1',[" ","| ","| "]),
('2',[" _ "," _| ","|_ "]),('3',["_ ","_| ","_| "]),
('4',[" ","|_| "," | "]),('5',[" _ ","|_ "," _| "]),
('6',[" _ ","|_ ","|_| "]),('7',["_ "," | "," | "]),
('8',[" _ ","|_| ","|_| "]),('9',[" _ ","|_| "," _| "])],
line = ""
}
--UPDATE
fromJust : Maybe a -> a
fromJust x = case x of
Just y -> y
Nothing -> Debug.crash ""
fromMaybe : Maybe (List String) -> List String
fromMaybe x = case x of
Just y -> y
Nothing -> Debug.crash ""
fromMaybeChar : Maybe Char -> Char
fromMaybeChar x = case x of
Just y -> y
Nothing -> Debug.crash ""
get_elem : List a -> Int -> Maybe a
get_elem lst n =
List.head (List.drop n lst)
fromMaybeListChar : Maybe (List Char) -> List Char
fromMaybeListChar x = case x of
Just y -> y
Nothing -> Debug.crash ""
get_list: String -> List Char
get_list str =
String.toList str
type Action = NoOp | Submit | UpdateNumber String
update: Action -> Model -> Model
update action model =
case action of
NoOp ->
model
UpdateNumber contents ->
{ model | number = contents }
Submit ->
{ model |
line = get_led (get_list model.number) 0 model,
number = ""
}
get_led: List Char -> Int -> Model -> String
get_led lst n model =
if List.length lst > 0
then let h = fromMaybeChar(List.head lst)
t = fromMaybeListChar(List.tail lst)
leds = model.leds
line = Dict.get h leds
in fromJust(get_elem (fromMaybe line) n) ++ get_led t n model
else if n < 2
then "" ++ "\n" ++ get_led (get_list model.number) (n+1) model
else if n == 2
then "" ++ "\n"
else ""
--VIEW
buttonStyle: Attribute
buttonStyle =
style
[ ("outline", "none"),
("border", "none"),
("border-radius","4px"),
("margin-right","5px"),
("padding","4px 10px"),
("background","#61a1bc"),
("color","#fff")
]
divStyle: Attribute
divStyle =
style
[ ("margin", "50px auto"),
("padding", "0px 50px"),
("text-align", "center")
]
pStyle: Attribute
pStyle =
style
[ ("font-size", "30px") ]
pageHeader : Html
pageHeader =
h1 [ ] [text "LED Numbers"]
view: Signal.Address Action -> Model -> Html
view address model =
div [ divStyle ]
[ pageHeader,
input
[
type' "text",
name "number",
placeholder "Enter a number",
value model.number,
on "input" targetValue (\v -> Signal.message address (UpdateNumber v))
]
[ ],
button [ buttonStyle, onClick address Submit ] [ text "Submit" ],
pre [ pStyle ]
[ text (model.line) ]
]
main: Signal Html
main =
StartApp.start { model = initialModel, view = view, update = update }
|
Go into the terminal again and type this...
elm make LED_Numbers.elm --output LED_Numbers.html
Open the file in your browser and run it...
Hope you like it -;)
Greetings,
Blag.
Development Culture.







