Debug.log in Elm Pipes
There aren't many functions in the standard lib for elm that create side effects. Elm's Debug.log
is one of those exceptions. It logs to the console. Here's how it's setup to make console logging whilst piping easier that patting your head whilst rubbing your tummy.
The signature of Debug.log
The coolest thing about Debug.log
is its type signature:
String -> a -> a
The first parameter is String
and traditionally takes some label to identify what you're printing in the log.
The 2nd parameter is a
, meaning it can be generically anything. It's worth noticing that a
as the 2nd parameter is required. This means you'll have to print a value there whether you want to or not. Otherwise, you won't be fully applying the Debug.log
function.
The coolest part is that a
is also returned. This helps with piping because you can just insert Debug.log
in your pipe chain.
Logging in Elm
Here's a little example. In this encode
function there are several pipes. There are two helper functions, keyIndex
and keyValue
that return values that I'd like to investigate. After each of those values are returned in the pipe chain, a Debug.log
is inserted next in the chain with the associated "indexes" or "values" label for log clarity.
encode : String -> String
encode phrase =
phrase
|> String.toLower
|> String.split ""
|> List.map (\l -> l |> keyIndex)
|> Debug.log "indexes"
|> List.map (\i -> -1 * i)
|> List.map keyValue
|> Debug.log "values"
|> String.join ""
The resulting log for a test run of this code is:
indexes: [24,4,18]
values: ["b","v","h"]
This can be super nice when you're not in a live debug-ready environment. What are some other ways to gain insight into your code for debugging that you use?