feat(sterni/blipqn): reuse address and socket for multiple Sends

This is achieved by storing the resources we need to acquire for
interacting with the flipdot (socket fd and addrinfo struct) in a
`struct flipdot` that is dynamically allocated and treated as an opaque
pointer object via the BQN FFI.

To make sure these resources are released correctly, we only provide a
lisp style WithFlipdot to the user which takes care of acquiring and
releasing the `struct flipdot`. This works even if an error occurs in
the function the user provides thanks to _defer_. I'm not sure if
calling it _defer_ is right since Go's error handling works differently,
so defer really is deferred execution in a sense which doesn't really
fit what we're doing here. The closest is probably Haskell's bracket,
but that name references it's triadic nature which doesn't fit our
implementation.

Change-Id: Iff65d277a448dbe0c6ac93e816ece5ab6fa10190
Reviewed-on: https://cl.tvl.fyi/c/depot/+/13011
Reviewed-by: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
This commit is contained in:
sterni 2025-01-15 20:46:32 +01:00
parent 1027e21eee
commit a9e121380b
3 changed files with 78 additions and 34 deletions

View file

@ -1,6 +1,6 @@
#!/usr/bin/env BQN
MakeFlipdot •Import "../lib/"("bin" ((-)) •path) "blipqn.bqn"
WithFlipdot •Import "../lib/"("bin" ((-)) •path) "blipqn.bqn"
examples >
"random"{𝕩.Send 𝕩.shape •rand.Range 2},
@ -19,11 +19,9 @@ opts ← {
hostportwidthheightexample •args
example
addr host•ParseFloat port
dim •ParseFloat¨ widthheight
cfg host•ParseFloat¨ portwidthheight
}
action examples (() ˜1)< opts.example
flip opts.addr MakeFlipdot opts.dim
Action flip
opts.cfg WithFlipdot action