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 $flag.

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