zoon.hoon 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. :: /lib/zoon: vendored types from hoon.hoon
  2. /= z /common/zeke
  3. |%
  4. ::
  5. +| %map
  6. ++ z-map
  7. |$ [key value] :: table
  8. $| (tree (pair key value))
  9. |=(a=(tree (pair)) ?:(=(~ a) & ~(apt z-by a)))
  10. ::
  11. ++ z-by :: z-map engine
  12. =| a=(tree (pair)) :: (z-map)
  13. |@
  14. ++ all :: logical AND
  15. |* b=$-(* ?)
  16. |- ^- ?
  17. ?~ a
  18. &
  19. ?&((b q.n.a) $(a l.a) $(a r.a))
  20. ::
  21. ++ any :: logical OR
  22. |* b=$-(* ?)
  23. |- ^- ?
  24. ?~ a
  25. |
  26. ?|((b q.n.a) $(a l.a) $(a r.a))
  27. ::
  28. ++ bif :: splits a z-by b
  29. |* b=*
  30. |- ^+ [l=a r=a]
  31. ?~ a
  32. [~ ~]
  33. ?: =(b p.n.a)
  34. +.a
  35. ?: (gor-tip b p.n.a)
  36. =+ d=$(a l.a)
  37. ?> ?=(^ d)
  38. [l.d a(l r.d)]
  39. =+ d=$(a r.a)
  40. ?> ?=(^ d)
  41. [a(r l.d) r.d]
  42. ::
  43. ++ del :: delete at key b
  44. |* b=*
  45. |- ^+ a
  46. ?~ a
  47. ~
  48. ?. =(b p.n.a)
  49. ?: (gor-tip b p.n.a)
  50. a(l $(a l.a))
  51. a(r $(a r.a))
  52. |- ^- [$?(~ _a)]
  53. ?~ l.a r.a
  54. ?~ r.a l.a
  55. ?: (mor-tip p.n.l.a p.n.r.a)
  56. l.a(r $(l.a r.l.a))
  57. r.a(l $(r.a l.r.a))
  58. ::
  59. ++ dif :: difference
  60. |* b=_a
  61. |- ^+ a
  62. ?~ b
  63. a
  64. =+ c=(bif p.n.b)
  65. ?> ?=(^ c)
  66. =+ d=$(a l.c, b l.b)
  67. =+ e=$(a r.c, b r.b)
  68. |- ^- [$?(~ _a)]
  69. ?~ d e
  70. ?~ e d
  71. ?: (mor-tip p.n.d p.n.e)
  72. d(r $(d r.d))
  73. e(l $(e l.e))
  74. ::
  75. ++ dig :: axis of b key
  76. |= b=*
  77. =+ c=1
  78. |- ^- (unit @)
  79. ?~ a ~
  80. ?: =(b p.n.a) [~ u=(peg c 2)]
  81. ?: (gor-tip b p.n.a)
  82. $(a l.a, c (peg c 6))
  83. $(a r.a, c (peg c 7))
  84. ::
  85. ++ apt :: check correctness
  86. =< $
  87. =| [l=(unit) r=(unit)]
  88. |. ^- ?
  89. ?~ a &
  90. ?& ?~(l & &((gor-tip p.n.a u.l) !=(p.n.a u.l)))
  91. ?~(r & &((gor-tip u.r p.n.a) !=(u.r p.n.a)))
  92. ?~ l.a &
  93. &((mor-tip p.n.a p.n.l.a) !=(p.n.a p.n.l.a) $(a l.a, l `p.n.a))
  94. ?~ r.a &
  95. &((mor-tip p.n.a p.n.r.a) !=(p.n.a p.n.r.a) $(a r.a, r `p.n.a))
  96. ==
  97. ::
  98. ++ gas :: concatenate
  99. |* b=(list [p=* q=*])
  100. => .(b `(list _?>(?=(^ a) n.a))`b)
  101. |- ^+ a
  102. ?~ b
  103. a
  104. $(b t.b, a (put p.i.b q.i.b))
  105. ::
  106. ++ get :: grab value z-by key
  107. |* b=*
  108. => .(b `_?>(?=(^ a) p.n.a)`b)
  109. |- ^- (unit _?>(?=(^ a) q.n.a))
  110. ?~ a
  111. ~
  112. ?: =(b p.n.a)
  113. (some q.n.a)
  114. ?: (gor-tip b p.n.a)
  115. $(a l.a)
  116. $(a r.a)
  117. ::
  118. ++ got :: need value z-by key
  119. |* b=*
  120. (need (get b))
  121. ::
  122. ++ gut :: fall value z-by key
  123. |* [b=* c=*]
  124. (fall (get b) c)
  125. ::
  126. ++ has :: key existence check
  127. |* b=*
  128. !=(~ (get b))
  129. ::
  130. ++ int :: intersection
  131. |* b=_a
  132. |- ^+ a
  133. ?~ b
  134. ~
  135. ?~ a
  136. ~
  137. ?: (mor-tip p.n.a p.n.b)
  138. ?: =(p.n.b p.n.a)
  139. b(l $(a l.a, b l.b), r $(a r.a, b r.b))
  140. ?: (gor-tip p.n.b p.n.a)
  141. %- uni(a $(a l.a, r.b ~)) $(b r.b)
  142. %- uni(a $(a r.a, l.b ~)) $(b l.b)
  143. ?: =(p.n.a p.n.b)
  144. b(l $(b l.b, a l.a), r $(b r.b, a r.a))
  145. ?: (gor-tip p.n.a p.n.b)
  146. %- uni(a $(b l.b, r.a ~)) $(a r.a)
  147. %- uni(a $(b r.b, l.a ~)) $(a l.a)
  148. ::
  149. ++ jab
  150. |* [key=_?>(?=(^ a) p.n.a) fun=$-(_?>(?=(^ a) q.n.a) _?>(?=(^ a) q.n.a))]
  151. ^+ a
  152. ::
  153. ?~ a !!
  154. ::
  155. ?: =(key p.n.a)
  156. a(q.n (fun q.n.a))
  157. ::
  158. ?: (gor-tip key p.n.a)
  159. a(l $(a l.a))
  160. ::
  161. a(r $(a r.a))
  162. ::
  163. ++ mar :: add with validation
  164. |* [b=* c=(unit *)]
  165. ?~ c
  166. (del b)
  167. (put b u.c)
  168. ::
  169. ++ put :: adds key-value pair
  170. |* [b=* c=*]
  171. |- ^+ a
  172. ?~ a
  173. [[b c] ~ ~]
  174. ?: =(b p.n.a)
  175. ?: =(c q.n.a)
  176. a
  177. a(n [b c])
  178. ?: (gor-tip b p.n.a)
  179. =+ d=$(a l.a)
  180. ?> ?=(^ d)
  181. ?: (mor-tip p.n.a p.n.d)
  182. a(l d)
  183. d(r a(l r.d))
  184. =+ d=$(a r.a)
  185. ?> ?=(^ d)
  186. ?: (mor-tip p.n.a p.n.d)
  187. a(r d)
  188. d(l a(r l.d))
  189. ::
  190. ++ rep :: reduce to product
  191. |* b=_=>(~ |=([* *] +<+))
  192. |-
  193. ?~ a +<+.b
  194. $(a r.a, +<+.b $(a l.a, +<+.b (b n.a +<+.b)))
  195. ::
  196. ++ rib :: transform + product
  197. |* [b=* c=gate]
  198. |- ^+ [b a]
  199. ?~ a [b ~]
  200. =+ d=(c n.a b)
  201. =. n.a +.d
  202. =+ e=$(a l.a, b -.d)
  203. =+ f=$(a r.a, b -.e)
  204. [-.f a(l +.e, r +.f)]
  205. ::
  206. ++ run :: apply gate to values
  207. |* b=gate
  208. |-
  209. ?~ a a
  210. [n=[p=p.n.a q=(b q.n.a)] l=$(a l.a) r=$(a r.a)]
  211. ::
  212. ++ tap :: listify pairs
  213. =< $
  214. =+ b=`(list _?>(?=(^ a) n.a))`~
  215. |. ^+ b
  216. ?~ a
  217. b
  218. $(a r.a, b [n.a $(a l.a)])
  219. ::
  220. ++ uni :: union, merge
  221. |* b=_a
  222. |- ^+ a
  223. ?~ b
  224. a
  225. ?~ a
  226. b
  227. ?: =(p.n.b p.n.a)
  228. b(l $(a l.a, b l.b), r $(a r.a, b r.b))
  229. ?: (mor-tip p.n.a p.n.b)
  230. ?: (gor-tip p.n.b p.n.a)
  231. $(l.a $(a l.a, r.b ~), b r.b)
  232. $(r.a $(a r.a, l.b ~), b l.b)
  233. ?: (gor-tip p.n.a p.n.b)
  234. $(l.b $(b l.b, r.a ~), a r.a)
  235. $(r.b $(b r.b, l.a ~), a l.a)
  236. ::
  237. ++ uno :: general union
  238. |* b=_a
  239. |* meg=$-([* * *] *)
  240. |- ^+ a
  241. ?~ b
  242. a
  243. ?~ a
  244. b
  245. ?: =(p.n.b p.n.a)
  246. :+ [p.n.a `_?>(?=(^ a) q.n.a)`(meg p.n.a q.n.a q.n.b)]
  247. $(b l.b, a l.a)
  248. $(b r.b, a r.a)
  249. ?: (mor-tip p.n.a p.n.b)
  250. ?: (gor-tip p.n.b p.n.a)
  251. $(l.a $(a l.a, r.b ~), b r.b)
  252. $(r.a $(a r.a, l.b ~), b l.b)
  253. ?: (gor-tip p.n.a p.n.b)
  254. $(l.b $(b l.b, r.a ~), a r.a)
  255. $(r.b $(b r.b, l.a ~), a l.a)
  256. ::
  257. ++ urn :: apply gate to nodes
  258. |* b=$-([* *] *)
  259. |-
  260. ?~ a ~
  261. a(n n.a(q (b p.n.a q.n.a)), l $(a l.a), r $(a r.a))
  262. ::
  263. ++ wyt :: depth of z-map
  264. =< $
  265. |. ^- @
  266. ?~(a 0 +((add $(a l.a) $(a r.a))))
  267. ::
  268. ++ key :: z-set of keys
  269. =< $
  270. =+ b=`(z-set _?>(?=(^ a) p.n.a))`~
  271. |. ^+ b
  272. ?~ a b
  273. $(a r.a, b $(a l.a, b (~(put z-in b) p.n.a)))
  274. ::
  275. ++ val :: list of vals
  276. =+ b=`(list _?>(?=(^ a) q.n.a))`~
  277. |- ^+ b
  278. ?~ a b
  279. $(a r.a, b [q.n.a $(a l.a)])
  280. --
  281. +| %set
  282. ++ z-set
  283. |$ [item] :: z-set
  284. $| (tree item)
  285. |=(a=(tree) ?:(=(~ a) & ~(apt z-in a)))
  286. ::
  287. ++ z-in :: z-set engine
  288. =| a=(tree) :: (z-set)
  289. |@
  290. ++ all :: logical AND
  291. |* b=$-(* ?)
  292. |- ^- ?
  293. ?~ a
  294. &
  295. ?&((b n.a) $(a l.a) $(a r.a))
  296. ::
  297. ++ any :: logical OR
  298. |* b=$-(* ?)
  299. |- ^- ?
  300. ?~ a
  301. |
  302. ?|((b n.a) $(a l.a) $(a r.a))
  303. ::
  304. ++ apt :: check correctness
  305. =< $
  306. =| [l=(unit) r=(unit)]
  307. |. ^- ?
  308. ?~ a &
  309. ?& ?~(l & &((gor-tip n.a u.l) !=(n.a u.l)))
  310. ?~(r & &((gor-tip u.r n.a) !=(u.r n.a)))
  311. ?~(l.a & ?&((mor-tip n.a n.l.a) !=(n.a n.l.a) $(a l.a, l `n.a)))
  312. ?~(r.a & ?&((mor-tip n.a n.r.a) !=(n.a n.r.a) $(a r.a, r `n.a)))
  313. ==
  314. ::
  315. ++ bif :: splits a by b
  316. |* b=*
  317. ^+ [l=a r=a]
  318. =< +
  319. |- ^+ a
  320. ?~ a
  321. [b ~ ~]
  322. ?: =(b n.a)
  323. a
  324. ?: (gor-tip b n.a)
  325. =+ c=$(a l.a)
  326. ?> ?=(^ c)
  327. c(r a(l r.c))
  328. =+ c=$(a r.a)
  329. ?> ?=(^ c)
  330. c(l a(r l.c))
  331. ::
  332. ++ del :: b without any a
  333. |* b=*
  334. |- ^+ a
  335. ?~ a
  336. ~
  337. ?. =(b n.a)
  338. ?: (gor-tip b n.a)
  339. a(l $(a l.a))
  340. a(r $(a r.a))
  341. |- ^- [$?(~ _a)]
  342. ?~ l.a r.a
  343. ?~ r.a l.a
  344. ?: (mor-tip n.l.a n.r.a)
  345. l.a(r $(l.a r.l.a))
  346. r.a(l $(r.a l.r.a))
  347. ::
  348. ++ dif :: difference
  349. |* b=_a
  350. |- ^+ a
  351. ?~ b
  352. a
  353. =+ c=(bif n.b)
  354. ?> ?=(^ c)
  355. =+ d=$(a l.c, b l.b)
  356. =+ e=$(a r.c, b r.b)
  357. |- ^- [$?(~ _a)]
  358. ?~ d e
  359. ?~ e d
  360. ?: (mor-tip n.d n.e)
  361. d(r $(d r.d))
  362. e(l $(e l.e))
  363. ::
  364. ++ dig :: axis of a z-in b
  365. |= b=*
  366. =+ c=1
  367. |- ^- (unit @)
  368. ?~ a ~
  369. ?: =(b n.a) [~ u=(peg c 2)]
  370. ?: (gor-tip b n.a)
  371. $(a l.a, c (peg c 6))
  372. $(a r.a, c (peg c 7))
  373. ::
  374. ++ gas :: concatenate
  375. |= b=(list _?>(?=(^ a) n.a))
  376. |- ^+ a
  377. ?~ b
  378. a
  379. $(b t.b, a (put i.b))
  380. :: +has: does :b exist z-in :a?
  381. ::
  382. ++ has
  383. |* b=*
  384. ^- ?
  385. :: wrap extracted item type z-in a unit because bunting fails
  386. ::
  387. :: If we used the real item type of _?^(a n.a !!) as the sample type,
  388. :: then hoon would bunt it to create the default sample for the gate.
  389. ::
  390. :: However, bunting that expression fails if :a is ~. If we wrap it
  391. :: z-in a unit, the bunted unit doesn't include the bunted item type.
  392. ::
  393. :: This way we can ensure type safety of :b without needing to perform
  394. :: this failing bunt. It's a hack.
  395. ::
  396. %. [~ b]
  397. |= b=(unit _?>(?=(^ a) n.a))
  398. => .(b ?>(?=(^ b) u.b))
  399. |- ^- ?
  400. ?~ a
  401. |
  402. ?: =(b n.a)
  403. &
  404. ?: (gor-tip b n.a)
  405. $(a l.a)
  406. $(a r.a)
  407. ::
  408. ++ int :: intersection
  409. |* b=_a
  410. |- ^+ a
  411. ?~ b
  412. ~
  413. ?~ a
  414. ~
  415. ?. (mor-tip n.a n.b)
  416. $(a b, b a)
  417. ?: =(n.b n.a)
  418. a(l $(a l.a, b l.b), r $(a r.a, b r.b))
  419. ?: (gor-tip n.b n.a)
  420. %- uni(a $(a l.a, r.b ~)) $(b r.b)
  421. %- uni(a $(a r.a, l.b ~)) $(b l.b)
  422. ::
  423. ++ put :: puts b z-in a, sorted
  424. |* b=*
  425. |- ^+ a
  426. ?~ a
  427. [b ~ ~]
  428. ?: =(b n.a)
  429. a
  430. ?: (gor-tip b n.a)
  431. =+ c=$(a l.a)
  432. ?> ?=(^ c)
  433. ?: (mor-tip n.a n.c)
  434. a(l c)
  435. c(r a(l r.c))
  436. =+ c=$(a r.a)
  437. ?> ?=(^ c)
  438. ?: (mor-tip n.a n.c)
  439. a(r c)
  440. c(l a(r l.c))
  441. ::
  442. ++ rep :: reduce to product
  443. |* b=_=>(~ |=([* *] +<+))
  444. |-
  445. ?~ a +<+.b
  446. $(a r.a, +<+.b $(a l.a, +<+.b (b n.a +<+.b)))
  447. ::
  448. ++ run :: apply gate to values
  449. |* b=gate
  450. =+ c=`(z-set _?>(?=(^ a) (b n.a)))`~
  451. |- ?~ a c
  452. =. c (~(put z-in c) (b n.a))
  453. =. c $(a l.a, c c)
  454. $(a r.a, c c)
  455. ::
  456. ++ tap :: convert to list
  457. =< $
  458. =+ b=`(list _?>(?=(^ a) n.a))`~
  459. |. ^+ b
  460. ?~ a
  461. b
  462. $(a r.a, b [n.a $(a l.a)])
  463. ::
  464. ++ uni :: union
  465. |* b=_a
  466. ?: =(a b) a
  467. |- ^+ a
  468. ?~ b
  469. a
  470. ?~ a
  471. b
  472. ?: =(n.b n.a)
  473. b(l $(a l.a, b l.b), r $(a r.a, b r.b))
  474. ?: (mor-tip n.a n.b)
  475. ?: (gor-tip n.b n.a)
  476. $(l.a $(a l.a, r.b ~), b r.b)
  477. $(r.a $(a r.a, l.b ~), b l.b)
  478. ?: (gor-tip n.a n.b)
  479. $(l.b $(b l.b, r.a ~), a r.a)
  480. $(r.b $(b r.b, l.a ~), a l.a)
  481. ::
  482. ++ wyt :: size of z-set
  483. =< $
  484. |. ^- @
  485. ?~(a 0 +((add $(a l.a) $(a r.a))))
  486. --
  487. +| %mip
  488. ::
  489. ++ z-mip :: map of maps
  490. |$ [kex key value]
  491. (z-map kex (z-map key value))
  492. ::
  493. ++ z-bi :: mip engine
  494. =| a=(z-map * (z-map))
  495. |@
  496. ++ del
  497. |* [b=* c=*]
  498. =+ d=(~(gut z-by a) b ~)
  499. =+ e=(~(del z-by d) c)
  500. ?~ e
  501. (~(del z-by a) b)
  502. (~(put z-by a) b e)
  503. ::
  504. ++ get
  505. |* [b=* c=*]
  506. => .(b `_?>(?=(^ a) p.n.a)`b, c `_?>(?=(^ a) ?>(?=(^ q.n.a) p.n.q.n.a))`c)
  507. ^- (unit _?>(?=(^ a) ?>(?=(^ q.n.a) q.n.q.n.a)))
  508. (~(get z-by (~(gut z-by a) b ~)) c)
  509. ::
  510. ++ got
  511. |* [b=* c=*]
  512. (need (get b c))
  513. ::
  514. ++ gut
  515. |* [b=* c=* d=*]
  516. (~(gut z-by (~(gut z-by a) b ~)) c d)
  517. ::
  518. ++ has
  519. |* [b=* c=*]
  520. !=(~ (get b c))
  521. ::
  522. ++ key
  523. |* b=*
  524. ~(key z-by (~(gut z-by a) b ~))
  525. ::
  526. ++ put
  527. |* [b=* c=* d=*]
  528. %+ ~(put z-by a) b
  529. %. [c d]
  530. %~ put z-by
  531. (~(gut z-by a) b ~)
  532. ::
  533. ++ tap
  534. ::NOTE naive turn-based implementation find-errors ):
  535. =< $
  536. =+ b=`_?>(?=(^ a) *(list [x=_p.n.a _?>(?=(^ q.n.a) [y=p v=q]:n.q.n.a)]))`~
  537. |. ^+ b
  538. ?~ a
  539. b
  540. $(a r.a, b (welp (turn ~(tap z-by q.n.a) (lead p.n.a)) $(a l.a)))
  541. --
  542. ::
  543. +| %jug
  544. ::
  545. ++ z-jug
  546. |$ [key value]
  547. (z-map key (z-set value))
  548. ::
  549. ++ z-ju :: z-jug engine
  550. =| a=(tree (pair * (tree))) :: (z-jug)
  551. |@
  552. ++ del :: del key-set pair
  553. |* [b=* c=*]
  554. ^+ a
  555. =+ d=(get b)
  556. =+ e=(~(del z-in d) c)
  557. ?~ e
  558. (~(del z-by a) b)
  559. (~(put z-by a) b e)
  560. ::
  561. ++ gas :: concatenate
  562. |* b=(list [p=* q=*])
  563. => .(b `(list _?>(?=([[* ^] ^] a) [p=p q=n.q]:n.a))`b)
  564. |- ^+ a
  565. ?~ b
  566. a
  567. $(b t.b, a (put p.i.b q.i.b))
  568. ::
  569. ++ get :: gets z-set by key
  570. |* b=*
  571. =+ c=(~(get z-by a) b)
  572. ?~(c ~ u.c)
  573. ::
  574. ++ has :: existence check
  575. |* [b=* c=*]
  576. ^- ?
  577. (~(has z-in (get b)) c)
  578. ::
  579. ++ put :: add key-z-set pair
  580. |* [b=* c=*]
  581. ^+ a
  582. =+ d=(get b)
  583. (~(put z-by a) b (~(put z-in d) c))
  584. --
  585. ::
  586. +| %ordering
  587. :: +dor-tip: depth order.
  588. ::
  589. :: Orders z-in ascending tree depth.
  590. ::
  591. ++ dor-tip
  592. |= [a=* b=*]
  593. ^- ?
  594. ?: =(a b) &
  595. ?. ?=(@ a)
  596. ?: ?=(@ b) |
  597. ?: =(-.a -.b)
  598. $(a +.a, b +.b)
  599. $(a -.a, b -.b)
  600. ?. ?=(@ b) &
  601. (lth a b)
  602. :: +gor-tip: tip order.
  603. ::
  604. :: Orders z-in ascending +tip hash order, collisions fall back to +dor.
  605. ::
  606. ++ gor-tip
  607. |= [a=* b=*]
  608. ^- ?
  609. =+ [c=(tip a) d=(tip b)]
  610. ?: =(c d)
  611. (dor-tip a b)
  612. (lth-tip c d)
  613. :: +mor-tip: mor tip order.
  614. ::
  615. :: Orders z-in ascending double +tip hash order, collisions fall back to +dor.
  616. ::
  617. ++ mor-tip
  618. |= [a=* b=*]
  619. ^- ?
  620. =+ [c=(double-tip a) d=(double-tip b)]
  621. ?: =(c d)
  622. (dor-tip a b)
  623. (lth-tip c d)
  624. ::
  625. ++ tip
  626. |= a=*
  627. ^- noun-digest:tip5:z
  628. (hash-noun-varlen:tip5:z a)
  629. ::
  630. ++ double-tip
  631. |= a=*
  632. ^- noun-digest:tip5:z
  633. =/ one (tip a)
  634. (hash-ten-cell:tip5:z one one)
  635. ::
  636. ++ lth-tip
  637. |= [a=noun-digest:tip5:z b=noun-digest:tip5:z]
  638. %+ lth
  639. (digest-to-atom:tip5:z a)
  640. (digest-to-atom:tip5:z b)
  641. ::
  642. +| %z-container-from-container
  643. ++ z-silt :: z-set from list
  644. |* a=(list)
  645. =+ b=*(tree _?>(?=(^ a) i.a))
  646. (~(gas z-in b) a)
  647. ::
  648. ++ z-molt :: z-map from pair
  649. |* a=(list (pair))
  650. (~(gas z-by `(tree [p=_p.i.-.a q=_q.i.-.a])`~) a)
  651. ::
  652. ++ z-malt :: z-map from list
  653. |* a=(list)
  654. (z-molt `(list [p=_-<.a q=_->.a])`a)
  655. --