mdgriffith / elm-codegen / Elm.Declare

You may run into situations where you want to generate a function, and then call that generated function somewhere else.

This module will help you do that.

Here's an example, let's define a new function called add42

renderFile =
    let
        add42 =
            Elm.Declare.fn "add42"
                ( "firstInt", Nothing )
                (\firstArgument ->
                    Elm.plus
                        (Elm.int 42)
                        firstArgument
                )
    in
    Elm.file [ "MyFile" ]
        -- add our declaration to our file
        [ add42.declaration

        -- and another place where we call that function!
        , Elm.declaration "mySweetNumber"
            (add42.call (Elm.int 82))
        ]

Depending on your situation, you may want to define a function in one file, but call it from another.

In that case you can do something like this using callFrom:

renderFileList =
    let
        add42 =
            Elm.Declare.fn "add42"
                ( "firstInt", Nothing )
                (\firstArgument ->
                    Elm.plus
                        (Elm.int 42)
                        firstArgument
                )
    in
    [ Elm.file [ "MyFile" ]
        -- add our declaration to our file
        [ add42.declaration
        ]
    , Elm.file [ "MyOtherFile" ]
        -- and call from another file
        [ Elm.declaration "mySweetNumber"
            (add42.callFrom [ "MyFile" ] (Elm.int 82))
        ]
    ]

fn : String -> ( String, Maybe Elm.Annotation.Annotation ) -> (Elm.Expression -> Elm.Expression) -> { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }

fn2 : String -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> (Elm.Expression -> Elm.Expression -> Elm.Expression) -> { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }

fn3 : String -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> (Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression) -> { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }

fn4 : String -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> (Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression) -> { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }

fn5 : String -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> (Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression) -> { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }

fn6 : String -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> ( String, Maybe Elm.Annotation.Annotation ) -> (Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression) -> { declaration : Elm.Declaration, call : Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression, callFrom : List String -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }

value : String -> Elm.Expression -> { declaration : Elm.Declaration, value : Elm.Expression, valueFrom : List String -> Elm.Expression }

function : String -> List ( String, Maybe Elm.Annotation.Annotation ) -> (List Elm.Expression -> Elm.Expression) -> { declaration : Elm.Declaration, call : List Elm.Expression -> Elm.Expression, callFrom : List String -> List Elm.Expression -> Elm.Expression, value : List String -> Elm.Expression }