Add Tree.is_val and Tree.Contents.is_val functions#1864
Add Tree.is_val and Tree.Contents.is_val functions#1864samoht wants to merge 2 commits intomirage:mainfrom
Tree.is_val and Tree.Contents.is_val functions#1864Conversation
|
Not ready to merge, I'm just opening this to start the discussion early. |
These functions check whether the node/contents are available in memory or not (ie. if calling a function on those could incur IO costs).
Codecov Report
@@ Coverage Diff @@
## main #1864 +/- ##
==========================================
+ Coverage 64.25% 64.27% +0.01%
==========================================
Files 118 118
Lines 14317 14339 +22
==========================================
+ Hits 9199 9216 +17
- Misses 5118 5123 +5
📣 Codecov can now indicate which changes are the most critical in Pull Requests. Learn more |
|
Added a few tests, it's ready to reviewing now. |
| (** [is_val t k] is [true] iff the path [k] has already been forced in [t]. In | ||
| that case, that means that all the nodes traversed by [k] are loaded in | ||
| memory. If the leaf node is a contents [c], then [Contents.is_val c] | ||
| should also be [true]. *) |
There was a problem hiding this comment.
maybe the doc should also mention that it returns true also when there is no node at the path given
| value is not present in the underlying repository. *) | ||
|
|
||
| val is_val : t -> bool | ||
| (** [is_val x] is [true] iff [x] has already been forced (and so is loaded |
There was a problem hiding this comment.
| (** [is_val x] is [true] iff [x] has already been forced (and so is loaded | |
| (** [is_val t] is [true] iff [t] has already been forced (and so is loaded |
|
|
||
| let test_lazy_tree x () = | ||
| let is_val_aux v t k = | ||
| let str = Fmt.str "empty is_val %a" Irmin.Type.(pp S.path_t) k in |
There was a problem hiding this comment.
| let str = Fmt.str "empty is_val %a" Irmin.Type.(pp S.path_t) k in | |
| let str = Fmt.str "is_val %a" Irmin.Type.(pp S.path_t) k in |
| is_not_val v1 []; | ||
| is_not_val v1 [ "a" ]; | ||
|
|
||
| let* _ = S.Tree.find_tree v1 [ "a" ] in |
There was a problem hiding this comment.
| let* _ = S.Tree.find_tree v1 [ "a" ] in | |
| let* _ = S.Tree.find_tree v1 [ "a" ] in | |
| is_val v1 []; | |
| is_val v1 [ "a" ]; | |
| let* _ = S.Tree.find_tree v1 [ "b" ] in | |
| is_val v1 []; | |
| is_val v1 [ "b" ]; |
the returned value here is None, there is no node at "a" in r1 (see https://github.com/mirage/irmin/blob/main/src/irmin-test/common.ml#L197). I think you meant to test for an existing path in the tree.
However the test for "b" fails, I would have expected it to pass.
|
|
||
| S.Tree.clear v1; | ||
| is_not_val v1 []; | ||
| is_not_val v1 [ "a" ]; |
There was a problem hiding this comment.
| is_not_val v1 [ "a" ]; | |
| is_not_val v1 [ "b" ]; |
| S.Tree.clear v1; | ||
| is_not_val v1 []; | ||
| is_not_val v1 [ "a" ]; | ||
|
|
There was a problem hiding this comment.
I propose to also add a test for an update in lazy tree, for instance:
let* x = S.Tree.add v1 [ "c"; "d" ] "x" in
is_val x [ "c"; "d" ];
is_not_val v1 [ "b" ];
These functions check whether the node/contents are available in
memory or not (ie. if calling a function on those could incur IO
costs).