<div dir="ltr">Hi Heinrich (and other helpful souls),<div><br></div><div>Thanks for the replies. I started out this response with an attempt to give more detail in the hope of explaining why I thought this was rather more complicated than it first appears: at least, applying a new config is expensive so idempotence isn't very helpful.</div><div><br></div><div>However, in the process of writing this I came to the conclusion that there is a rather simple, if slightly inelegant solution. I can write some code which generates the initial config and also logs what nodes in ZK were read or enumerated; by keeping this log I can watch for updates and if anything is updated then I can re-generate the whole config, compare it for equality against the previous config, and apply the new config if needs be.</div><div><br></div><div>I call this slightly inelegant because I was kind of hoping to be able to re-run just the part of the config-generation function that was downstream of the update that fired. On reflection, this seems unnecessarily frugal - these are not large configs I'm dealing with, so not worth much effort to cut out the extra computation.</div><div><br></div><div>I suppose this is in some sense a poor-man FRP? But it'll do for me and does seem rather simple.</div><div><br></div><div>Many thanks,</div><div><br></div><div>David</div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 19 August 2015 at 17:12, Heinrich Apfelmus <span dir="ltr"><<a href="mailto:apfelmus@quantentunnel.de" target="_blank">apfelmus@quantentunnel.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello David,<br>
<br>
author of the FRP library "reactive-banana"[1] here.<br>
<br>
Well, you can certainly use FRP in this context, but your situation seems so simple that I'm not sure if it's worth it here. The way I see FRP is that it helps you deal with time-varying state in a way that does not lead to spaghetti code. The fundamental insight is a semantic one, but on the practical side, FRP simplifies change propagation and reasoning about the order of changes.<br>
<br>
Your situation looks like you do not have to keep track of state, i.e. most of your operations seem to be pure or idempotent, so while FRP won't hurt it, it won't make your life significantly easier either.<br>
<br>
<br>
On the question of choosing a library, I would, of course, recommend "reactive-banana", but I may be a little biased there. :) I can also recommend "sodium" [2], which is very similar. There are also two very recent offerings, "reflex" [3] and "frpnow" [4]. I don't know much about the former. The latter has a nice theory background, but seems to be pull-based.<br>
<br>
<br>
Best regards,<br>
Heinrich Apfelmus<br>
<br>
  [1]: <a href="https://wiki.haskell.org/Reactive-banana" rel="noreferrer" target="_blank">https://wiki.haskell.org/Reactive-banana</a><br>
  [2]: <a href="https://hackage.haskell.org/package/sodium" rel="noreferrer" target="_blank">https://hackage.haskell.org/package/sodium</a><br>
  [3]: <a href="https://hackage.haskell.org/package/reflex" rel="noreferrer" target="_blank">https://hackage.haskell.org/package/reflex</a><br>
  [4]: <a href="https://hackage.haskell.org/package/frpnow" rel="noreferrer" target="_blank">https://hackage.haskell.org/package/frpnow</a><br>
<br>
--<br>
<a href="http://apfelmus.nfshost.com" rel="noreferrer" target="_blank">http://apfelmus.nfshost.com</a><br>
<br>
<br>
David Turner wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
Hi all,<br>
<br>
I am using Apache Zookeeper as a service directory: I have a bunch of<br>
services which announce their presence by making nodes in Zookeeper, so<br>
that dependent services can update their configuration to make use of the<br>
available services, and stop trying to use services that have died.<br>
<br>
Zookeeper is a pretty nice fit for this because it supports watching a node<br>
for changes, so in theory there is no need to poll Zookeeper periodically.<br>
The services that I control work with this just fine, but there are some<br>
(e.g. an Nginx reverse-proxy) that are reconfigured using the rather more<br>
common approach of updating a file (or files) and then sending the process<br>
a signal. I am currently pondering how to make this work without polling,<br>
or manually triggering a refresh script, which is how it is currently done.<br>
<br>
I've never used FRP, but am at least vaguely aware of it and from my<br>
high-level understanding it seems like this could be a very good fit. The<br>
Zookeeper state is a time-varying value which I want to convert into a<br>
time-varying set of files, ideally as declaratively as possible.<br>
<br>
So, two questions to the FRP congnoscenti out there. Firstly, is it<br>
worthwhile to attempt this using FRP at all? I'm sure I could do it by hand<br>
too. Secondly, which of the many FRP libraries would you recommend for it?<br>
There are loads on the Wiki, seemingly in various states of repair and<br>
documentation. Any pointers on how to choose one that's featureful enough,<br>
performant enough, and being actively maintained?<br>
<br>
Thanks in advance,<br>
<br>
David<br>
<br>
<br>
<br></div></div>
------------------------------------------------------------------------<span class=""><br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</span></blockquote><div class="HOEnZb"><div class="h5">
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br></div>