class Monad m => MonadThrow m where
throwM :: Exception e => e -> m a
class MonadThrow m => MonadCatch m where
catch :: Exception e => m a -> (e -> m a) -> m a
class Monad m => MonadFail m where
fail :: String -> m a
module Model.Step exposing (..)
…
get : Step -> { soak : a, dev : a, stop : a, fix : a, rinse : a, wet : a } -> a
get step =case step of
Soak ->.soak
Dev ->.dev
Stop ->.stop
…
set : Step -> a -> { soak : a, dev : a, stop : a, fix : a, rinse : a, wet : a } -> { soak : a, dev : a, stop : a, fix : a, rinse : a, wet : a }
set step value record =case step of
Soak -> { record | soak = value }
Dev -> { record | dev = value }
Stop -> { record | stop = value }
…
これで下記のようにアクセスできます。
timeSpans |> get step
timeSpans |> set step value
これで don't repeat yourself にのっとって処理をまとめることができます。
Msg と update の分割
Msg と update の分割のしかたは対応させています。
-- Msg.elmtype Msg
= Drawer Visible
| SelectRecipe Recipe
| GoRun
…
-- Main.elm
update : Msg -> Model Msg -> ( Model Msg, Cmd Msg )
update msg model =case msg of
Msg.Drawer visible -> Update.drawer visible model
Msg.SelectRecipe recipe -> Update.selectRecipe recipe model
Msg.GoRun -> Update.goRun model
…
ビルドタスクは GNU Make で管理しているのですが Parcel を使用しているにもかかわらず上記事情のため elm-mdc の面倒も見ているので少々複雑になっています。
多言語テキスト
Text モジュールでは下記の型の値を列挙しています。といっても今のところ日本語のみですが。
type alias Text = Language -> String
モジュール依存関係
モジュールの依存関係を下図に示します。Text は図から省略しています。
Text は他のいずれにも依存しません。Model グループは Text にのみ依存します。黄色で Model や Msg を囲っているものは単に矢印の数を削減するためのもので、黄色枠への矢印もしくは黄色枠からの矢印はその中の1個以上への矢印もしくはその中の1個以上からの矢印と読んでください。Msg は Model と Text にのみ依存します。他に特記すべきは Port は Cmd と Sub のみから依存され必ずラップされたものが他から参照されます。
Firebase
サーバーは自前で書くつもりだったのですが Firebase をさわってみたら認証とストレージだけで十分だったのでサーバーは自前では立てないことになりました。local storage を使ってスタンドアローンで動くところまで作っていましたが Firestore がオフラインの面倒も見てくれるので local storage の実装は消しました。
先に書いたように Elm のライブラリーは Elm のみに限定されるので、必然的に JavaScript に依存する Firebase のラッパーライブラリーはありません。とはいえ書くのはグルーコードなので大した問題ではありません。
クレジットページ
頒布をともなう場合、多くのオープンソースライセンスはコピーライト表記とライセンス表記を求めます。なのでクレジットページを作成しました。これは自動生成されるようにしています。NPM License Checker と Elm License Checker を使用して生成しています。Elm License Checker はなかったので作りました。(Elm License Checker は PureScript 製です。作成時 Elm で CLI を作れることを知らなかったので。)