2i: Map Logic
+by
+byMap operations.
Container arm for +map operation arms. A +map is a +set of key-value pairs. The contained arms inherit its sample +map, .a.
Accepts
.a is a +map.
Source
++ by
~/ %by
=| a=(tree (pair)) :: (map)
=* node ?>(?=(^ a) n.a)
|@Examples
> ~(. by (malt (limo ~[a+1 b+2 c+3])))
< 27.jus
[ a
?(
%~
[ n=[?(p=%a p=%b p=%c) q=@ud]
l=nlr([p=?(%a %b %c) q=@ud])
r=nlr([p=?(%a %b %c) q=@ud])
]
)
<123.zao 46.hgz 1.pnw %140>
]
>+all:by
+all:byLogical AND.
Computes the logical AND on the results of slamming every element in +map .a with $gate .b.
Accepts
.a is a +map, and is the sample of +by.
.b is a $gate.
Produces
A $flag.
Source
++ all
~/ %all
|* b=$-(* ?)
|- ^- ?
?~ a
&
?&((b q.n.a) $(a l.a) $(a r.a))Examples
> =a (malt (limo ~[a+1 b+[2 3]]))
> (~(all by a) |=(a=* ?@(a & |)))
%.n> =a (malt (limo ~[a+1 b+2 c+3 d+4 e+5]))
> (~(all by a) |=(a=@ (lte a 6)))
%.y
> (~(all by a) |=(a=@ (lte a 4)))
%.n+any:by
+any:byLogical OR.
Computes the logical OR on the results of slamming every element with $gate .b.
Accepts
.a is a +map, and is the sample of +by.
.b is a wet $gate.
Produces
A $flag.
Source
++ any
~/ %any
|* b=$-(* ?)
|- ^- ?
?~ a
|
?|((b q.n.a) $(a l.a) $(a r.a))Examples
> =a (malt (limo ~[a+1 b+[2 3]]))
> (~(any by a) |=(a=* ?@(a & |)))
%.y> =a (malt (limo ~[a+1 b+2 c+3 d+4 e+5]))
> (~(any by a) |=(a=@ (lte a 4)))
%.y+apt:by
+apt:byCheck correctness.
Computes whether .a has a correct horizontal order and a correct vertical order, producing a $flag.
Accepts
.a is a +map.
Produces
A $flag.
Source
++ apt
=< $
~/ %apt
=| [l=(unit) r=(unit)]
|. ^- ?
?~ a &
?& ?~(l & &((gor p.n.a u.l) !=(p.n.a u.l)))
?~(r & &((gor u.r p.n.a) !=(u.r p.n.a)))
?~ l.a &
&((mor p.n.a p.n.l.a) !=(p.n.a p.n.l.a) $(a l.a, l `p.n.a))
?~ r.a &
&((mor p.n.a p.n.r.a) !=(p.n.a p.n.r.a) $(a r.a, r `p.n.a))
==Examples
> =a (malt `(list [@tas @])`~[a+1 b+2 c+3 d+4 e+5])
> ~(apt by a)
%.y
> =z ?~(a ~ a(p.n `@tas`%z))
> z
[n=[p=%z q=2] l={[p=%e q=5]} r={[p=%d q=4] [p=%a q=1] [p=%c q=3]}]
> ~(apt by z)
%.nDiscussion
See section 2f for more information on $noun ordering.
+bif:by
+bif:byBifurcate.
Splits +map .a into two +maps .l and .r, which contain the items either side of key .b with value .c but not including the pair of key .b and value .c.
Accepts
.a is a +map, and is the sample of +by.
.b is a $noun.
.c is a $noun.
Produces
A cell of two +maps.
Source
++ bif
~/ %bif
|* [b=* c=*]
^+ [l=a r=a]
=< +
|- ^+ a
?~ a
[[b c] ~ ~]
?: =(b p.n.a)
?: =(c q.n.a)
a
a(n [b c])
?: (gor b p.n.a)
=+ d=$(a l.a)
?> ?=(^ d)
d(r a(l r.d))
=+ d=$(a r.a)
?> ?=(^ d)
d(l a(r l.d))Examples
> =a (malt `(list [@tas @])`~[a+1 b+2 c+3 d+4 e+5])
> (~(bif by a) b+2)
[l=[n=[p=%e q=5] l=~ r=~] r=[n=[p=%d q=4] l=~ r=[n=[p=%c q=3] l={[p=%a q=1]} r={}]]]
> `[(map @tas @) (map @tas @)]`(~(bif by a) b+2)
[{[p=%e q=5]} {[p=%d q=4] [p=%a q=1] [p=%c q=3]}]Discussion
Note that +maps are horizontally ordered by the +mug hash of their keys and vertically ordered by the double-+mug hash of their keys. This means bifurcating the +map (malt ~[10^10 20^20 30^30 40^40 50^50]) at 30^30 will not produce [{10^10 20^20} {40^40 50^50}], but rather [{20^20} {10^10 40^40 50^50}] due to the tree structure resulting from their +mug hashes.
+del:by
+del:byDelete.
Produces +map .a with the element located at key .b removed.
Accepts
.a is a +map, and is the sample of +by.
.b is a key as a $noun.
Produces
A +map.
Source
++ del
~/ %del
|* b=*
|- ^+ a
?~ a
~
?. =(b p.n.a)
?: (gor b p.n.a)
a(l $(a l.a))
a(r $(a r.a))
|- ^- [$?(~ _a)]
?~ l.a r.a
?~ r.a l.a
?: (mor p.n.l.a p.n.r.a)
l.a(r $(l.a r.l.a))
r.a(l $(r.a l.r.a))Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> `(map @tas @)`(~(del by a) %z)
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> `(map @tas @)`(~(del by a) %b)
{[p=%d q=4] [p=%a q=1] [p=%c q=3]}+dif:by
+dif:byDifference.
Computes the difference between .a and .b, producing the +map of key-value pairs in .a whose keys are not in .b.
Accepts
.a is a +map, and is the sample of +by.
.b is a +map.
Produces
A +map.
Source
++ dif
~/ %dif
=+ b=a
|@
++ $
|- ^+ a
?~ b
a
=+ c=(bif p.n.b q.n.b)
?> ?=(^ c)
=+ d=$(a l.c, b l.b)
=+ e=$(a r.c, b r.b)
|- ^- [$?(~ _a)]
?~ d e
?~ e d
?: (mor p.n.d p.n.e)
d(r $(d r.d))
e(l $(e l.e))
--Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> =b `(map @tas @)`(malt (limo ~[c+3 d+4 e+5 f+6]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> b
{[p=%e q=5] [p=%d q=4] [p=%f q=6] [p=%c q=3]}
> `(map @tas @)`(~(dif by a) b)
{[p=%b q=2] [p=%a q=1]}> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> =b `(map @tas @)`(malt (limo ~[a+2 e+4 f+5]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> b
{[p=%e q=4] [p=%f q=5] [p=%a q=2]}
> `(map @tas @)`(~(dif by a) b)
{[p=%b q=2] [p=%d q=4] [p=%c q=3]}Discussion
This only compares keys, so if both +maps contain the same key with different values, that key-value pair is not considered a difference and will not be included in the resulting +map.
+dig:by
+dig:byAddress of key.
Produce the address of key .b within +map .a.
Accepts
.a is a +map, and is the sample of +by.
.b is a key as a $noun.
Produces
A unit.
Source
++ dig
|= b=*
=+ c=1
|- ^- (unit @)
?~ a ~
?: =(b p.n.a) [~ u=(peg c 2)]
?: (gor b p.n.a)
$(a l.a, c (peg c 6))
$(a r.a, c (peg c 7))Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> (~(dig by a) %a)
[~ 252]
> (~(dig by a) %b)
[~ 2]
> (~(dig by a) %e)
~+gas:by
+gas:byMerge.
Like Clojure's merge. Insert a list of key-value pairs .b into +map .a. For a key which exists in both .a and .b, the value is replaced with the value in .b.
Accepts
.a is a +map, and is the sample of +by.
.b is a list of cells of key-value $nouns .p and .q.
Produces
A +map.
Source
++ gas
~/ %gas
|* b=(list [p=* q=*])
=> .(b `(list _?>(?=(^ a) n.a))`b)
|- ^+ a
?~ b
a
$(b t.b, a (put p.i.b q.i.b))Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> `(map @tas @)`(~(gas by a) ~[e+5 f+6 g+7])
{[p=%e q=5] [p=%b q=2] [p=%d q=4] [p=%f q=6] [p=%g q=7] [p=%a q=1] [p=%c q=3]}> =a `(map @tas @)`(malt (limo ~[a+1 b+2]))
> a
{[p=%b q=2] [p=%a q=1]}
> `(map @tas @)`(~(gas by a) ~[a+100 b+200])
{[p=%b q=200] [p=%a q=100]}> `(map @tas @)`(~(gas by `(map @tas @)`~) ~[a+100 b+200])
{[p=%b q=200] [p=%a q=100]}+get:by
+get:byGrab unit value.
Produce the unit value of the value located at key .b within +map .a.
Accepts
.a is a +map, and is the sample of +by.
.b is a key as a $noun.
Produces
A unit.
Source
++ get
~/ %get
|* b=*
=> .(b `_?>(?=(^ a) p.n.a)`b)
|- ^- (unit _?>(?=(^ a) q.n.a))
?~ a
~
?: =(b p.n.a)
(some q.n.a)
?: (gor b p.n.a)
$(a l.a)
$(a r.a)Examples
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> (~(get by a) %a)
[~ 1]
> (~(get by a) %b)
[~ 2]
> (~(get by a) %z)
~+got:by
+got:byAssert.
Produce the value located at key .b within +map .a. Crash if key .b does not exist.
Accepts
.a is a +map, and is the sample of +by.
.b is a key as a $noun.
Produces
A $noun.
Source
++ got
|* b=*
(need (get b))Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> (~(got by a) %a)
1
> (~(got by a) %b)
2
> (~(got by a) %z)
dojo: hoon expression failed+gut:by
+gut:byGrab value with default.
Produce the value located at key .b within +map .a. Use default value .c if key does not exist.
Accepts
.a is a +map, and is the sample of +by.
.b is a key as a $noun.
.c is a $noun.
Produces
A $noun.
Source
++ gut
|* [b=* c=*]
(fall (get b) c)Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> (~(gut by a) %a 9.999)
1
> (~(gut by a) %b 9.999)
2
> (~(gut by a) %z 9.999)
9.999+has:by
+has:byKey existence check.
Checks whether +map .a contains an element with key .b, producing a $flag.
Accepts
.a is a +map, and is the sample of +by.
.b is a key as a $noun.
Produces
A $flag.
Source
++ has
~/ %has
|* b=*
!=(~ (get b))Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> (~(has by a) %a)
%.y
> (~(has by a) %z)
%.n+int:by
+int:byIntersection.
Produces a +map of the (key) intersection between two +maps of the same type, .a and .b. If both +maps have an identical key that point to different values, the element from +map .b is used.
Accepts
.a is a +map, and is the sample of +by.
.b is a +map.
Produces
A +map.
Source
++ int
~/ %int
=+ b=a
|@
++ $
|- ^+ a
?~ b
~
?~ a
~
?: (mor p.n.a p.n.b)
?: =(p.n.b p.n.a)
b(l $(a l.a, b l.b), r $(a r.a, b r.b))
?: (gor p.n.b p.n.a)
%- uni(a $(a l.a, r.b ~)) $(b r.b)
%- uni(a $(a r.a, l.b ~)) $(b l.b)
?: =(p.n.a p.n.b)
b(l $(b l.b, a l.a), r $(b r.b, a r.a))
?: (gor p.n.a p.n.b)
%- uni(a $(b l.b, r.a ~)) $(a r.a)
%- uni(a $(b r.b, l.a ~)) $(a l.a)
--Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> =b `(map @tas @)`(malt (limo ~[c+3 d+4 e+5 f+6]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> b
{[p=%e q=5] [p=%d q=4] [p=%f q=6] [p=%c q=3]}
> `(map @tas @)`(~(int by a) b)
{[p=%d q=4] [p=%c q=3]}> =a `(map @tas @)`(malt (limo ~[a+1 b+2]))
> =b `(map @tas @)`(malt (limo ~[a+100 b+200]))
> a
{[p=%b q=2] [p=%a q=1]}
> b
{[p=%b q=200] [p=%a q=100]}
> `(map @tas @)`(~(int by a) b)
{[p=%b q=200] [p=%a q=100]}+jab:by
+jab:byTransform value.
Produce +map .a with the value at key .b transformed by $gate .c.
Accepts
.a is a +map, and is the sample of +by.
.b is a $noun, and a key in .a.
.c is a $gate.
Produces
A +map.
Source
++ jab
~/ %jab
|* [key=_?>(?=(^ a) p.n.a) fun=$-(_?>(?=(^ a) q.n.a) _?>(?=(^ a) q.n.a))]
^+ a
::
?~ a !!
::
?: =(key p.n.a)
a(q.n (fun q.n.a))
::
?: (gor key p.n.a)
a(l $(a l.a))
::
a(r $(a r.a))Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> `(map @tas @)`(~(jab by a) %d |=(x=@ (pow x 2)))
{[p=%b q=2] [p=%d q=16] [p=%a q=1] [p=%c q=3]}
> (~(jab by a) %z |=(x=@ (pow x 2)))
dojo: hoon expression failed
> (~(jab by a) %d |=(a=@ [a a]))
-need.?(%~ [n=[p=@tas q=@] l=nlr([p=@tas q=@]) r=nlr([p=@tas q=@])])
-have.[n=[p=@tas q=[@ @]] l=nlr([p=@tas q=@]) r=nlr([p=@tas q=@])]
nest-fail
dojo: hoon expression failed+key:by
+key:bySet of keys.
Produces a +set of all keys in +map .a.
Accepts
.a is a +map, and is the sample of +by.
Produces
A +set.
Source
++ key
=< $
~/ %key
=+ b=`(set _?>(?=(^ a) p.n.a))`~
|. ^+ b
?~ a b
$(a r.a, b $(a l.a, b (~(put in b) p.n.a)))Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> ~(key by a)
{%b %d %a %c}+mar:by
+mar:byAdd with validation.
Produces +map .a with the addition of key-value pair .b and .c, where the value is a nonempty unit.
Accept a $noun and a unit of a $noun of the type of the +map's keys and values, respectively. Validate that the value is not null and put the pair in the +map. If the value is null, delete the key.
Accepts
.a is a +map, and is the sample of +by.
.b is a $noun.
.c is a +unit.
Produces
A +map.
Source
++ mar
|* [b=* c=(unit *)]
?~ c
(del b)
(put b u.c)Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> `(map @tas @)`(~(mar by a) %e (some 5))
{[p=%e q=5] [p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> `(map @tas @)`(~(mar by a) %a (some 10))
{[p=%b q=2] [p=%d q=4] [p=%a q=10] [p=%c q=3]}
> `(map @tas @)`(~(mar by a) %a ~)
{[p=%b q=2] [p=%d q=4] [p=%c q=3]}+put:by
+put:byAdd key-value pair.
Produces .a with the addition of the key-value pair of .b and .c.
Accepts
.a is a +map, and is the sample of +by.
.b is a key of the same type as the keys in .a.
.c is a value of the same type of the values in .a.
Produces
A +map.
Source
++ put
~/ %put
|* [b=* c=*]
|- ^+ a
?~ a
[[b c] ~ ~]
?: =(b p.n.a)
?: =(c q.n.a)
a
a(n [b c])
?: (gor b p.n.a)
=+ d=$(a l.a)
?> ?=(^ d)
?: (mor p.n.a p.n.d)
a(l d)
d(r a(l r.d))
=+ d=$(a r.a)
?> ?=(^ d)
?: (mor p.n.a p.n.d)
a(r d)
d(l a(r l.d))Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3]))
> a
{[p=%b q=2] [p=%a q=1] [p=%c q=3]}
> `(map @tas @)`(~(put by a) %d 4)
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> `(map @tas @)`(~(put by a) %a 10)
{[p=%b q=2] [p=%a q=10] [p=%c q=3]}
> (~(put by a) 42 'foo')
mull-grow
mull-nice
-need.?(%~ [n=[p=@tas q=@] l=nlr([p=@tas q=@]) r=nlr([p=@tas q=@])])
-have.[[@ud @t] %~ %~]
nest-fail
dojo: hoon expression failed+rep:by
+rep:byReduce to product.
Accumulate elements of +map .a using $gate .b, producing a $noun.
Accepts
.a is a +map.
.b is a $gate.
Produces
A $noun.
Source
++ rep
~/ %rep
|* b=_=>(~ |=([* *] +<+))
|-
?~ a +<+.b
$(a r.a, +<+.b $(a l.a, +<+.b (b n.a +<+.b)))Examples
> =a `(map @tas @)`(malt (limo ~[a+1 b+2 c+3 d+4]))
> a
{[p=%b q=2] [p=%d q=4] [p=%a q=1] [p=%c q=3]}
> (~(rep by a) |=([p=[@tas @] q=@] ~&([p q] (add +.p q))))
[[%b 2] 0]
[[%d 4] 2]
[[%c 3] 6]
[[%a 1] 9]
q=10Discussion
The $gate will iteratively be fed a cell whose head is a key-value pair from the +map and whose tail is an accumulator, producing the final value of the accumulator.
+rib:by
+rib:byTransform + product.
.c is a $gate with a sample like [[key value] accumulator] and a product like [accumulator [key value]]. Each key-value pair in +map .a is passed to .c and replaced with the key-value pair .c produced. The final value of the accumulator and the modified +map are returned. .b is the initial value of the accumulator.
Accepts
.a is a +map, and is the sample of +by.
.b is a $noun, and is the initial value of the accumulator.
.c is a $gate.
Produces
A cell of a $noun and a +map.
Source
++ rib
|* [b=* c=gate]
|- ^+ [b a]
?~ a [b ~]
=+ d=(c n.a b)
=. n.a +.d
=+ e=$(a l.a, b -.d)
=+ f=$(a r.a, b -.e)
[-.f a(l +.e, r +.f)]Examples
In this example, all values less than three are changed to zero, and a list of their keys are produced along with the modified +map.
> =a `(map @t @)`(malt ~[['a' 1] ['b' 2] ['c' 3] ['d' 4] ['e' 5]])
> a
{[p='e' q=5] [p='b' q=2] [p='d' q=4] [p='a' q=1] [p='c' q=3]}
> =c |= [[k=@t v=@] acc=(list @t)]
?: (lth v 3)
[[k acc] [k 0]]
[acc [k v]]
> `[(list @t) (map @t @)]`(~(rib by a) *(list @t) c)
[<|a b|> {[p='e' q=5] [p='b' q=0] [p='d' q=4] [p='a' q=0] [p='c' q=3]}]Discussion
Key-value pairs in the +map are transformed in their existing tree location. This means if you change the key, you'd likely produce a +map with an incorrect order, so typically you should only change the value.
+run:by
+run:byTransform values.
Iterates over every value in +map .a using $gate .b, producing a +map.
Accepts
.a is a +map, and is the sample of +by.
.b is a $gate.
Produces
A +map.
Source
++ run
~/ %run
|* b=gate
|-
?~ a a
[n=[p=p.n.a q=(b q.n.a)] l=$(a l.a) r=$(a r.a)]Examples
> =a `(map @t @)`(malt ~[['a' 1] ['b' 2] ['c' 3] ['d' 4] ['e' 5]])
> `(map @t @)`(~(run by a) dec)
{[p='e' q=4] [p='b' q=1] [p='d' q=3] [p='a' q=0] [p='c' q=2]}+tap:by
+tap:byListify pairs.
Produces the list of all elements in +map .a.
Accepts
.a is a +map, and is the sample of +by.
Produces
A list.
Source
++ tap
=< $
~/ %tap
=+ b=`(list _?>(?=(^ a) n.a))`~
|. ^+ b
?~ a
b
$(a r.a, b [n.a $(a l.a)])Examples
> =a `(map @ @)`(malt ~[[1 1] [2 2] [3 3] [4 4] [5 5]])
> ~(tap by a)
~[[p=4 q=4] [p=3 q=3] [p=2 q=2] [p=1 q=1] [p=5 q=5]]+uni:by
+uni:byUnion, merge.
Produces a +map of the union between the keys of .a and .b. If .b shares a key with .a, the tuple from .b is preserved.
Accepts
.a is a +map, and is the sample +by.
.b is a +map.
Produces
A +map.
Source
++ uni
~/ %uni
=+ b=a
|@
++ $
|- ^+ a
?~ b
a
?~ a
b
?: =(p.n.b p.n.a)
b(l $(a l.a, b l.b), r $(a r.a, b r.b))
?: (mor p.n.a p.n.b)
?: (gor p.n.b p.n.a)
$(l.a $(a l.a, r.b ~), b r.b)
$(r.a $(a r.a, l.b ~), b l.b)
?: (gor p.n.a p.n.b)
$(l.b $(b l.b, r.a ~), a r.a)
$(r.b $(b r.b, l.a ~), a l.a)
--Examples
> =a `(map @ @)`(malt ~[[1 1] [2 2] [3 3]])
> =b `(map @ @)`(malt ~[[3 300] [4 400] [5 500]])
> a
{[p=1 q=1] [p=2 q=2] [p=3 q=3]}
> b
{[p=5 q=500] [p=3 q=300] [p=4 q=400]}
> `(map @ @)`(~(uni by a) b)
{[p=5 q=500] [p=1 q=1] [p=2 q=2] [p=3 q=300] [p=4 q=400]}+uno:by
+uno:byGeneral union.
Produces a +map of the union between the keys of .a and .b. If .b shares a key with .a, $gate +meg is applied to both and its product is used as the new value of the key in question.
Accepts
.a is a +map, and is the sample of +by.
.b is a +map, and is the sample of ~(uno by a).
+meg is a $gate, and is the sample of (~(uno by a) b).
Produces
A +map.
Source
++ uno
=+ b=a
|@
++ $
|= meg=$-([_p:node _q:node _q:node] _q:node)
|- ^+ a
?~ b
a
?~ a
b
?: =(p.n.b p.n.a)
:+ [p.n.a (meg p.n.a q.n.a q.n.b)]
$(b l.b, a l.a)
$(b r.b, a r.a)
?: (mor p.n.a p.n.b)
?: (gor p.n.b p.n.a)
$(l.a $(a l.a, r.b ~), b r.b)
$(r.a $(a r.a, l.b ~), b l.b)
?: (gor p.n.a p.n.b)
$(l.b $(b l.b, r.a ~), a r.a)
$(r.b $(b r.b, l.a ~), a l.a)
--Examples
> =a `(map @ @)`(malt ~[[1 1] [2 2] [3 3]])
> =b `(map @ @)`(malt ~[[3 3] [4 4] [5 5]])
> a
{[p=1 q=1] [p=2 q=2] [p=3 q=3]}
> b
{[p=5 q=5] [p=3 q=3] [p=4 q=4]}
> `(map @ @)`((~(uno by a) b) |=([k=@ v=@ w=@] (add v w)))
{[p=5 q=5] [p=1 q=1] [p=2 q=2] [p=3 q=6] [p=4 q=4]}+urn:by
+urn:byTurn (with key).
Iterates over every value in +map .a using $gate .b, which accepts both the key and the value of each element as its sample.
Accepts
.a is a +map.
.b is a $gate that accepts two $nouns.
Produces
A +map.
Source
++ urn
~/ %urn
|* b=$-([* *] *)
|-
?~ a ~
a(n n.a(q (b p.n.a q.n.a)), l $(a l.a), r $(a r.a))Examples
> =a `(map @ @)`(malt ~[[1 1] [2 2] [3 3]])
> a
{[p=1 q=1] [p=2 q=2] [p=3 q=3]}
> (~(urn by a) |=([k=@ v=@] (pow v 2)))
{[p=1 q=1] [p=2 q=4] [p=3 q=9]}+wyt:by
+wyt:byDepth.
Produce the size of the tree +map .a.
Accepts
.a is a +map, and is the sample of +by.
Produces
An $atom.
Source
++ wyt
=< $
~% %wyt + ~
|. ^- @
?~(a 0 +((add $(a l.a) $(a r.a))))Examples
> =a `(map @ @)`(malt ~[[1 1] [2 2] [3 3]])
> =b `(map @ @)`(malt ~[[1 1] [2 2] [3 3] [4 4] [5 5]])
> a
{[p=1 q=1] [p=2 q=2] [p=3 q=3]}
> b
{[p=5 q=5] [p=1 q=1] [p=2 q=2] [p=3 q=3] [p=4 q=4]}
> ~(wyt by a)
3
> ~(wyt by b)
5+val:by
+val:byList of values.
Produces a list of all values in +map .a.
Accepts
.a is a +map.
Produces
A list.
Source
++ val
=+ b=`(list _?>(?=(^ a) q.n.a))`~
|- ^+ b
?~ a b
$(a r.a, b [q.n.a $(a l.a)])Examples
> =a `(map @t @)`(malt ~[['a' 1] ['b' 2] ['c' 3]])
> a
{[p='b' q=2] [p='a' q=1] [p='c' q=3]}
> ~(val by a)
~[3 1 2]Last updated