++aor
Alphabetical order
Computes whether a and b are in alphabetical order, producing a flag. Orders atoms before cells, and atoms in ascending LSB order.
Accepts
a is a noun.
b is a noun.
Produces
A flag.
Source
++ aor
~/ %aor
|= [a=* b=*]
^- ?
?: =(a b) &
?. ?=(@ a)
?: ?=(@ b) |
?: =(-.a -.b)
$(a +.a, b +.b)
$(a -.a, b -.b)
?. ?=(@ b) &
|-
=+ [c=(end 3 a) d=(end 3 b)]
?: =(c d)
$(a (rsh 3 a), b (rsh 3 b))
(lth c d)
Examples
> (aor 'a' 'b')
%.y
> (aor 'b' 'a')
%.n
> (aor 'a' 'a')
%.y
> (aor 1 2)
%.y
> (aor 2 1)
%.n
> (aor ['a' ~] 'b')
%.n
> (aor 'b' ['a' ~])
%.y
> (aor ['a' ~] ['b' ~])
%.y
> (aor ['b' ~] ['a' ~])
%.n
> (aor "abca" "abcz")
%.y
> (aor "abcz" "abca")
%.n
> (aor 0b1011 0b1010)
%.n
> (aor 0b1010 0b1011)
%.y
> (aor [1 2] [2 1])
%.y
> (aor [2 1] [1 2])
%.nNote the possible differences with +dor due to comparing one byte at a time:
> (aor 0b1001.0000.0000 0b1000.1000.0000)
%.y
> (dor 0b1001.0000.0000 0b1000.1000.0000)
%.nDiscussion
This is different than +dor in that it compares atoms one byte at a time, while +dor compares whole atoms at once. Note that because it simply compares bytes, it doesn't account for multi-byte UTF-8 characters and the like.
++dor
Depth order
Computes whether a and b are in ascending tree depth order, producing a flag. Orders atoms before cells, and atoms in ascending numerical order.
Accepts
a is a noun.
b is a noun.
Produces
A flag.
Source
++ dor
~/ %dor
|= [a=* b=*]
^- ?
?: =(a b) &
?. ?=(@ a)
?: ?=(@ b) |
?: =(-.a -.b)
$(a +.a, b +.b)
$(a -.a, b -.b)
?. ?=(@ b) &
(lth a b)
Examples
> (dor 1 2)
%.y
> (dor 2 1)
%.n
> (dor ~[1 2 3] ~[1 2 4])
%.y
> (dor ~[1 2 4] ~[1 2 3])
%.n
> (dor `(list @)`~[99 100 10.000] ~[99 101 10.000])
%.y
> (dor ~[99 101 10.999] `(list @)`~[99 100 10.000])
%.nNote the possible difference with +aor due to comparing whole atoms rather than one byte at a time:
> (aor 0b1001.0000.0000 0b1000.1000.0000)
%.y
> (dor 0b1001.0000.0000 0b1000.1000.0000)
%.nDiscussion
If a and b are both atoms, dor is equivalent to lte. If they're
cells, dor recurses on the heads, and then if the heads are the same it checks
the tails.
If one sample is a cell and the other is an atom, the cell sample is treated as "greater."
++gor
Mug order
Computes whether of (mug a) and (mug b) are in ascending numeric order,
producing a flag. If the mug hashes are equal, a and b are compared by
dor instead.
mug is the the 31-bit nonzero FNV-1a hash algorithm.
Accepts
a is a noun.
b is a noun.
Produces
A flag.
Source
++ gor
~/ %gor
|= [a=* b=*]
^- ?
=+ [c=(mug a) d=(mug b)]
?: =(c d)
(dor a b)
(lth c d)
Examples
> (gor 'd' 'c')
%.y
> 'd'
'd'
> 'c'
'c'
> `@ud`'d'
100
> `@ud`'c'
99
> (mug 'd')
1.628.185.714
> (mug 'c')
1.712.073.811
> (gor 'd' 'c')
%.y
> (gor 'c' 'd')
%.n> (gor "foo" "bar")
%.n> (gor (some 10) `(list @)`[1 2 3 ~])
%.nDiscussion
maps use gor on the key for horizontal ordering and mor for
vertical order. maps only look at the keys (the head of the key-value pair
elements) for ordering.
++mor
(more) mug order
Computes whether the double-hashes (mug (mug a)) and (mug (mug b)) are in
ascending numeric order, producing a flag. If the double-mug hashes are
equal, a and b are compared by dor instead.
mug is the the 31-bit nonzero FNV-1a hash algorithm.
Accepts
a is a noun
b is a noun
Produces
A flag.
Source
++ mor
~/ %mor
|= [a=* b=*]
^- ?
=+ [c=(mug (mug a)) d=(mug (mug b))]
?: =(c d)
(dor a b)
(lth c d)
Examples
> (mor 'f' 'g')
%.y
> [(mug 'f') (mug 'g')]
[1.661.740.952 1.644.963.335]
> [(mug (mug 'f')) (mug (mug 'g'))]
[261.421.509 1.861.258.547]
> (mor 'a' 'z')
%.n
> (mor 43.326 41.106)
%.nDiscussion
Maps, sets, and queues all use mor to check for vertical ordering. Maps and
sets also use gor for horizontal order, but queues use
vertical ordering alone.
Since hashing removes correlation, double-mugging with mor removes
correlation with single-mugged gor. Vertical order becomes uncorrelated
with horizontal order.