Generating pipeline and applicative decoders with json2elm

I've added a few features to json2elm.

In addition to plain elm/json decoders, it can now also generate applicative and pipeline decoders. It also generates the required imports based on the chosen decoder type. You can also choose between noun-based and verb-based function names for decoders and encoders.

Applicative decoders take advantage of the andMap function from elm-community/json-extra and look like this:

accountDecoder : Json.Decode.Decoder Account
accountDecoder = 
    Json.Decode.succeed Account
        |> Json.Decode.Extra.andMap (Json.Decode.field "id" Json.Decode.int)
        |> Json.Decode.Extra.andMap (Json.Decode.field "prefs" accountPrefsDecoder)
        |> Json.Decode.Extra.andMap (Json.Decode.field "user" accountUserDecoder)

Pipeline decoders rely on the NoRedInk/elm-json-decode-pipeline package and look like this:

accountDecoder : Json.Decode.Decoder Account
accountDecoder = 
    Json.Decode.succeed Account
        |> Json.Decode.Pipeline.required "id" Json.Decode.int
        |> Json.Decode.Pipeline.required "prefs" accountPrefsDecoder
        |> Json.Decode.Pipeline.required "user" accountUserDecoder

I've also added imports to the generated code, so for example for pipeline decoders you will get a preamble like this:

import Json.Decode
import Json.Encode
import Json.Decode.Pipeline


-- Required packages:
-- * elm/json
-- * NoRedInk/elm-json-decode-pipeline

Finally, there are two naming styles you can choose from for the functions: noun-based and verb-based. If you use nouns, you will get names like accountDecoder and encodedAccount versus decodeAccount and encodeAccount when using verbs. I am partial to noun function names for the reason that in functional programs, we are describing what the transformations of the data are, rather than how they are done.