Mips (Maps of Maps)
A +mip
is a map of maps. These can be constructed manually by nesting ordinary +map
s, but the %landscape
desk contains a /lib/mip.hoon
library which makes these a bit easier to deal with. You can copy the library into your own project. The various +mip
functions are documented below.
+mip
+mip
Mip (map of maps) mold builder
A +mip
is a map of maps. An outer +map
maps keys to inner +map
s, which themselves map keys to values.
A (mip kex key value)
is equivalent to (map kex (map key value))
.
Accepts
kex
is a $mold
, the type of the outer map's key.
key
is a $mold
, the type of the key of the inner maps.
value
is a $mold
, the type of the value of the inner maps.
Produces
A $mold
.
Source
|%
++ mip :: map of maps
|$ [kex key value]
(map kex (map key value))
Examples
> =libmip -build-file /=landscape=/lib/mip/hoon
> *(mip:libmip @ @ @)
{}
> (~(put bi:libmip *(mip:libmip @ @ @)) 1 2 3)
[n=[p=1 q=[n=[p=2 q=3] l=~ r=~]] l=~ r=~]
+bi
+bi
Mip engine
This is the container door for all the mip functions.
Accepts
.a
is a +mip
.
Source
++ bi :: mip engine
=| a=(map * (map))
|@
Examples
> =libmip -build-file /=landscape=/lib/mip/hoon
> ~(. bi:libmip *(mip:libmip @ @ @))
< 8.bql
[ a=nlr([p=@ q=nlr([p=@ q=@])])
<2.gtk 17.zfg 35.yza 14.oai 54.ecl 77.swa 232.sje 51.qbt 123.ppa 46.hgz 1.pnw %140>
]
>
+del:bi
+del:bi
Delete item in +mip
This takes two keys as its argument, .b
and .c
, and deletes .c
in the inner map that matches key .b
in the outer map . If this results in an empty inner map, then .b
is also deleted from the outer map.
Accepts
.a
is a +mip
, and is the +bi
door's sample.
.b
is a key matching the key type of the outer map.
.c
is a key matching the key type of the inner maps.
Produces
A +mip
with .c
deleted from .b
, or .b
deleted from .a
if .c
ended up empty.
Source
++ del
|* [b=* c=*]
=+ d=(~(gut by a) b ~)
=+ e=(~(del by d) c)
?~ e
(~(del by a) b)
(~(put by a) b e)
Examples
> =libmip -build-file /=landscape=/lib/mip/hoon
> =mymip (~(put bi:libmip *(mip:libmip @ @ @)) 1 2 3)
> =mymip (~(put bi:libmip mymip) 1 3 4)
> mymip
[n=[p=1 q=[n=[p=2 q=3] l=~ r=[n=[p=3 q=4] l=~ r=~]]] l=~ r=~]
> =mymip (~(del bi:libmip mymip) 1 2)
> mymip
[n=[p=1 q=[n=[p=3 q=4] l=~ r=~]] l=~ r=~]
> =mymip (~(del bi:libmip mymip) 1 3)
> mymip
~
+get:bi
+get:bi
Maybe get value in +mip
Get the value of .c
in the map with key .b
in +mip
.a
as a unit. If there's no .c
in .b
or .b
in .a
, the unit is null.
Accepts
.a
is a +mip
, and is the sample of the +bi
door.
.b
is a key matching the key type of the outer map.
.c
is a key matching the key type of the inner maps.
Produces
A (unit [type])
, where [type]
is the value type. The unit is null if there's no .c
in .b
or no .b
in .a
.
Source
++ get
|* [b=* c=*]
=> .(b `_?>(?=(^ a) p.n.a)`b, c `_?>(?=(^ a) ?>(?=(^ q.n.a) p.n.q.n.a))`c)
^- (unit _?>(?=(^ a) ?>(?=(^ q.n.a) q.n.q.n.a)))
(~(get by (~(gut by a) b ~)) c)
Examples
> =libmip -build-file /=landscape=/lib/mip/hoon
> =mymip (~(put bi:libmip *(mip:libmip @ @ @)) 1 2 3)
> (~(get bi:libmip mymip) 1 2)
[~ 3]
> (~(get bi:libmip mymip) 2 3)
~
+got:bi
+got:bi
Get value in +mip
or crash
Get the value of .c
in the map with key .b
in +mip
.a
. If there's no .c
in .b
or .b
in .a
, crash.
Accepts
.a
is a +mip
, and is the sample of the +bi
door.
.b
is a key matching the key type of the outer map.
.c
is a key matching the key type of the inner maps.
Produces
A noun of the type of the values in the +mip
, or else crashes.
Source
++ got
|* [b=* c=*]
(need (get b c))
Examples
> =libmip -build-file /=landscape=/lib/mip/hoon
> =mymip (~(put bi:libmip *(mip:libmip @ @ @)) 1 2 3)
> (~(got bi:libmip mymip) 1 2)
3
> (~(got bi:libmip mymip) 2 3)
/lib/mip/hoon:<[25 5].[25 21]>
dojo: hoon expression failed
+gut:bi
+gut:bi
Get value in +mip
or default
Get the value of .c
in the map with key .b
in +mip
.a
. If there's no .c
in .b
or .b
in .a
, produce default value .d
.
Accepts
.a
is a +mip
, and is the sample of the +bi
door.
.b
is a key matching the key type of the outer map.
.c
is a key matching the key type of the inner maps.
.d
is a default value, which is produced if the value cannot be found.
Produces
A noun, either the type of the value in the map or .d
.
Source
++ gut
|* [b=* c=* d=*]
(~(gut by (~(gut by a) b ~)) c d)
Examples
> =libmip -build-file /=landscape=/lib/mip/hoon
> =mymip (~(put bi:libmip *(mip:libmip @ @ @)) 1 2 3)
> (~(gut bi:libmip mymip) 1 2 42)
3
> (~(gut bi:libmip mymip) 2 3 42)
42
+has:bi
+has:bi
Check if +mip
contains
Check if +mip
.a
contains .c
in .b
.
Accepts
.a
is a +mip
, and is the sample of the +bi
door.
.b
is a key matching the key type of the outer map.
.c
is a key matching the key type of the inner maps.
Produces
A ?
which is true if .c
in .b
exists, and false otherwise.
Source
++ has
|* [b=* c=*]
!=(~ (get b c))
Examples
> =libmip -build-file /=landscape=/lib/mip/hoon
> =mymip (~(put bi:libmip *(mip:libmip @ @ @)) 1 2 3)
> (~(has bi:libmip mymip) 1 2)
%.y
> (~(has bi:libmip mymip) 2 3)
%.n
+key:bi
+key:bi
Get keys of inner map in +mip
Get the +set
of keys of the inner map matching key .b
in the outer map. If .b
doesn't exist, an empty set is returned.
Accepts
.a
is a +mip
, and is the sample of the +bi
door.
.b
is a key matching the key type of the outer map.
Produces
A (set [type])
where [type]
is the type of the keys in the inner map.
Source
++ key
|* b=*
~(key by (~(gut by a) b ~))
Examples
> =libmip -build-file /=landscape=/lib/mip/hoon
> =mymip (~(put bi:libmip *(mip:libmip @ @ @)) 1 2 3)
> (~(key bi:libmip mymip) 1)
{2}
> (~(key bi:libmip mymip) 2)
{}
+put:bi
+put:bi
Insert value in +mip
Add value .d
with key .c
to the inner map with key .b
in the outer map. If .b
doesn't exist, an inner map is also added with that key. If .c
already exists, its value is replaced with .d
.
Accepts
.a
is a +mip
, and is the sample of the +bi
door.
.b
is a key matching the key type of the outer map.
.c
is a key matching the key type of the inner maps.
.d
is a noun matching the type of the values in the +mip
.
Produces
A new, modified +mip
.
Source
++ put
|* [b=* c=* d=*]
%+ ~(put by a) b
%. [c d]
%~ put by
(~(gut by a) b ~)
Examples
> =libmip -build-file /=landscape=/lib/mip/hoon
> =mymip (~(put bi:libmip *(mip:libmip @ @ @)) 1 2 3)
> =mymip (~(put bi:libmip mymip) 1 1 42)
> =mymip (~(put bi:libmip mymip) 2 12 99)
> ~(tap bi:libmip mymip)
~[[x=2 y=12 v=99] [x=1 y=2 v=3] [x=1 y=1 v=42]]
+tap:bi
+tap:bi
Convert +mip
to +list
The +mip
is flattened to a +list
of the triple [x y v]
, where .x
is a key in the outer map, .y
is a key in an inner map, and .v
is its value.
Accepts
.a
is a +mip
, and is the sample of the +bi
door.
Produces
A triple cell of [x y v]
, where:
.x
is a key in the outer map..y
is a key in an inner map..v
is its value.
Source
++ tap
::NOTE naive turn-based implementation find-errors ):
=< $
=+ b=`_?>(?=(^ a) *(list [x=_p.n.a _?>(?=(^ q.n.a) [y=p v=q]:n.q.n.a)]))`~
|. ^+ b
?~ a
b
$(a r.a, b (welp (turn ~(tap by q.n.a) (lead p.n.a)) $(a l.a)))
--
Examples
> =libmip -build-file /=landscape=/lib/mip/hoon
> =mymip (~(put bi:libmip *(mip:libmip @ @ @)) 1 2 3)
> =mymip (~(put bi:libmip mymip) 1 1 42)
> =mymip (~(put bi:libmip mymip) 2 12 99)
> ~(tap bi:libmip mymip)
~[[x=2 y=12 v=99] [x=1 y=2 v=3] [x=1 y=1 v=42]]
Last updated