Created
May 27, 2016 14:43
-
-
Save stoeffel/24e6e685205d50ec12dcdd12fa515ff4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Html exposing (Html, Attribute, text, div, input, button) | |
import Html.App exposing (program) | |
import Html.Attributes exposing (..) | |
import Html.Events exposing (onInput, onClick) | |
import List | |
import String | |
import Char | |
import Random | |
-- Model | |
type Mood | |
= Happy | |
| Unhappy | |
| NaN | |
| Empty | |
type alias Model = | |
{ numberString: String | |
, mood': Mood | |
} | |
init = (Model "" Empty, Cmd.none) | |
main = | |
program | |
{ init = init | |
, view = view | |
, update = updateWithCmd | |
, subscriptions = \_ -> Sub.none | |
} | |
-- UPDATE | |
type Msg | |
= NewNumber String | |
| GenerateRandomNumber | |
| NewRandom Int | |
updateWithCmd : Msg -> Model -> ( Model, Cmd Msg ) | |
updateWithCmd msg model = | |
( update msg model, updateCmd msg model ) | |
update msg model = | |
let | |
emptyOrNaN numberString = | |
if String.isEmpty numberString then | |
Empty | |
else | |
NaN | |
digits nr | |
= nr | |
|> String.split "" | |
|> List.filterMap (String.toInt >> Result.toMaybe) | |
square x | |
= x ^ 2 | |
squaredSum nr | |
= toString nr | |
|> digits | |
|> List.map square | |
|> List.sum | |
isHappy nr guesses = | |
case nr of | |
1 -> Happy | |
_ -> | |
case (List.member nr guesses) of | |
True -> Unhappy | |
False -> isHappy (squaredSum nr) <| nr::guesses | |
in | |
case msg of | |
NewRandom nr -> Model (toString nr) <| isHappy nr [] | |
NewNumber numberString -> | |
case String.toInt numberString of | |
Ok numberInt -> Model numberString <| isHappy numberInt [] | |
Err _ -> Model numberString <| emptyOrNaN numberString | |
_ -> model | |
updateCmd msg _ = | |
case msg of | |
GenerateRandomNumber -> Random.generate NewRandom <| Random.int 1 1000 | |
_ -> Cmd.none | |
-- VIEW | |
view {mood', numberString} = | |
let | |
(color, isHappy) = | |
case mood' of | |
Unhappy -> ("orange", "is unhappy") | |
Happy -> ("green", "is happy") | |
NaN -> ("red", "isn't a number") | |
Empty -> ("black", "") | |
in | |
div [] | |
[ div [ containerStyles ] | |
[ numberInput color numberString | |
, randomButton | |
] | |
, result numberString color isHappy | |
] | |
numberInput color nr = | |
input | |
[ placeholder "enter number" | |
, onInput NewNumber | |
, myStyle color "4" | |
, value nr | |
] | |
[] | |
randomButton = | |
button | |
[ onClick GenerateRandomNumber | |
, myStyle "black" "1" | |
] | |
[ text "random #" | |
] | |
result numberString color isHappy = | |
div | |
[ myStyle color "1"] | |
[ text ( numberString ++ " " ++ isHappy ) ] | |
containerStyles = | |
style | |
[ ( "display", "flex" ) | |
, ("align-items", "stretch") | |
, ("height", "60px") | |
] | |
myStyle color flex = | |
style | |
[ ("flex", flex) | |
, ("color", color) | |
, ("padding", "10px 0") | |
, ("font-size", "2em") | |
, ("text-align", "center") | |
] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment