1%%% -*- coding: utf-8 -*- 2%%% -*- erlang-indent-level: 2 -*- 3%%% ------------------------------------------------------------------- 4%%% Copyright 2010-2017 Manolis Papadakis <manopapad@gmail.com>, 5%%% Eirini Arvaniti <eirinibob@gmail.com> 6%%% and Kostis Sagonas <kostis@cs.ntua.gr> 7%%% 8%%% This file is part of PropEr. 9%%% 10%%% PropEr is free software: you can redistribute it and/or modify 11%%% it under the terms of the GNU General Public License as published by 12%%% the Free Software Foundation, either version 3 of the License, or 13%%% (at your option) any later version. 14%%% 15%%% PropEr is distributed in the hope that it will be useful, 16%%% but WITHOUT ANY WARRANTY; without even the implied warranty of 17%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18%%% GNU General Public License for more details. 19%%% 20%%% You should have received a copy of the GNU General Public License 21%%% along with PropEr. If not, see <http://www.gnu.org/licenses/>. 22 23%%% @copyright 2010-2017 Manolis Papadakis, Eirini Arvaniti and Kostis Sagonas 24%%% @version {@version} 25%%% @author Manolis Papadakis 26%%% @doc Parametric wrapper to gb_trees module. 27%%% @private 28 29-module(proper_gb_trees). 30 31-export([empty/0, is_empty/1, size/1, lookup/2, get/2, insert/3, 32 update/3, enter/3, delete/2, delete_any/2, balance/1, 33 is_defined/2, keys/1, values/1, to_list/1, from_orddict/1, 34 smallest/1, largest/1, take_smallest/1, take_largest/1, 35 iterator/1, next/1, map/2]). 36 37-export_type([gb_tree/2, iterator/2]). 38 39-opaque gb_tree(K,V) :: gb_trees:tree(K,V). 40 41%% Based on the documentation alone, this is the best we can do. 42-type iterator(_K,_V) :: term(). 43 44%%------------------------------------------------------------------------------ 45%% API functions 46%%------------------------------------------------------------------------------ 47 48-spec empty() -> gb_tree(_K,_V). 49empty() -> 50 gb_trees:empty(). 51 52-spec is_empty(gb_tree(_K,_V)) -> boolean(). 53is_empty(Tree) -> 54 gb_trees:is_empty(Tree). 55 56-spec size(gb_tree(_K,_V)) -> non_neg_integer(). 57size(Tree) -> 58 gb_trees:size(Tree). 59 60-spec lookup(K, gb_tree(K,V)) -> 'none' | {'value', V}. 61lookup(Key, Tree) -> 62 gb_trees:lookup(Key, Tree). 63 64-spec is_defined(K, gb_tree(K,_V)) -> boolean(). 65is_defined(Key, Tree) -> 66 gb_trees:is_defined(Key, Tree). 67 68-spec get(K, gb_tree(K,V)) -> V. 69get(Key, Tree) -> 70 gb_trees:get(Key, Tree). 71 72-spec update(K, V, gb_tree(K,V)) -> gb_tree(K,V). 73update(Key, Value, Tree) -> 74 gb_trees:update(Key, Value, Tree). 75 76-spec insert(K, V, gb_tree(K,V)) -> gb_tree(K,V). 77insert(Key, Value, Tree) -> 78 gb_trees:insert(Key, Value, Tree). 79 80-spec enter(K, V, gb_tree(K,V)) -> gb_tree(K,V). 81enter(Key, Value, Tree) -> 82 gb_trees:enter(Key, Value, Tree). 83 84-spec balance(gb_tree(K,V)) -> gb_tree(K,V). 85balance(Tree) -> 86 gb_trees:balance(Tree). 87 88-spec from_orddict(proper_orddict:orddict(K,V)) -> gb_tree(K,V). 89from_orddict(Dict) -> 90 gb_trees:from_orddict(Dict). 91 92-spec delete_any(K, gb_tree(K,V)) -> gb_tree(K,V). 93delete_any(Key, Tree) -> 94 gb_trees:delete_any(Key, Tree). 95 96-spec delete(K, gb_tree(K,V)) -> gb_tree(K,V). 97delete(Key, Tree) -> 98 gb_trees:delete(Key, Tree). 99 100-spec take_smallest(gb_tree(K,V)) -> {K, V, gb_tree(K,V)}. 101take_smallest(Tree) -> 102 gb_trees:take_smallest(Tree). 103 104-spec smallest(gb_tree(K,V)) -> {K, V}. 105smallest(Tree) -> 106 gb_trees:smallest(Tree). 107 108-spec take_largest(gb_tree(K,V)) -> {K, V, gb_tree(K,V)}. 109take_largest(Tree) -> 110 gb_trees:take_largest(Tree). 111 112-spec largest(gb_tree(K,V)) -> {K, V}. 113largest(Tree) -> 114 gb_trees:largest(Tree). 115 116-spec to_list(gb_tree(K,V)) -> [{K, V}]. 117to_list(Tree) -> 118 gb_trees:to_list(Tree). 119 120-spec keys(gb_tree(K,_V)) -> [K]. 121keys(Tree) -> 122 gb_trees:keys(Tree). 123 124-spec values(gb_tree(_K,V)) -> [V]. 125values(Tree) -> 126 gb_trees:values(Tree). 127 128-spec iterator(gb_tree(K,V)) -> iterator(K,V). 129iterator(Tree) -> 130 gb_trees:iterator(Tree). 131 132-spec next(iterator(K,V)) -> 'none' | {K, V, iterator(K,V)}. 133next(Iter) -> 134 gb_trees:next(Iter). 135 136-spec map(fun((K,V1) -> V2), gb_tree(K,V1)) -> gb_tree(K,V2). 137map(Fun, Tree) -> 138 gb_trees:map(Fun, Tree). 139