::  App  construction utilities
::
::::  /hoon/sh-utils/lib
  ::
|%
++  append
  |*  a=*
  |*  b=*
  [b a]
::
++  hapt  (pair ship path)
--
!:
::::
  ::
|%
++  args-done  |*(ref=_,[(list) ^] (add-exit (add-nice ref)))  ::  accept args
::
++  add-exit                          ::  add "kill self" kiss
  |*  ref=_,[(list) ^]
  %+  add-resp  [%pass / %g %cide %$]
  ref
::
++  add-nice                          ::  return "succcess" response
  |*  ref=_,[(list) ^]
  %+  add-resp  [%give %nice ~]
  ref
::
++  add-subs                          ::  add gall subscription
  |*  [hat=[hapt ship path] ref=_,[(list) ^]]
  (add-resp [%pass /show %g %show hat] ref)
::
++  args-into-gate                    ::  poke--args from gate: output and exit
  |*  [con=[* [hide *] *] gat=_,[@ *]]
  %-  args-done
  %^  gate-outs  con
    |=(a=_+<.gat [%rush (gat a)])
  ,_`con
::
++  args-into-resp                    ::  compute gifts with gate and exit
  |*  [con=[* [hide *] *] gat=_,(pole ,[@ *])]
  %-  args-done
  |*  [ost=bone * arg=_+<.gat]
  :_  con
  %.  (gat arg)
  |*  a=(pole ,[@ *])
  ?~  a  ~ 
  a(- [ost %give -.a], + $(a +.a))
::
++  add-output                        ::  send gift to /out
  |*  [con=[* [hide *] *] ote=[@ *] ref=_,[(list) ^]]
  =>  .(+<- `[* [hid=hide *] *]`con)
  =+  sus=(~(tap in `(set bone)`(~(get ju pus.hid) /out)))
  =+  mof=(turn sus (append [%give ote]))
  |=  _+<.ref
  =+  neu=(ref +<)
  neu(- (welp mof -.neu))
::
++  add-resp                          ::  add response move to requesting bone
  |*  [mof=[@ @ *] ref=_,[(list) ^]]
  |*  [ost=bone _?@(+<.ref ~ +<+.ref)]
  =+  neu=(ref +<)
  neu(- [[ost mof] -.neu])
::
++  gate-give                         ::  respond with computed gift
  |*  [gat=_,[@ *] ref=_,[(list) ^]]
  (gate-move |*(_+<.gat [%give (gat +<)]) ref)
::
++  gate-bang                         ::  respond with computed note
  |*  [gat=_,[@ @ *] ref=_,[(list) ^]]
  (gate-move |*(_+<.gat [%pass /bang (gat +<)]) ref)
::
++  gate-mess                         ::  respond with local message
  |*  [con=[* [hide *] *] gat=_,[@ @ *] ref=_,[(list) ^]]
  =>  .(+<- `[* [hid=hide *] *]`con)
  %-  gate-move  :_  ref
  |*  _+<.gat
  =+  `[imp=path mez=cage]`(gat +<)
  [%pass /poke %g %mess [our.hid imp] our.hid mez]
::
++  gate-move                         ::  respond with computed move
  |*  [gat=_,(mold) ref=_,[(list) ^]]
  |*  [ost=bone * arg=_+<.gat]
  ((add-resp (gat arg) ref) +<)
::
::
++  gate-outs                         ::  send computed gift to /out
  |*  [con=[* [hide *] *] gat=_,[@ *] ref=_,[(list) ^]]
  |*  [ost=bone * arg=_+<.gat]
  ((add-output con (gat arg) ref) +<)
::
++  listen-in                         ::  recieve standard input
  |*  [con=[* [hide *] *] ref=_,[(list) ^]]
  =>  .(+<- `[* [hid=hide *] *]`con)
  (add-subs [[our +.imp] our /in/[-.imp]]:hid ref)
::
++  print
  |*  [con=[* [hide *] *] tap=tape]
  (add-output con [%rush %tang [%leaf tap] ~] ,_[~ con])
::
++  verify                            ::  type-check with context and move
  |*  [con=^ mof=[@ *]]
  |*  ref=_,[(list ,_mof) _con]
  |*  _+<.ref
  ^-  [(list ,_mof) _con]
  (ref +<)
--