package octez-internal-libs
A package that contains some libraries used by the Octez suite
Install
Dune Dependency
Authors
Maintainers
Sources
tezos-octez-v20.1.tag.bz2
sha256=ddfb5076eeb0b32ac21c1eed44e8fc86a6743ef18ab23fff02d36e365bb73d61
sha512=d22a827df5146e0aa274df48bc2150b098177ff7e5eab52c6109e867eb0a1f0ec63e6bfbb0e3645a6c2112de3877c91a17df32ccbff301891ce4ba630c997a65
doc/src/octez-internal-libs.irmin/lru.ml.html
Source file lru.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
(* Copyright (c) 2016 David Kaloper Meršinjak Copyright (c) 2013-2022 Thomas Gazagnaire <thomas@gazagnaire.org> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *) (* Extracted from https://github.com/pqwy/lru *) module Make (H : Hashtbl.HashedType) = struct module HT = Hashtbl.Make (H) module Q = struct type 'a node = { value : 'a; mutable next : 'a node option; mutable prev : 'a node option; } type 'a t = { mutable first : 'a node option; mutable last : 'a node option; } let detach t n = let np = n.prev and nn = n.next in (match np with | None -> t.first <- nn | Some x -> x.next <- nn; n.prev <- None); match nn with | None -> t.last <- np | Some x -> x.prev <- np; n.next <- None let append t n = let on = Some n in match t.last with | Some x as l -> x.next <- on; t.last <- on; n.prev <- l | None -> t.first <- on; t.last <- on let node x = { value = x; prev = None; next = None } let create () = { first = None; last = None } let iter t f = let rec aux f = function | Some n -> let next = n.next in f n.value; aux f next | _ -> () in aux f t.first let clear t = t.first <- None; t.last <- None end type key = HT.key type 'a t = { ht : (key * 'a) Q.node HT.t; q : (key * 'a) Q.t; mutable cap : cap; mutable w : int; } and cap = Uncapped | Capped of int let weight t = t.w let create cap = let cap, ht_cap = if cap < 0 then (Uncapped, 65536) else (Capped cap, cap) in { cap; w = 0; ht = HT.create ht_cap; q = Q.create () } let drop t = match t.q.first with | None -> None | Some ({ Q.value = k, v; _ } as n) -> t.w <- t.w - 1; HT.remove t.ht k; Q.detach t.q n; Some v let remove t k = try let n = HT.find t.ht k in t.w <- t.w - 1; HT.remove t.ht k; Q.detach t.q n with Not_found -> () let add t k v = let add t k v = remove t k; let n = Q.node (k, v) in t.w <- t.w + 1; HT.add t.ht k n; Q.append t.q n in match t.cap with | Capped c when c = 0 -> () | Uncapped -> add t k v | Capped c -> add t k v; if weight t > c then let _ = drop t in () let promote t k = try let n = HT.find t.ht k in Q.( detach t.q n; append t.q n) with Not_found -> () let find t k = let v = HT.find t.ht k in promote t k; snd v.value let mem t k = match HT.mem t.ht k with | false -> false | true -> promote t k; true let iter t f = Q.iter t.q (fun (k, v) -> f k v) let clear t = t.w <- 0; HT.clear t.ht; Q.clear t.q end
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>