this repo has no description
1defmodule Hobbes.TestVersionMap do
2 @moduledoc """
3 This module contains a simple (and very inefficient) implementation of the VersionMap API
4 to be used for fuzz/simulation testing and model checking.
5 """
6
7 alias Hobbes.TestVersionMap
8
9 import Hobbes.Utils
10
11 @type t :: %__MODULE__{
12 ranges: list,
13 }
14 @enforce_keys [
15 :ranges,
16 ]
17 defstruct @enforce_keys
18
19 @spec new :: t
20 def new do
21 %TestVersionMap{
22 ranges: [],
23 }
24 end
25
26 @spec add_writes(t, non_neg_integer, list) :: t
27 def add_writes(%TestVersionMap{} = vm, version, writes) when is_list(writes) do
28 Enum.reduce(writes, vm.ranges, fn key_or_range, acc ->
29 range = case key_or_range do
30 {_sk, _ek} = tup -> tup
31 key -> {key, next_key(key)}
32 end
33 [{range, version} | acc]
34 end)
35 |> then(fn ranges ->
36 %{vm | ranges: ranges}
37 end)
38 end
39
40 @spec written_after?(t, non_neg_integer, {binary, binary} | binary) :: boolean
41 def written_after?(%TestVersionMap{} = vm, version, {_start_key, _end_key} = range) do
42 Enum.any?(vm.ranges, fn {r, ver} ->
43 ver > version and intersects?(range, r)
44 end)
45 end
46
47 def written_after?(%TestVersionMap{} = vm, version, key) when is_binary(key) do
48 written_after?(vm, version, {key, next_key(key)})
49 end
50
51 defp intersects?({sk1, ek1}, {sk2, ek2}) do
52 ek1 > sk2 and ek2 > sk1
53 end
54
55 @spec clear_old(t, non_neg_integer) :: t
56 def clear_old(%TestVersionMap{} = vm, up_to_version) do
57 Enum.reject(vm.ranges, fn {_range, ver} ->
58 ver <= up_to_version
59 end)
60 |> then(fn ranges ->
61 %{vm | ranges: ranges}
62 end)
63 end
64end