/-  spider, *aquarium
/+  ph-io, strandio
=,  strand=strand:spider
|%
++  vane-handler
  $_  ^|
  |_  bowl:spider
  ++  handle-unix-effect
    |~  [ship unix-effect]
    *(quip card:agent:gall _^|(..handle-unix-effect))
  ::
  ++  handle-arvo-response
    |~  [wire sign-arvo]
    *(quip card:agent:gall _^|(..handle-unix-effect))
  --
--
::
=;  core
  |=  [effect-filter=(list term) handler=vane-handler]
  ^-  thread:spider
  |=  vase
  =/  m  (strand ,vase)
  ^-  form:m
  =*  loop  $
  ?^  effect-filter
    =/  =path  /effect/[i.effect-filter]
    ;<  ~  bind:m  (watch-our:strandio path %aqua path)
    loop(effect-filter t.effect-filter)
  ;<  ~  bind:m
    %-  (main-loop:strandio ,_handler)
    :~  handle-unix-effect:core
        handle-arvo-response:core
        pure:(strand ,vane-handler)
    ==
  (pure:m *vase)
::
|%
++  handle-unix-effect
  |=  handler=vane-handler
  =/  m  (strand ,vane-handler)
  ^-  form:m
  ;<  [her=ship =unix-effect]  bind:m
    ((handle:strandio ,[ship unix-effect]) take-unix-effect:ph-io)
  ;<  =bowl:spider             bind:m  get-bowl:strandio
  =^  cards  handler
    (~(handle-unix-effect handler bowl) her unix-effect)
  ?~  cards
    (pure:m handler)
  ::  send in next event to avoid inverting subscription flow.  real
  ::  solution is probably for gall to drip subscription updates.
  ::
  ;<  ~                        bind:m  (sleep:strandio ~s0)
  ;<  ~                        bind:m  (send-raw-cards:strandio cards)
  (pure:m handler)
::
++  handle-arvo-response
  |=  handler=vane-handler
  =/  m  (strand ,vane-handler)
  ^-  form:m
  ;<  [=wire =sign-arvo]  bind:m
    ((handle:strandio ,[wire sign-arvo]) take-sign-arvo:strandio)
  ;<  =bowl:spider        bind:m  get-bowl:strandio
  =^  cards  handler
    (~(handle-arvo-response handler bowl) wire sign-arvo)
  ;<  ~                   bind:m  (send-raw-cards:strandio cards)
  (pure:m handler)
--