Skip to content

Instantly share code, notes, and snippets.

@stoeffel
Created May 27, 2016 14:43
Show Gist options
  • Save stoeffel/24e6e685205d50ec12dcdd12fa515ff4 to your computer and use it in GitHub Desktop.
Save stoeffel/24e6e685205d50ec12dcdd12fa515ff4 to your computer and use it in GitHub Desktop.
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