::  Parse CSV files with a known schema, then perform queries on the
::  results.
::
|%
++  text
  %+  cook
    |=  =tape
    (crip tape)
  ;~  pose
    (cook tape soil:vast)
    non-quote-text
  ==
::
++  non-quote-text
  (star ;~(less com qit))
::
++  parse
  |*  cols=(list rule)
  %+  ifix
    :-  ;~(sfix ;~(less (just `@`10) (star prn)) (just `@`10))
    (just `@`10)
  (more (just `@`10) (parse-line cols))
::
++  parse-line
  |*  cols=(list rule)
  ?~  cols
    (easy ~)
  ?~  t.cols
    i.cols
  ;~  plug
      i.cols
      ;~(pfix com $(cols t.cols))
  ==
::
::  inner join
::
++  join
  =/  name-side  (ream '[left=- right=+]')
  |=  [left=(list vase) rite=(list vase) =hoon]
  ^-  (list vase)
  |-  ^-  (list vase)
  =*  left-loop  $
  ?~  left
    ~
  =/  rote  rite
  |-  ^-  (list vase)
  =*  rite-loop  $
  ?~  rite
    left-loop(left t.left, rite rote)
  =/  slopped-row  (slap (slop i.left i.rite) name-side)
  =/  val  (slap (slop slopped-row !>(..zuse)) hoon)
  ?.  =(%& q.val)
    rite-loop(rite t.rite)
  :-  slopped-row
  rite-loop(rite t.rite)
::
::  filter
::
++  where
  |=  [rows=(list vase) =hoon]
  ^-  (list vase)
  %+  skim  rows
  |=  =vase
  =/  val  (slap vase hoon)
  =(%& q.val)
::
::  select
::
++  select
  |=  [=hoon rows=(list vase)]
  ^-  (list vase)
  %+  turn  rows
  |=  =vase
  (slap (slop vase !>(..zuse)) hoon)
::
::  pretty-print rows
::
++  print-rows
  |=  rows=(list vase)
  (slog (turn rows sell))
--