Git Product home page Git Product logo

Comments (8)

simonh1000 avatar simonh1000 commented on May 26, 2024

You need to think in terms of applicatives - see http://www.troikatech.com/blog/2015/08/17/decoding-larger-json-objects-in-elm

from elm-form.

emanuelkoczwara avatar emanuelkoczwara commented on May 26, 2024

Hello,

Can you give an example? How to build List (String, Field.Field) using applicative style?

from elm-form.

simonh1000 avatar simonh1000 commented on May 26, 2024

Have a look at this - I challenge you to write this with a fold instead of recursion!


-- VALIDATOR
valFloat : String -> Validation e (String, Float)
valFloat fieldName =
    Validate.map
        (\v -> (fieldName, v))
        (fieldName := float `andThen` minFloat 0)

valString : String -> Validation e (String, String)
valString fieldName =
    Validate.map
        (\v -> (fieldName, v))
        (fieldName := string `andThen` nonEmpty)

valMulti : (String -> Validation e a) -> List String -> Validation e (List a)
valMulti valFunc lst =
    case lst of
        [] -> succeed []
        (x::xs) ->
            succeed (::)
                `apply` (valFunc x)
                `apply` (valMulti valFunc xs)

from elm-form.

emanuelkoczwara avatar emanuelkoczwara commented on May 26, 2024

Hello,

There we go:

valMulti' : (String -> Validation e a) -> List String -> Validation e (List a)
valMulti' valFunc =
  foldl (\f p -> succeed (::) `apply` (valFunc f) `apply` p) (succeed [])

But I really don't understand what's the point? I'm satisfied with validation (validateArea). How can I use this to simplify initialAreaFields? Can you give next challenge?

from elm-form.

emanuelkoczwara avatar emanuelkoczwara commented on May 26, 2024

Hello,

It turns out that when I supply default object then this code looks much simpler:

defaultArea : Area
defaultArea =
   { areaDeleted       = False
   , areaName          = "New area"
   , areaMobileVisible = True
   , areaMobileActive  = True
   , areaMobileIndex   = 0
   , areaMobileDefault = False
   , areaImage         = Nothing
   , areaDescription   = Nothing
   }


initialAreaFields : Maybe Area -> Area -> List (String, Field.Field)
initialAreaFields maybeObject defaultObject =
  let
    o = Maybe.withDefault defaultObject maybeObject
  in
    [ "areaDeleted"       => Field.check o.areaDeleted
    , "areaName"          => Field.text o.areaName
    , "areaMobileVisible" => Field.check o.areaMobileVisible
    , "areaMobileActive"  => Field.check o.areaMobileActive
    , "areaMobileIndex"   => Field.text (o.areaMobileIndex |> toString)
    , "areaMobileDefault" => Field.check o.areaMobileDefault
    , "areaImage"         => Field.text (o.areaImage ? "")
    , "areaDescription"   => Field.text (o.areaDescription ? "")
    ]

Is there any better (cleaner) approach?

from elm-form.

etaque avatar etaque commented on May 26, 2024

Hello,
In the current state of elm-simple-form I don't see a better approach :)

Ok to close issue?

Side-node, why prefixing your fields by area?

from elm-form.

emanuelkoczwara avatar emanuelkoczwara commented on May 26, 2024

Hello,

Thanks for your response.

This prefix comes from haskell, I generated my types with elm-bridge.

from elm-form.

etaque avatar etaque commented on May 26, 2024

Ah yes, the record field collision thing.
(by the way I enjoyed the coding challenges guys, that was entertaining ^^)

from elm-form.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.