Crate base95[][src]

Expand description

Textual representation of base 95 fractional numbers with arbitrary precision, intended to be used in real-time collaborative applications.

It can only represent numbers between 0 and 1, exclusive. The leading 0. is omitted.

Heavily inspired by this article.

Why 95?

  • UTF-8, the most popular Unicode encoding scheme, can encode ASCII as is. (1 byte per character)
  • ASCII has 95 printable characters in total, from space to tilde.

Example

use base95::Base95;
use std::str::FromStr;

let n1 = Base95::mid();
assert_eq!(n1.to_string(), "O");
assert_eq!(n1.raw_digits(), vec![47]);

let n2 = Base95::avg_with_zero(&n1);
assert_eq!(n2.to_string(), "7");
assert_eq!(n2.raw_digits(), vec![23]);

let n3 = Base95::avg_with_one(&n1);
assert_eq!(n3.to_string(), "g");
assert_eq!(n3.raw_digits(), vec![71]);

let n4 = Base95::avg(&n1, &n2);
assert_eq!(n4.to_string(), "C");
assert_eq!(n4.raw_digits(), vec![35]);

let n5 = Base95::from_str("j>Z= 4").unwrap();
assert_eq!(n5.raw_digits(), vec![74, 30, 58, 29, 0, 20]);

Why is avg imprecise?

One of main considerations of this representation is storage efficiency of fractional index. So it is better to have a little imprecise, shorter string, than perfectly precise, longer string.

Of course, the result is deterministic, i.e., if the input is same, the output will always be same.

Structs

Base95

Enums

ParseError