[HN Gopher] Bubble Tea: fun, functional and stateful way to buil...
       ___________________________________________________________________
        
       Bubble Tea: fun, functional and stateful way to build terminal apps
        
       Author : ingve
       Score  : 196 points
       Date   : 2022-05-10 15:22 UTC (7 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | dangets wrote:
       | This and the surrounding ecosystem was recently featured on an
       | episode of The Changelog podcast.
       | https://changelog.com/podcast/481
        
         | jerodsanto wrote:
         | Thanks for sharing the show! Here's a transcript for those
         | who'd rather read:
         | 
         | https://changelog.com/podcast/481#transcript
         | 
         | And a couple audiogram snippets from the conversation:
         | 
         | https://www.youtube.com/watch?v=8-5WAKrt9GQ
         | 
         | https://www.youtube.com/watch?v=OE5LzZbojX8
        
       | cosmotic wrote:
       | Clippy: It looks like you're trying to make a GUI, would you like
       | help with that?
        
       | BaconPackets wrote:
       | We recently did a quick POC with py-cui for a TUI app. It worked
       | pretty well but you quickly see the limits.
       | 
       | This looks really interesting and could be a fun way to get into
       | the Go landscape!
        
       | nepeckman wrote:
       | I've seen the charm suite on HN before, and everytime I see them
       | I wish they had bindings to other languages. I'm just not
       | interested in Go, but I'm really interested in learning to create
       | ssh applications. Its an application runtime with a lot of
       | potential for the dev space, but almost no quick-start
       | frameworks!
        
         | kelvie wrote:
         | Why not? There's a lot to hate about every language, but one
         | advantage about Go is that it's fairly easy to context switch
         | in/out of, which makes it great for side projects, because it's
         | cognitive load while using it is really low.
         | 
         | Unlike say, Rust. I do love Rust though.
        
           | nepeckman wrote:
           | I'm only really interested in learning a language if it
           | excites me, or if I'm getting paid to do it. I don't hate Go,
           | and would be fine to learn it on company time for company
           | projects, but there is no spark that would lead me to learn
           | the language on my own. I've written some basic Go, but if
           | I'm using it in personal projects, I'd would have to invest
           | time to understand the ecosystem, runtime, standard lib, best
           | practices, etc.
        
             | pstuart wrote:
             | It's not exciting but it is pleasing. The ecosystem is
             | refining well (e.g., $GOPATH deprecated and workspaces just
             | added).
             | 
             | Now with generics there's even less to complain about.
        
       | mfarstad wrote:
       | One of my favorite TUI frameworks. I made
       | https://github.com/mathaou/termdbms with it. A very pleasant
       | experience.
        
         | throwawayboise wrote:
         | That looks pretty cool, but as most/all DBMSs come with a TUI
         | utility*, what is the advantage?
         | 
         | *(psql, sqlplus, isql, etc....)
        
         | pstuart wrote:
         | Ha, I checked it out and it was definitely worthy of a star --
         | then I noticed I'd already done so. Now I just need to get
         | around to playing with it.
        
       | shriphani wrote:
       | I've been using dialoguer [1], indicatif [2], and colour [3] for
       | the rust ecosystem. Really high quality libraries:
       | 
       | [1] https://docs.rs/dialoguer/latest/dialoguer/ [2]
       | https://github.com/console-rs/indicatif [3]
       | https://docs.rs/colour/latest/colour/
        
       | ivantse1 wrote:
       | Loved this framework as it helped me build my ssh app idea really
       | quickly (https://github.com/ivantsepp/ssh-slides)! In fact, it
       | pushed me to finally learn golang haha. Would love seeing more
       | and more ssh apps in the wild.
        
       | simulate-me wrote:
       | One thing that I like about this is the implementation of
       | returning state from the Update function. My only experience with
       | Elm-style architecture is with react / redux which involves
       | meticulously copying pieces of the state object to return two
       | distinct before / after states. Using a Go struct with copy
       | semantics makes this extremely easy and more natural to write in
       | an imperative fashion. One limitation of this is that the model
       | structure can only contain value type (e.g. no pointers, arrays,
       | or maps).
        
         | mordechai9000 wrote:
         | Just curious, I'm not familiar with Go. Will it copy the
         | references anyway, meaning both structures now have a pointer
         | to the same object? That's the way it works in other languages
         | I'm familiar with, so you have to be careful about what you
         | copy and how you use it.
        
           | kgeist wrote:
           | >Will it copy the references anyway, meaning both structures
           | now have a pointer to the same object?
           | 
           | Correct. A value copy is a simple shallow copy. Deep copy
           | requires use of reflection (if you don't want to manually
           | manage copying).
        
           | arccy wrote:
           | yes, that's what it does in go
        
           | tonyhb wrote:
           | Yes, but it doesn't actually matter. You can use pointers for
           | models, return the same pointer, and it will re-render fine.
           | We do this for our CLI at https://www.inngest.com for
           | creating new serverless functions via a quick walkthrough.
           | 
           | It's actually the `tea.Msg` that causes re-renders. Here's
           | the code: https://github.com/charmbracelet/bubbletea/blob/v0.
           | 20.0/tea.....
           | 
           | tea.Msg is, in Redux land, an "action" that triggers some
           | state updates and _always_ triggers a re-render, even if
           | nothing changes.
           | 
           | This is elm-like, but we have to understand the limitations
           | of what we're working with: a terminal with no way of
           | (nicely) updating elements in place. It's essentially an
           | immediate-mode UI, and so it always paints.
        
             | sriram_malhar wrote:
             | Well, it does matter, or rather, it could matter.
             | 
             | For example, say you needed an undo/redo mechanism. If the
             | model were guaranteed to be immutable model, you could
             | simply hang on to the previous models as a sequence of
             | state changes; undoing/redoing is trivial. If the model is
             | mutable, then the undo/redo system has to defensively make
             | a copy before update is called
        
             | christianrocha wrote:
             | Do note, however, that paints will only occur if the output
             | changes, and only lines that have changed will be redrawn.
        
         | kgeist wrote:
         | >One limitation of this is that the model structure can only
         | contain value type (e.g. no pointers, arrays, or maps)
         | 
         | How does one manage dynamically sized lists of elements, if
         | arrays are disallowed?
        
           | simulate-me wrote:
           | You can use arrays, but if you want to maintain the Elm-like
           | model of before and after states, then you need to explicitly
           | copy the array into the new state rather than rely on Go
           | copying just the pointer.
        
       | substation13 wrote:
       | This looks like a really cool project, however I have to say that
       | the Go language seems like a _terrible_ match for the Elm
       | architecture.
        
         | aarpmcgee wrote:
         | I'm not overly familiar with Go and would be curious to hear
         | more details about this.
        
       | anderspitman wrote:
       | I spent a good chunk of time last week looking for a solid cross-
       | platform GUI toolkit. I came to the conclusion that the terminal
       | is the most portable GUI platform available. You can create an
       | app that has windows, buttons, mouse support, etc, statically
       | compile it for Windows, Linux, and Mac, and run it over SSH. The
       | closest you can get to that with real graphics is using a toolkit
       | built on OpenGL, and you'll be forced to dynamically link to X11
       | or Wayland on Linux.
       | 
       | The achilles heel of terminal UIs is that they can't display
       | images.
        
         | Hamcha wrote:
         | This is so sad. Every time I boot up Plan9 for fun I'm reminded
         | their remoting solution (drawterm) does graphics just fine
         | (since everything is just files, and graphics is done by
         | writing to a software framebuffer device file).
         | 
         | Sure, it's something you can do with SSH via X11 forwarding
         | since forever, but it seems the ecosystem never quite stuck the
         | landing, and now we're here trying to figure out how to make
         | CLI more like GUI for our own sanity.
         | 
         | Maybe we should give it another shot? It seems Windows is
         | trying to do something similar with WSLg to achieve seamless
         | integration of Linux apps within Windows 11 (using RDP under
         | the hood), what is everyone else doing?
        
           | oddlama wrote:
           | I'm actually kind of glad that X11 forwarding didn't stick.
           | TUIs are generally efficiently navigatable using just the
           | keyboard, a property I very much enjoy and frequently miss in
           | "real GUI" apps.
        
         | digisign wrote:
         | They can display images, though the resolution is not very
         | high, even with sixels.
        
         | qbasic_forever wrote:
         | I'd look at Qt or Electron if you need to do cross-platform
         | desktop apps, if for no other reason than accessibility. Sure
         | you can make wacky midnight commander like GUIs in the console,
         | but no screen reader is going to be able to make heads or tails
         | of them and you'll shut out users.
        
           | cmroanirgo wrote:
           | Less modern systems have been running cross platform forever.
           | Eg Free Pascal/lazarus.
           | 
           | TUI/GUI (qt,gtk,cocoa,...) & even has pas2js
        
         | akkartik wrote:
         | Lately I'm all in on LOVE (https://love2d.org). No dynamic
         | linking required, cross-platform, less bloat than mainstream
         | toolkits. Anything it can't do I just accept as a constraint I
         | can't change.
        
         | ghosty141 wrote:
         | Disagree, there are a ton of differences, especially when it
         | comes to fancier stuff like ncurses provides for example.
         | 
         | QT and Electron are the most capable cross platform tools for
         | building UIs in my opinion. Both have their drawbacks of
         | course, QT is a pain to work with and electron is famous for
         | being not responsive enough for some users
        
         | throwawayboise wrote:
         | Almost every language has an ncurses library or module. Isn't
         | ncurses fairly cross-platform?
        
       | djmips wrote:
       | I don't like things that pollute our natural language namespace.
       | Couldn't you have named it something unique?
        
         | tsm wrote:
         | An overwhelming number of programming-related things "pollute
         | our natural language namespace". Off the top of my head:
         | 
         | Ruby, Python, Java, Rails, React, Go, Rust, Elm, Dart, C, C#,
         | Node, Next, Nest, Kafka, LaTeX, bash, fish, cat, Android,
         | Apple, Windows...
         | 
         | I'd be happy to search for this with "bubble tea framework" or
         | "bubble tea tui" or similar and it doesn't bother me.
        
           | dvngnt_ wrote:
           | elm?
        
             | kube-system wrote:
             | It's a type of tree.
        
             | fwip wrote:
             | Yes, an elm is a kind of tree.
        
           | djmips wrote:
           | All Terrible.
        
           | mrtranscendence wrote:
           | I'm having trouble thinking of a single example of a
           | language, library, or piece of technology that is not either
           | an acronym, a name of something that exists, or a combination
           | of such names. Be it an object (Flask), a concept (Scheme), a
           | letter (C), a person (Sinatra), or an animal (Python).
           | 
           | Maybe we need explicit namespacing in English? I'll start
           | saying stuff like "programming languages colon colon ruby" so
           | people can be absolutely sure what I'm talking about.
        
             | keithnz wrote:
             | erlang
        
             | hkt wrote:
             | Alas, people might get the wrong idea about what kind of
             | colon you mean.
        
         | bbkane wrote:
         | I bet you HATE the Go language name.
        
           | neltnerb wrote:
           | I myself just don't understand why any reasonable person
           | would pick an existing common word for a project in 2022
           | instead of using the plethora of name generators that can
           | give you something original without even trying.
           | 
           | But like, people that work for Google _surely_ know something
           | about search term collision. Or just don 't care about making
           | anything else that has "Go" in the query gets confusing
           | results. Which is an odd stance for Google employees, but
           | none of my business I guess.
           | 
           | Of course it's common anyway, I just don't see why you'd do
           | this to yourself. You either bury your own project, or you
           | are so successful with branding that no one can find what
           | used to have that name. Google can push something hard enough
           | with perfect SEO to make sure that Go the language shows up.
           | A github page?
           | 
           | I mean, it's not Google but:
           | https://duckduckgo.com/?t=ffab&q=go&ia=web First hit --
           | https://go.dev
           | 
           | https://duckduckgo.com/?t=ffab&q=bubble+tea&ia=places This
           | project is not anywhere near the front page and I can't
           | imagine it ever being. Too many different companies are
           | selling boba tea.
           | 
           | I never really _like_ it when companies use existing common
           | words, but unless you 're a huge project or a company that
           | can push the SEO and marketing it's actively burying your
           | work from anyone finding it.
        
           | er4hn wrote:
           | I call it "Golang". I also _hate_ the use of 1 letter
           | variables in Golang. Give me three and make it easy to search
           | for symbol names in my no-frills editor.
           | 
           | /derail.
        
           | djmips wrote:
           | I do.
        
       ___________________________________________________________________
       (page generated 2022-05-10 23:00 UTC)