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:
parent
1027e21eee
commit
a9e121380b
3 changed files with 78 additions and 34 deletions
|
|
@ -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 ← {
|
|||
host‿port‿width‿height‿example ← •args
|
||||
|
||||
example ⇐
|
||||
addr ⇐ host⋈•ParseFloat port
|
||||
dim ⇐ •ParseFloat¨ width‿height
|
||||
cfg ⇐ ⟨host⟩∾•ParseFloat¨ port‿width‿height
|
||||
}
|
||||
|
||||
action ← examples (⊏⊸(⊑∘⊐) ⊑ ⊏˜⟜1)⟜< opts.example
|
||||
|
||||
flip ← opts.addr MakeFlipdot opts.dim
|
||||
Action flip
|
||||
opts.cfg WithFlipdot action
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue