2j: Jar and Jug Logic

+ja

Jar engine

A container arm for +jar operation arms. A +jar is a +map of +lists. The contained arms inherit the sample jar.

Accepts

.a is a jar.

Produces

A core.

Source

++  ja
  =|  a=(tree (pair * (list)))  ::  (jar)
  |@

Examples

> ~(. ja (my [a+1 b+2 ~]))
< 2.ngd
  [   a
    ?(
      %~
      [ n=[?(p=%a p=%b) q=@ud]
        l=nlr([p=?(%a %b) q=@ud])
        r=nlr([p=?(%a %b) q=@ud])
      ]
    )
    <123.zao 46.hgz 1.pnw %140>
  ]
>

+get:ja

Grab value by key

Produces the list at key .b in jar .a.

Accepts

.a is a +jar, and is the sample of +ja.

.b is a noun.

Produces

A +list.

Source

++  get
  |*  b=*
  =+  c=(~(get by a) b)
  ?~(c ~ u.c)

Examples

> =j `(jar @t @ud)`(malt ~[['a' `(list @ud)`~[1 2 3]] ['b' `(list @ud)`~[4 5 6]]])
> j
{[p='b' q=~[4 5 6]] [p='a' q=~[1 2 3]]}

> `(list @ud)`(~(get ja j) 'a')
~[1 2 3]

> `(list @ud)`(~(get ja j) 'b')
~[4 5 6]

> `(list @ud)`(~(get ja j) 'c')
~

+add:ja

Prepend to list

Adds .c to the head of the list at key .b in jar .a. If .b does not exist in .a, a new key-value pair is added with a list containing .c.

Accepts

.a is a +jar, and is the sample of +ja.

.b is a noun of the same type as the keys in .a.

.c is a noun of the same type the lists in .a contain.

Produces

A +jar.

Source

++  add
  |*  [b=* c=*]
  =+  d=(get b)
  (~(put by a) b [c d])

Examples

> =j `(jar @t @ud)`(malt ~[['a' `(list @ud)`~[1 2 3]] ['b' `(list @ud)`~[4 5 6]]])
> j
{[p='b' q=~[4 5 6]] [p='a' q=~[1 2 3]]}

> `(jar @t @ud)`(~(add ja j) 'b' 7)
{[p='b' q=~[7 4 5 6]] [p='a' q=~[1 2 3]]}

> `(jar @t @ud)`(~(add ja j) 'c' 8)
{[p='b' q=~[4 5 6]] [p='a' q=~[1 2 3]] [p='c' q=~[8]]}

+ju

Jug operations

Container arm for jug operation arms. A +jug is a +map of +sets. The contained arms inherit its sample jug, .a.

Accepts

.a is a +jug.

Produces

A core.

Source

++  ju
  =|  a=(tree (pair * (tree)))  ::  (jug)
  |@

Example

> =j `(jug @t @ud)`(malt ~[['a' (silt ~[1 2 3])] ['b' (silt ~[4 5 6])]])
> j
{[p='b' q={5 6 4}] [p='a' q={1 2 3}]}

> ~(. ju j)
<5.cws [a=nlr([p=@t q=nlr(@ud)]) <123.zao 46.hgz 1.pnw %140>]>

+del:ju

Remove

Produces jug .a with value .c removed from set located at key .b.

Accepts

.a is a jug, and is the sample of +ju.

.b is a noun of the same type as the keys in .a.

.c is a noun of the same type as the sets in .a contain.

Source

++  del
  |*  [b=* c=*]
  ^+  a
  =+  d=(get b)
  =+  e=(~(del in d) c)
  ?~  e
    (~(del by a) b)
  (~(put by a) b e)

Examples

> j
{[p='b' q={5 6 4}] [p='a' q={1 2 3}]}

> `(jug @t @ud)`(~(del ju j) 'b' 6)
{[p='b' q={5 4}] [p='a' q={1 2 3}]}

> `(jug @t @ud)`(~(del ju j) 'b' 10)
{[p='b' q={5 6 4}] [p='a' q={1 2 3}]}

> `(jug @t @ud)`(~(del ju j) 'c' 10)
{[p='b' q={5 6 4}] [p='a' q={1 2 3}]}

+gas:ju

Concatenate

Add each of the key-value pairs in list .b to jug .a. The values in .b are the type the sets in .a contain. For keys in .b that exist in .a, the values will be added to their sets. For keys in .b that don't exist in .a, new keys and sets will be added.

Accepts

.a is a +jug, and is the sample of +ju.

.b is a (list [p q]), where:

  • .p is a noun, the type of the keys in .a.

  • .q is a noun, the type the sets in .a contain.

Produces

A +jug.

Source

++  gas
  |*  b=(list [p=* q=*])
  =>  .(b `(list _?>(?=([[* ^] ^] a) [p=p q=n.q]:n.a))`b)
  |-  ^+  a
  ?~  b
    a
  $(b t.b, a (put p.i.b q.i.b))

Examples

> =j `(jug @t @ud)`(malt ~[['a' (silt ~[1 2 3])] ['b' (silt ~[4 5 6])]])
> j
{[p='b' q={5 6 4}] [p='a' q={1 2 3}]}

> `(jug @t @ud)`(~(gas ju j) ~[['a' 10] ['a' 42] ['b' 999] ['c' 7]])
{[p='b' q={5 6 4 999}] [p='a' q={10 42 1 2 3}] [p='c' q={7}]}

+get:ju

Retrieve set

Produces a set retrieved from jug .a using key .b.

Accepts

.a is a jug, and the sample of +ju.

.b is key, a noun of the same type as the keys in .a.

Produces

A +set.

Source

++  get
  |*  b=*
  =+  c=(~(get by a) b)
  ?~(c ~ u.c)

Examples

> =j `(jug @t @ud)`(malt ~[['a' (silt ~[1 2 3])] ['b' (silt ~[4 5 6])]])
> j
{[p='b' q={5 6 4}] [p='a' q={1 2 3}]}

> `(set @ud)`(~(get ju j) 'a')
{1 2 3}

> `(set @ud)`(~(get ju j) 'b')
{5 6 4}

> `(set @ud)`(~(get ju j) 'c')
{}

+has:ju

Check contents

Computes whether a value .c exists within the set located at key .b with jug .a, producing a flag.

Accepts

.a is a +jug, and the sample of +ju.

.b is a noun of the same type as the keys in .a.

.c is a noun of the same type as the sets in .a contain.

Produces

A ?.

Source

++  has
  |*  [b=* c=*]
  ^-  ?
  (~(has in (get b)) c)

Examples

> =j `(jug @t @ud)`(malt ~[['a' (silt ~[1 2 3])] ['b' (silt ~[4 5 6])]])
> j
{[p='b' q={5 6 4}] [p='a' q={1 2 3}]}

> (~(has ju j) 'b' 5)
%.y

> (~(has ju j) 'b' 10)
%.n

> (~(has ju j) 'c' 10)
%.n

+put:ju

Add key-set pair

Produces jug .a with .c added to the set located at key .b. If .b isn't a key in .a, it will be added and a new set created containing .c.

Accepts

.a is a +jug.

.b is a noun, the type of the keys in .a.

.c is a noun, the type the sets in .a contain.

Produces

A +jug.

Source

++  put
  |*  [b=* c=*]
  ^+  a
  =+  d=(get b)
  (~(put by a) b (~(put in d) c))

Examples

> j
{[p='b' q={5 6 4}] [p='a' q={1 2 3}]}

> `(jug @t @ud)`(~(put ju j) 'c' 5)
{[p='b' q={5 6 4}] [p='a' q={1 2 3}] [p='c' q={5}]}

> `(jug @t @ud)`(~(put ju j) 'a' 4)
{[p='b' q={5 6 4}] [p='a' q={1 2 3 4}]}

> `(jug @t @ud)`(~(put ju j) 'a' 1)
{[p='b' q={5 6 4}] [p='a' q={1 2 3}]}

Last updated