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