How is RelShared
intended on being used in CanCan? (It’s not fully implemented so I can only guess what the intentions are.)
The non-shared Rel
type is defined as:
public type Rel<X, Y> = {
forw : Trie.Trie2D<X, Y, ()> ;
back : Trie.Trie2D<Y, X, ()> ;
hash : HashPair<X, Y> ;
equal : EqualPair<X, Y> ;
};
Whereas RelShared
is defined as:
public type RelShared<X, Y> = {
forw : Trie.Trie2D<X, Y, ()> ;
//
// No HO functions, and no backward direction:
// In a serialized message form, the backward direction is redundant
// and can be recomputed in linear time from the forw field.
//
// back : Trie.Trie2D<Y, X, ()> ;
};
^ I’m not sure what HO means here—is it the hash and equal functions?
Also, does RelShared
omit the back
field because RelShared
is intended only to be used as persistent stable
storage with all of the actual query logic instead going to a Rel
data structure that’s initialized from RelShared
during canister creation? This way, the back
field in Rel
can be initialized from the forw
field in RelShared
in the same pass over RelShared
.
Related to this… I’ve heard that a canister’s stable storage limit will be increased from 4 GB to something much larger in the near future. If this is the case, then how would a, say, 80 GB stable RelShared
initialize a non-stable Rel
, if a canister’s non-stable, linear memory is still capped at 4 GB?
Thanks!