An Arg can be used to pattern match on the arguments of a function.
let
args =
Elm.Arg.tuple (Arg.var "first") (Arg.var "second")
in
Elm.fn args
(\( first, second ) ->
Elm.record
[ ( "first", first )
, ( "second", second )
]
)Will generate
\( first, second ) ->
{ first = first
, second = second
}Or they can be used to unpack values in the branch of a case expression.
Elm.Case.custom (Elm.val "myVar") (Elm.Annotation.named [] "MyCustomType)
[ Elm.branch "MyCustomType" (Arg.tuple (Arg.var "first") (Arg.var "second"))
(\( first, second ) ->
Elm.record
[ ( "first", first )
, ( "second", second )
]
)
]Will generate
case myVar of
MyCustomType first second ->
{ first = first
, second = second
}Unpack record fields.
let
args =
Elm.Arg.record
|> Elm.Arg.field "first" (Arg.var "first")
|> Elm.Arg.field "second" (Arg.var "second")
in
Elm.fn args
(\{ first, second } ->
Elm.record
[ ( "first", first )
, ( "second", second )
]
)Would generate
\{ first, second } ->
{ first = first
, second = second
}Unpack a pattern, but keep a reference to the original value.
let
args =
Elm.Arg.customType "MyCustomType" Tuple.pair
|> Elm.Arg.item (Arg.var "first")
|> Elm.Arg.item (Arg.var "second")
|> Elm.Arg.aliasAs "myAlias"
in
Elm.fn args
(\( ( first, second ), myAlias ) ->
Elm.record
[ ( "first", first )
, ( "second", second )
, ( "myAlias", myAlias )
]
)Will generate
\((MyCustomType first second) as myAlias) ->
{ first = first
, second = second
, myAlias = myAlias
}Will generate _ to ignore an argument or pattern.
Arg.list Tuple.pair
|> Arg.item (Arg.var "first")
|> Arg.item (Arg.var "second")Will genrate
[ first, second ]And
Arg.list
(\one two remaining ->
{ one = one
, two = two
, remaining = remaining
}
)
|> Arg.item (Arg.var "first")
|> Arg.item (Arg.var "second")
|> Arg.listRemaining "remaining"Will generate
first :: second :: remainingThis is for the situation where you only know the number of arguments when you run the generator.
This isn't super common.
Let's say you have a custom type like
type MyCustomType
= MyCustomType String IntAnd you want to extract the String and Int
let
args =
Elm.Arg.customType "MyCustomType" Tuple.pair
|> Elm.Arg.item (Arg.var "first")
|> Elm.Arg.item (Arg.var "second")
in
Elm.fn args
(\( first, second ) ->
Elm.record
[ ( "first", first )
, ( "second", second )
]
)Which will generate
\(MyCustomType first second) ->
{ first = first
, second = second
}
An empty tuple
()is generally called "unit".