# 2j: Jar and Jug Logic

## `+ja` <a href="#ja" id="ja"></a>

Jar engine.

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

#### Accepts

`.a` is a `+jar`.

#### Produces

A core.

#### Source

```hoon
++  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` <a href="#getja" id="getja"></a>

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

```hoon
++  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` <a href="#addja" id="addja"></a>

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

```hoon
++  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` <a href="#ju" id="ju"></a>

Jug operations.

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

#### Accepts

`.a` is a `+jug`.

#### Produces

A core.

#### Source

```hoon
++  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` <a href="#delju" id="delju"></a>

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

```hoon
++  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` <a href="#gasju" id="gasju"></a>

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

```hoon
++  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` <a href="#getju" id="getju"></a>

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

```hoon
++  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` <a href="#hasju" id="hasju"></a>

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

```hoon
++  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` <a href="#putju" id="putju"></a>

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

```hoon
++  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}]}
```

***
