::  print [len] %ames flows, sorted by number-per-ship
::
:-  %say
|=  [[now=@da eny=@uvJ bec=beak] arg=$@(~ [len=@ ~]) ~]
:-  %noun
::
=;  flows
  ^-  (list [=ship open=[out-open=@ out-closing=@ in=@ nax=@] corked=@])
  =/  len   ?^(arg len.arg 50)
  (scag len (sort flows |=([[@ [a=@ud *] *] @ [b=@ud *] *] (gth a b))))
::
=/  peers-map
  .^  (map ship ?(%alien %known))
      %ax  /(scot %p p.bec)//(scot %da now)/peers
  ==
=/  peers=(list ship)
  %+  murn  ~(tap by peers-map)
  |=  [=ship val=?(%alien %known)]
  ?:  =(ship p.bec)
    ~  ::  this is weird, but we saw it
  ?-  val
    %alien  ~
    %known  (some ship)
  ==
::
^-  (list [=ship open=[out-open=@ out-closing=@ in=@ nax=@] corked=@])
%+  turn  peers
|=  =ship
=+  .^  =ship-state:ames
        %ax  /(scot %p p.bec)//(scot %da now)/peers/(scot %p ship)
    ==
=/  =peer-state:ames  ?>(?=(%known -.ship-state) +.ship-state)
=/  corked  ~(wyt in corked.peer-state)
=-  [ship - corked]
::
=+  %+  roll  ~(tap in ~(key by snd.peer-state))
    |=  [b=bone [out=(list bone) in=(list bone) nax=(list bone)]]
    =/  m  (mod b 4)
    ?+  m  ~|([%odd-bone b] !!)
      %0  [[b out] in nax]
      %1  [out [b in] nax]
      %3  [out in [b nax]]
    ==
=/  [out-closing=(list bone) out-open=(list bone)]
  (skid out ~(has ^in closing.peer-state))
[(lent out-open) (lent out-closing) (lent in) (lent nax)]