ilo 26.5.0

ilo - the token-minimal programming language AI agents write
Documentation
-- Harvested from persona-rerun: ecommerce-analytics.
-- Aggregates orders CSV into top-customer/top-product/revenue-by-category
-- summaries plus stats (mean/median/p95/stdev). Uses inline mset accumulator
-- form to avoid helper-fn dispatch cost. Returns "ok" after printing.

parsen s:t>n;
  r=num s;
  ?r{~v:v;^_:0.0}

negval pair:L t>n;
  - 0 (parsen (at pair 1))

main p:t>R t t;
  rows=rd! p "csv";
  body=drop 1 rows;
  n=len body;
  prnt cat ["rows: " str n] "";

  mc=mmap;
  mp=mmap;
  mg=mmap;
  rs=[];
  @row body{
    cid=at row 1;
    pid=at row 2;
    cg=at row 3;
    q=parsen (at row 4);
    pr=parsen (at row 5);
    r=*q pr;
    rs=+=rs r;
    pc=??(mget mc cid) 0;
    mc=mset mc cid (+pc r);
    pp=??(mget mp pid) 0;
    mp=mset mp pid (+pp r);
    pg=??(mget mg cg) 0;
    mg=mset mg cg (+pg r)
  };

  prnt cat ["total rev: " str (sum rs)] "";
  prnt cat ["mean order rev: " (fmt2 (avg rs) 4)] "";
  prnt cat ["median order rev: " (fmt2 (median rs) 4)] "";
  prnt cat ["p95 order rev: " (fmt2 (quantile rs 0.95) 4)] "";
  prnt cat ["stdev order rev: " (fmt2 (stdev rs) 4)] "";
  prnt cat ["distinct customers: " str len mc] "";
  prnt cat ["distinct products: " str len mp] "";
  prnt cat ["categories: " str len mg] "";

  ks=mkeys mc;
  pairs=[];
  @k ks{
    v=??(mget mc k) 0;
    pairs=+=pairs [k str v]
  };
  byval=srt negval pairs;
  top5=take 5 byval;
  prnt "top 5 customers:";
  @e top5{prnt cat [at e 0 " -> " at e 1] ""};

  prnt "revenue by category:";
  @k mkeys mg{
    v=??(mget mg k) 0;
    prnt cat [k " -> " (fmt2 v 2)] ""
  };

  ~"ok"

-- ecommerce-analytics prints a multi-line report, but the entrypoint
-- returns "ok" — the harness compares trimmed stdout, so we assert on
-- the last line via a wrapper entry that swallows the prints.

quiet p:t>R t t;
  rows=rd! p "csv";
  body=drop 1 rows;
  rs=map (row:_>n;q=parsen (at row 4);pr=parsen (at row 5);*q pr) body;
  ~fmt "rows={} total={} mean={}" (len body) (str (sum rs)) (fmt2 (avg rs) 4)

-- run: quiet examples/apps/fixtures/ecommerce-analytics-orders.csv
-- out: rows=1000 total=314500 mean=314.5000