core/Blob
Module for working with Blobs (immutable sequences of bytes).
Blobs represent sequences of bytes. They are immutable, iterable, but not indexable and can be empty.
Byte sequences are also often represented as [Nat8]
, i.e. an array of bytes, but this representation is currently much less compact than Blob
, taking 4 physical bytes to represent each logical byte in the sequence.
If you would like to manipulate Blobs, it is recommended that you convert
Blobs to [var Nat8]
or Buffer<Nat8>
, do the manipulation, then convert back.
Import from the core library to use this module.
import Blob "mo:core/Blob";
Some built in features not listed in this module:
- You can create a
Blob
literal from aText
literal, provided the context expects an expression of typeBlob
. b.size() : Nat
returns the number of bytes in the blobb
;b.values() : Iter.Iter<Nat8>
returns an iterator to enumerate the bytes of the blobb
.
For example:
import Debug "mo:core/Debug";
import Nat8 "mo:core/Nat8";
let blob = "\00\00\00\ff" : Blob; // blob literals, where each byte is delimited by a back-slash and represented in hex
let blob2 = "charsもあり" : Blob; // you can also use characters in the literals
let numBytes = blob.size();
assert numBytes == 4; // returns the number of bytes in the Blob
for (byte in blob.values()) { // iterator over the Blob
Debug.print(Nat8.toText(byte))
}
Type Blob
type Blob = Prim.Types.Blob
Function empty
func empty() : Blob
Returns an empty Blob
(equivalent to ""
).
Example:
let emptyBlob = Blob.empty();
assert emptyBlob.size() == 0;
Function isEmpty
func isEmpty(blob : Blob) : Bool
Returns whether the given Blob
is empty (has a size of zero).
let blob1 = "" : Blob;
let blob2 = "\FF\00" : Blob;
assert Blob.isEmpty(blob1);
assert not Blob.isEmpty(blob2);
Function size
func size(blob : Blob) : Nat
Returns the number of bytes in the given Blob
.
This is equivalent to blob.size()
.
Example:
let blob = "\FF\00\AA" : Blob;
assert Blob.size(blob) == 3;
assert blob.size() == 3;
Function fromArray
func fromArray(bytes : [Nat8]) : Blob
Creates a Blob
from an array of bytes ([Nat8]
), by copying each element.
Example:
let bytes : [Nat8] = [0, 255, 0];
let blob = Blob.fromArray(bytes);
assert blob == "\00\FF\00";
Function fromVarArray
func fromVarArray(bytes : [var Nat8]) : Blob
Creates a Blob
from a mutable array of bytes ([var Nat8]
), by copying each element.
Example:
let bytes : [var Nat8] = [var 0, 255, 0];
let blob = Blob.fromVarArray(bytes);
assert blob == "\00\FF\00";
Function toArray
func toArray(blob : Blob) : [Nat8]
Converts a Blob
to an array of bytes ([Nat8]
), by copying each element.
Example:
let blob = "\00\FF\00" : Blob;
let bytes = Blob.toArray(blob);
assert bytes == [0, 255, 0];
Function toVarArray
func toVarArray(blob : Blob) : [var Nat8]
Converts a Blob
to a mutable array of bytes ([var Nat8]
), by copying each element.
Example:
import Nat8 "mo:core/Nat8";
import VarArray "mo:core/VarArray";
let blob = "\00\FF\00" : Blob;
let bytes = Blob.toVarArray(blob);
assert VarArray.equal<Nat8>(bytes, [var 0, 255, 0], Nat8.equal);
Function hash
func hash(blob : Blob) : Types.Hash
Returns the (non-cryptographic) hash of blob
.
Example:
let blob = "\00\FF\00" : Blob;
let h = Blob.hash(blob);
assert h == 1_818_567_776;
Function compare
func compare(b1 : Blob, b2 : Blob) : Order.Order
General purpose comparison function for Blob
by comparing the value of
the bytes. Returns the Order
(either #less
, #equal
, or #greater
)
by comparing blob1
with blob2
.
Example:
let blob1 = "\00\00\00" : Blob;
let blob2 = "\00\FF\00" : Blob;
let result = Blob.compare(blob1, blob2);
assert result == #less;
Function equal
func equal(blob1 : Blob, blob2 : Blob) : Bool
Equality function for Blob
types.
This is equivalent to blob1 == blob2
.
Example:
let blob1 = "\00\FF\00" : Blob;
let blob2 = "\00\FF\00" : Blob;
assert Blob.equal(blob1, blob2);
Note: The reason why this function is defined in this library (in addition
to the existing ==
operator) is so that you can use it as a function value
to pass to a higher order function.
Example:
import List "mo:core/List";
let list1 = List.singleton<Blob>("\00\FF\00");
let list2 = List.singleton<Blob>("\00\FF\00");
assert List.equal(list1, list2, Blob.equal);
Function notEqual
func notEqual(blob1 : Blob, blob2 : Blob) : Bool
Inequality function for Blob
types.
This is equivalent to blob1 != blob2
.
Example:
let blob1 = "\00\AA\AA" : Blob;
let blob2 = "\00\FF\00" : Blob;
assert Blob.notEqual(blob1, blob2);
Note: The reason why this function is defined in this library (in addition
to the existing !=
operator) is so that you can use it as a function value
to pass to a higher order function.
Function less
func less(blob1 : Blob, blob2 : Blob) : Bool
"Less than" function for Blob
types.
This is equivalent to blob1 < blob2
.
Example:
let blob1 = "\00\AA\AA" : Blob;
let blob2 = "\00\FF\00" : Blob;
assert Blob.less(blob1, blob2);
Note: The reason why this function is defined in this library (in addition
to the existing <
operator) is so that you can use it as a function value
to pass to a higher order function.
Function lessOrEqual
func lessOrEqual(blob1 : Blob, blob2 : Blob) : Bool
"Less than or equal to" function for Blob
types.
This is equivalent to blob1 <= blob2
.
Example:
let blob1 = "\00\AA\AA" : Blob;
let blob2 = "\00\FF\00" : Blob;
assert Blob.lessOrEqual(blob1, blob2);
Note: The reason why this function is defined in this library (in addition
to the existing <=
operator) is so that you can use it as a function value
to pass to a higher order function.
Function greater
func greater(blob1 : Blob, blob2 : Blob) : Bool
"Greater than" function for Blob
types.
This is equivalent to blob1 > blob2
.
Example:
let blob1 = "\BB\AA\AA" : Blob;
let blob2 = "\00\00\00" : Blob;
assert Blob.greater(blob1, blob2);
Note: The reason why this function is defined in this library (in addition
to the existing >
operator) is so that you can use it as a function value
to pass to a higher order function.
Function greaterOrEqual
func greaterOrEqual(blob1 : Blob, blob2 : Blob) : Bool
"Greater than or equal to" function for Blob
types.
This is equivalent to blob1 >= blob2
.
Example:
let blob1 = "\BB\AA\AA" : Blob;
let blob2 = "\00\00\00" : Blob;
assert Blob.greaterOrEqual(blob1, blob2);
Note: The reason why this function is defined in this library (in addition
to the existing >=
operator) is so that you can use it as a function value
to pass to a higher order function.