diff options
Diffstat (limited to '')
| -rw-r--r-- | lib/Utilities.ml | 17 | ||||
| -rw-r--r-- | lib/Utilities.mli | 6 |
2 files changed, 23 insertions, 0 deletions
diff --git a/lib/Utilities.ml b/lib/Utilities.ml index 9ae0119..0a5bd9d 100644 --- a/lib/Utilities.ml +++ b/lib/Utilities.ml @@ -10,3 +10,20 @@ module Result = struct ms (Ok []) end + +module Atomic = struct + let rec swap atom f = + let v = Atomic.get atom in + let v' = f v in + if Atomic.compare_and_set atom v v' + then atom + else swap atom f + + let rec mswap atom f = + let open Result in + let v = Atomic.get atom in + let* v' = f v in + if Atomic.compare_and_set atom v v' + then Ok atom + else mswap atom f +end diff --git a/lib/Utilities.mli b/lib/Utilities.mli index cdb53df..34a03e9 100644 --- a/lib/Utilities.mli +++ b/lib/Utilities.mli @@ -3,3 +3,9 @@ module Result : sig val fmap : ('a -> ('b, 'e) result) -> ('a, 'e) result -> ('b, 'e) result val sequence : ('a, 'b) result list -> ('a list, 'b) result end + +module Atomic : sig + val swap : 'a Atomic.t -> ('a -> 'a) -> 'a Atomic.t + (* This is silly *) + val mswap : 'a Atomic.t -> ('a -> ('a, 'b) result) -> ('a Atomic.t, 'b) result +end |
