2p: Serialization

+cue

Unpack atom to noun

Produces a noun unpacked from atom .a. The inverse of +jam.

Accepts

.a is an atom.

Produces

A noun.

Source

++  cue
  ~/  %cue
  |=  a=@
  ^-  *
  =+  b=0
  =+  m=`(map @ *)`~
  =<  q
  |-  ^-  [p=@ q=* r=(map @ *)]
  ?:  =(0 (cut 0 [b 1] a))
    =+  c=(rub +(b) a)
    [+(p.c) q.c (~(put by m) b q.c)]
  =+  c=(add 2 b)
  ?:  =(0 (cut 0 [+(b) 1] a))
    =+  u=$(b c)
    =+  v=$(b (add p.u c), m r.u)
    =+  w=[q.u q.v]
    [(add 2 (add p.u p.v)) w (~(put by r.v) b w)]
  =+  d=(rub c a)
  [(add 2 p.d) (need (~(get by m) q.d)) m]

Examples

> (jam [1 2 3])
3.426.417

> (cue 3.426.417)
[1 2 3]

+jam

Pack noun to atom

Produces an atom packed from noun .a. The inverse of +cue.

Accepts

.a is a noun.

Produces

An atom.

Source

++  jam
  ~/  %jam
  |=  a=*
  ^-  @
  =+  b=0
  =+  m=`(map * @)`~
  =<  q
  |-  ^-  [p=@ q=@ r=(map * @)]
  =+  c=(~(get by m) a)
  ?~  c
    =>  .(m (~(put by m) a b))
    ?:  ?=(@ a)
      =+  d=(mat a)
      [(add 1 p.d) (lsh 0 q.d) m]
    =>  .(b (add 2 b))
    =+  d=$(a -.a)
    =+  e=$(a +.a, b (add b p.d), m r.d)
    [(add 2 (add p.d p.e)) (mix 1 (lsh [0 2] (cat 0 q.d q.e))) r.e]
  ?:  ?&(?=(@ a) (lte (met 0 a) (met 0 u.c)))
    =+  d=(mat a)
    [(add 1 p.d) (lsh 0 q.d) m]
  =+  d=(mat u.c)
  [(add 2 p.d) (mix 3 (lsh [0 2] q.d)) m]

Examples

> (jam 1)
12

> (cue 12)
1
> (jam [1 1])
817

> (cue 817)
[1 1]
> (jam [~ u=19])
39.689

> (cue 39.689)
[0 19]

+mat

Length-encode

Produces a cell whose tail .q is atom .a with a bit representation of its length prepended to it (as the least significant bits). The head .p is the length of .q in bits.

Accepts

.a is an atom.

Produces

A cell of two atoms, .p and .q.

Source

++  mat
  ~/  %mat
  |=  a=@
  ^-  [p=@ q=@]
  ?:  =(0 a)
    [1 1]
  =+  b=(met 0 a)
  =+  c=(met 0 b)
  :-  (add (add c c) b)
  (cat 0 (bex c) (mix (end [0 (dec c)] b) (lsh [0 (dec c)] a)))

Examples

> (mat 0xaaa)
[p=20 q=699.024]

> (met 0 q:(mat 0xaaa))
20

> `@ub`q:(mat 0xaaa)
0b1010.1010.1010.1001.0000

> =a =-(~&(- -) `@ub`0xaaa)
0b1010.1010.1010

> =b =-(~&(- -) `@ub`(xeb a))
0b1100

> =b =-(~&(- -) `@ub`(met 0 a))
0b1100

> =c =-(~&(- -) (xeb b))
4

> [`@ub`a `@ub`(end 0 (dec c) b) `@ub`(bex c)]
[0b1010.1010.1010 0b100 0b1.0000]

Discussion

+mat is only used internally as a helper to +jam.


+rub

Length-decode

The inverse of +mat. Accepts a cell of index .a and a bitstring .b and produces the cell whose tail .q is the decoded atom at index .a and whose head is the length of the encoded atom .q, by which the offset .a is advanced.

Accepts

.a is an atom.

.b is a bitstring as an atom.

Produces

A cell of two atoms, .p and .q.

Source

++  rub
  ~/  %rub
  |=  [a=@ b=@]
  ^-  [p=@ q=@]
  =+  ^=  c
      =+  [c=0 m=(met 0 b)]
      |-  ?<  (gth c m)
      ?.  =(0 (cut 0 [(add a c) 1] b))
        c
      $(c +(c))
  ?:  =(0 c)
    [1 0]
  =+  d=(add a +(c))
  =+  e=(add (bex (dec c)) (cut 0 [d (dec c)] b))
  [(add (add c c) e) (cut 0 [(add d (dec c)) e] b)]

Examples

> `@ub`(jam 0xaaa)
0b1.0101.0101.0101.0010.0000

> (rub 1 0b1.0101.0101.0101.0010.0000)
[p=20 q=2.730]

> `@ux`q:(rub 1 0b1.0101.0101.0101.0010.0000)
0xaaa

Discussion

+rub is only used internally as a helper to +cue.


Last updated