this repo has no description
at master 64 lines 1.6 kB view raw
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