module NumberInput exposing (..) type alias Model a = { value : Maybe a , original : String , convert : String -> Maybe a } fromFloat : Float -> Model Float fromFloat x = Model (Just x) (String.fromFloat x) String.toFloat fromInt : Int -> Model Int fromInt x = Model (Just x) (String.fromInt x) String.toInt get : Model a -> Maybe a get = .value withDefault : a -> Model a -> a withDefault d = Maybe.withDefault d << get isValid : Model a -> Bool isValid model = model.value /= Nothing update : String -> Model a -> Model a update str model = { model | value = model.convert str, original = str } show : Model a -> String show = .original