/-  sole
=,  sole
|%
++  produce                                             ::  construct result
  |*  pro/*                                             ::
  [p=*(list tank) q=[%& p=[~ u=pro]]]                   ::
::                                                      ::
++  print                                               ::  add output tank
  |*  {tan/tank res/(sole-result)}                      ::
  ?@  res  res                                          ::
  [p=[i=tan t=p.res] q=q.res]                           ::
::                                                      ::
++  prompt                                              ::  construct prompt
  |*  {pom/sole-prompt mor/(sole-dialog)}               ::
  [p=*(list tank) q=[%| p=pom q=mor]]                   ::
::                                                      ::
++  curl                                                ::  fetch url
  =|  usr/knot                                          ::
  |*  {pul/_purl:eyre fun/$-(httr:eyre *)}              ::
  :-  p=*(list tank)                                    ::
  q=[%| p=`usr q=[pul %get ~ ~] r=fun]                  ::
::                                                      ::
++  no-product                                          ::  empty result
  [p=*(list tank) q=[%& ~]]                             ::
::                                                      ::
++  parse                                               ::  parse by rule
  |*  {sef/rule fun/$-(* *)}                            ::
  |=  txt/sole-input                                    ::
  =+  vex=(sef [0 0] txt)                               ::
  ?:  |(!=((lent txt) q.p.vex) ?=($~ q.vex))            ::
    q.p.vex                                             ::
  (fun p.u.q.vex)                                       ::
--