Elm:
Writing a text file

How to:

Since Elm runs in the browser and is designed to be a pure programming language without side effects, it does not have direct access to the file system. Thus, writing to a file typically involves sending the data out to JavaScript through ports. Here’s how you can set this up:

  1. Define a port module for sending text to JavaScript:
port module Main exposing (main)

import Browser
import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)

-- Define a port to send text data to JavaScript
port saveText : String -> Cmd msg

-- Main view
view : Html msg
view =
    div []
        [ button [ onClick (saveText "Hello, Elm writes to a file!") ] [ text "Save to File" ]
        ]

-- Subscription setup (not used in this example but required for a port module)
subscriptions : model -> Sub msg
subscriptions _ =
    Sub.none

-- Application setup
main : Program () model msg
main =
    Browser.element
        { init = \_ -> ((), Cmd.none)
        , view = \_ -> view
        , update = \_ _ -> ((), Cmd.none)
        , subscriptions = subscriptions
        }
  1. Implement the corresponding JavaScript code:

In your HTML file or a JavaScript module, handle the Elm application’s port for saving the text. You could use the FileSaver.js library for saving the file client-side or send the data to a server for processing.

// Assuming Elm.Main.init() is already called and the app is running
app.ports.saveText.subscribe(function(text) {
    // Using FileSaver.js to save files on the client side
    var blob = new Blob([text], {type: "text/plain;charset=utf-8"});
    saveAs(blob, "example.txt");
});

Sample output isn’t directly applicable since the result is the creation of a file, but after clicking the button in your Elm application, a file named “example.txt” containing the string “Hello, Elm writes to a file!” should be downloaded to your computer.

In this approach, communication between Elm and JavaScript is essential. Although Elm aims to contain as much of your application’s logic as possible, interop with JavaScript through ports enables you to perform tasks like file writing that Elm doesn’t directly support. Remember, the purity and safety of Elm are enhanced by this pattern, ensuring your Elm applications remain easy to maintain and reason about, even when they interact with the complex outside world.