stoeffel / editable / Editable

Editable represents a value that can be read-only or editable. ReadOnly a holds the locked value and Editable a a holds both the old and the newly modified value.


type Editable a
    = Editable a a
    | ReadOnly a

An Editable value is either ReadOnly or Editable.

view : Editable String -> Html msg
view editable =
    case editable of
        Editable saved modified ->
            input [ defaultValue modified ] []

        ReadOnly saved ->
            text saved

cancel : Editable a -> Editable a

Cancels a modified value. This puts the old value into the context of ReadOnly.

Editable.Editable "old" "new"
    |> Editable.cancel       --> ReadOnly "old"

edit : Editable a -> Editable a

Makes a ReadOnly value Editable.

Editable.ReadOnly "old"
    |> Editable.edit
    |> Editable.map (always "new") --> Editable "old" "new"

isDirty : Editable a -> Basics.Bool

Indicates if a modified value has changed from the saved one, by checking equality of both values.

If the Editable is ReadOnly then we return False.

Editable.Editable "old" "old"
    |> Editable.isDirty  --> False

Editable.Editable "old" "new"
    |> Editable.isDirty  --> True

Editable.ReadOnly "old"
    |> Editable.isDirty  --> False

isDirtyWith : (a -> a -> Basics.Bool) -> Editable a -> Basics.Bool

Indicates if a modified value has changed from the saved one, by a provided function.

If the Editable is ReadOnly then we return False.

Editable.Editable "old" "old"
    |> Editable.isDirtyWith (/=)  --> False

Editable.Editable "old" "new"
    |> Editable.isDirtyWith (/=)  --> True

Editable.ReadOnly "old"
    |> Editable.isDirtyWith (/=)  --> False

isEditable : Editable a -> Basics.Bool

Indicates if an Editable is in Editable state.

Editable.Editable "old" "old"
    |> Editable.isEditable  --> True

Editable.ReadOnly "old"
    |> Editable.isEditable  --> False

isReadOnly : Editable a -> Basics.Bool

Indicates if an Editable is in ReadOnly state.

Editable.Editable "old" "old"
    |> Editable.isReadOnly  --> False

Editable.ReadOnly "old"
    |> Editable.isReadOnly  --> True

map : (a -> a) -> Editable a -> Editable a

Apply a function to an Editable. This is the function you will call in order to update the value of an Editable.Editable.

Editable.ReadOnly "old"
    |> Editable.map String.toUpper --> ReadOnly "old"

Editable.Editable "old" "old"
    |> Editable.map String.toUpper --> Editable "old" "OLD"

Editable.Editable "old" "new"
    |> Editable.map (\val -> val ++ "er")  --> Editable "old" "newer"

Editable.Editable "old" "old"
    |> Editable.map (always "new") --> Editable "old" "new"

save : Editable a -> Editable a

Save a modified value. This puts the modified value into the context of ReadOnly.

Editable.Editable "old" "new"
    |> Editable.save          --> ReadOnly "new"

Editable.ReadOnly "old"
    |> Editable.edit
    |> Editable.map (always "new")
    |> Editable.save          --> ReadOnly "new"

value : Editable a -> a

Returns the current value of an Editable.

Editable.ReadOnly "old"
    |> Editable.value  --> "old"

Editable.Editable "old" "new"
    |> Editable.value  --> "new"