{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreiepjul5fpebi3cefzebp6tjuvdbb2qnjeooeoaneof2twqh72j4x4",
    "uri": "at://did:plc:pi6woz4d47bkuws673w2il2r/app.bsky.feed.post/3mgcsb7cq4mh2"
  },
  "path": "/t/layoutz-0-3-2-zero-dep-elm-style-tui-s-for-haskell-now-w-terminal-plots-more/13760#post_3",
  "publishedAt": "2026-03-05T07:40:52.000Z",
  "site": "https://discourse.haskell.org",
  "tags": [
    "Brick",
    "Layoutz"
  ],
  "textContent": ">   * With LLM’s, boilerplate code that formats & “pretty-prints” is _**cheaper than ever**_ …\n>   * Thus, _**more than ever**_ , “string formatting code” is spawning, and polluting domain logic\n>   * Ultimately, **layoutz** is just a tiny, declarative DSL to combat this\n>\n\n\nHow does the architecture compare to brick?\n\nTo me the entry points look quite similar.\n\nBrick:\n\n\n    data App s e n =\n        App { appDraw :: s -> [Widget n]\n            , appChooseCursor :: s -> [CursorLocation n] -> Maybe (CursorLocation n)\n            , appHandleEvent :: BrickEvent n e -> EventM n s ()\n            , appStartEvent :: EventM n s ()\n            , appAttrMap :: s -> AttrMap\n            }\n\n\n\nLayoutz:\n\n\n    data LayoutzApp state msg = LayoutzApp\n      { appInit          :: (state, Cmd msg)                 -- ^ Initial state and startup commands\n      , appUpdate        :: msg -> state -> (state, Cmd msg) -- ^ Update state with message, return new state and commands\n      , appSubscriptions :: state -> Sub msg                 -- ^ Declare event subscriptions based on current state\n      , appView          :: state -> L                       -- ^ Render state to UI\n      }\n",
  "title": "Layoutz 0.3.2 🪶 Zero-dep Elm-style TUI’s for Haskell - now w/ terminal plots & more"
}