-
Notifications
You must be signed in to change notification settings - Fork 157
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Tree.is_val
and Tree.Contents.is_val
functions
#1864
base: main
Are you sure you want to change the base?
Conversation
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe the doc should also mention that it returns true also when there is no node at the path given
@@ -128,6 +134,10 @@ module type S = sig | |||
(** Equivalent to {!val-force}, but raises an exception if the lazy content | |||
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(** [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 |
@@ -1417,6 +1417,37 @@ module Make (S : Generic_key) = struct | |||
in | |||
run x test | |||
|
|||
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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).