diff --git a/doc/lets.md b/doc/lets.md
index 5db689e..5ea32e6 100644
--- a/doc/lets.md
+++ b/doc/lets.md
@@ -16,6 +16,14 @@
+###cont()##
+
+
+
+__abstract datatype__: `cont()`
+
+
+
###db_opts()##
@@ -56,6 +64,14 @@
+###item()##
+
+
+
+item() = owner | name | named_table | type | keypos | protection | compressed | async | memory | size
+
+
+
###key()##
@@ -64,6 +80,30 @@
+###limit()##
+
+
+
+limit() = pos_integer()
+
+
+
+###match()##
+
+
+
+match() = term()
+
+
+
+###name()##
+
+
+
+name() = atom()
+
+
+
###object()##
@@ -80,6 +120,36 @@
+###pattern()##
+
+
+
+pattern() = atom() | tuple()
+
+
+
+
+ets:match_pattern() is not exported!
+
+
+
+
+###pos()##
+
+
+
+pos() = pos_integer()
+
+
+
+###spec()##
+
+
+
+spec() = [ets:match_spec()](ets.md#type-match_spec)
+
+
+
###tab()##
@@ -94,8 +164,8 @@ __abstract datatype__: `tab()`
guaranteed to be atomic and isolated. This function only applies
to the ets implementation..destroy/2 | Destroy the contents of the specified table. This function
only applies to driver and nif implementations. . |
first/1 | Returns the first key Key in the table Tab. If the table
-is empty, $end_of_table will be returned. . |
info/2 | Returns information about the table Tab as a list of {Item,
- Value} tuples.
+is empty, $end_of_table will be returned.. |
foldl/3 | Fold from left to right over the elements of the table. . |
foldr/3 | Fold from right to left over the elements of the table. . |
info/1 | Returns information about the table Tab as a list of {Item,
+ Value} tuples. . |
info/2 | Returns the information associated with Item for the table Tab.
Valid +Item+ options are:
@@ -152,11 +222,21 @@ is empty, $end_of_table will be returned.. |
.
insert/2 | Inserts the object or all of the objects in the list
-ObjectOrObjects into the table Tab. . |
insert_new/2 | This function works exactly like insert/2, with the
+ObjOrObjs into the table Tab. . |
insert_new/2 | This function works exactly like insert/2, with the
exception that instead of overwriting objects with the same key, it
simply returns false. This function only applies to the ets
-implementation. . |
lookup/2 | Returns a list of all objects with the key Key in the table
-Tab. . |
new/2 | Creates a new table and returns a table identifier which can
+implementation. . |
last/1 | Returns the last key Key in the table Tab. If the table
+is empty, $end_of_table will be returned. . |
lookup/2 | Returns a list of all objects with the key Key in the table
+Tab. . |
lookup_element/3 | Returns the Pos:th element of the object with the key Key
+in the table Tab. . |
match/1 | Continues a match started with match/3. . |
match/2 | Matches the objects in the table Tab against the pattern
+Pattern. . |
match/3 | Matches the objects in the table Tab against the pattern
+Pattern and returns a limited (Limit) number of matching
+objects. . |
match_delete/2 | Deletes all objects which match the pattern Pattern from the
+table Tab. . |
match_object/1 | Continues a match started with match_object/3. . |
match_object/2 | Matches the objects in the table Tab against the pattern
+Pattern. . |
match_object/3 | Matches the objects in the table Tab against the pattern
+Pattern and returns a limited (Limit) number of matching
+objects. . |
member/2 | Returns true if one or more elements in the table Tab has
+the key Key, false otherwise. . |
new/2 | Creates a new table and returns a table identifier which can
be used in subsequent operations. The table identifier can be sent
to other processes so that a table can be shared between different
processes within a node.
@@ -343,11 +423,20 @@ considered complete. The default is false.
. |
next/2 | Returns the next key Key2, following the key Key1 in the
table Tab. If there is no next key, $end_of_table is
+returned. . |
prev/2 | Returns the previous key Key2, following the key Key1 in
+the table Tab. If there is no previous key, $end_of_table is
returned. . |
repair/2 | If a table cannot be opened, you may attempt to call this
method to resurrect as much of the contents of the table as
possible. Some data may be lost, so be careful when calling this
function on a table that contains important information. This
-function only applies to driver and nif implementations. . |
tab2list/1 | Returns a list of all objects in the table Tab. The
+function only applies to driver and nif implementations. . |
select/1 | Continues a select started with select/3. . |
select/2 | Matches the objects in the table Tab against the spec
+Spec. . |
select/3 | Matches the objects in the table Tab against the spec Spec
+and returns a limited (Limit) number of matching objects. . |
select_count/2 | Counts all objects which match the spec Spec from the
+table Tab and returns the number matched. . |
select_delete/2 | Deletes all objects which match the spec Spec from the
+table Tab and returns the number deleted. . |
select_reverse/1 | Continues a select reverse started with select_reverse/3. . |
select_reverse/2 | Matches in reverse the objects in the table Tab against the
+spec Spec. . |
select_reverse/3 | Matches in reverse the objects in the table Tab against the
+spec Spec and returns a limited (Limit) number of matching
+objects. . |
tab2list/1 | Returns a list of all objects in the table Tab. The
operation is not guaranteed to be atomic and isolated. . |
@@ -412,7 +501,7 @@ __See also:__ [ets:delete_all_objects/1](ets.md#delete_all_objects-1).
+__See also:__ [ets:first/1](ets.md#first-1).
-###info/2##
+###foldl/3##
-info(Tab::[tab()](#type-tab), Item::atom()) -> term()
+foldl(Fun, Acc0::term(), Tab::[tab()](#type-tab)) -> Acc1::term()
+
+
+
+
+Fold from left to right over the elements of the table.
+
+
+__See also:__ [ets:foldl/3](ets.md#foldl-3).
+
+###foldr/3##
+
+
+
+
+foldr(Fun, Acc0::term(), Tab::[tab()](#type-tab)) -> Acc1::term()
+
+
+
+
+Fold from right to left over the elements of the table.
+
+
+__See also:__ [ets:foldr/3](ets.md#foldr-3).
+
+###info/1##
+
+
+
+
+info(Tab::[tab()](#type-tab)) -> [{[item()](#type-item), term()}]
@@ -454,6 +573,22 @@ __See also:__ [ets:first/1](ets.md#first-1).
Value} tuples.
+__See also:__ [info/2](#info-2).
+
+###info/2##
+
+
+
+
+info(Tab::[tab()](#type-tab), Item::[item()](#type-item)) -> term()
+
+
+
+
+
+Returns the information associated with Item for the table Tab.
+
+
Valid +Item+ options are:
@@ -517,14 +652,14 @@ __See also:__ [ets:info/2](ets.md#info-2).
-
insert(Tab::[tab()](#type-tab), ObjectOrObjects::[object()](#type-object) | [[object()](#type-object)]) -> true
+insert(Tab::[tab()](#type-tab), ObjOrObjs::[object()](#type-object) | [[object()](#type-object)]) -> true
Inserts the object or all of the objects in the list
-ObjectOrObjects into the table Tab.
+ObjOrObjs into the table Tab.
__See also:__ [ets:insert/2](ets.md#insert-2).
@@ -534,7 +669,7 @@ __See also:__ [ets:insert/2](ets.md#insert-2).
-insert_new(Tab::[tab()](#type-tab), ObjectOrObjects::[object()](#type-object) | [[object()](#type-object)]) -> true
+insert_new(Tab::[tab()](#type-tab), ObjOrObjs::[object()](#type-object) | [[object()](#type-object)]) -> true
@@ -546,7 +681,24 @@ simply returns false. This function only applies to the ets
implementation.
-__See also:__ [ets:insert_new/2](ets.md#insert_new-2).
+__See also:__ [ets:insert_new/2](ets.md#insert_new-2).
+
+###last/1##
+
+
+
+
+last(Tab::[tab()](#type-tab)) -> [key()](#type-key) | '$end_of_table'
+
+
+
+
+
+Returns the last key Key in the table Tab. If the table
+is empty, $end_of_table will be returned.
+
+
+__See also:__ [ets:last/1](ets.md#last-1).
###lookup/2##
@@ -563,14 +715,167 @@ __See also:__ [ets:insert_new/2](ets.md#insert_new-2).
Tab.
-__See also:__ [ets:lookup/2](ets.md#lookup-2).
+__See also:__ [ets:lookup/2](ets.md#lookup-2).
+
+###lookup_element/3##
+
+
+
+
+lookup_element(Tab::[tab()](#type-tab), Key::[key()](#type-key), Pos::[pos()](#type-pos)) -> term()
+
+
+
+
+
+Returns the Pos:th element of the object with the key Key
+in the table Tab.
+
+
+__See also:__ [ets:lookup_element/3](ets.md#lookup_element-3).
+
+###match/1##
+
+
+
+
+match(X1::[cont()](#type-cont)) -> {[[match()](#type-match)], [cont()](#type-cont)} | '$end_of_table'
+
+
+
+
+
+Continues a match started with match/3.
+
+
+__See also:__ [ets:match/1](ets.md#match-1).
+
+###match/2##
+
+
+
+
+match(Tab::[tab()](#type-tab), Pattern::[pattern()](#type-pattern)) -> [[match()](#type-match)]
+
+
+
+
+
+Matches the objects in the table Tab against the pattern
+Pattern.
+
+
+__See also:__ [ets:match/2](ets.md#match-2).
+
+###match/3##
+
+
+
+
+match(Tab::[tab()](#type-tab), Pattern::[pattern()](#type-pattern), Limit::[limit()](#type-limit)) -> {[[match()](#type-match)], [cont()](#type-cont)} | '$end_of_table'
+
+
+
+
+
+Matches the objects in the table Tab against the pattern
+Pattern and returns a limited (Limit) number of matching
+objects.
+
+
+__See also:__ [ets:match/3](ets.md#match-3).
+
+###match_delete/2##
+
+
+
+
+match_delete(Tab::[tab()](#type-tab), Pattern::[pattern()](#type-pattern)) -> true
+
+
+
+
+
+Deletes all objects which match the pattern Pattern from the
+table Tab.
+
+
+__See also:__ [ets:match_delete/2](ets.md#match_delete-2).
+
+###match_object/1##
+
+
+
+
+match_object(X1::[cont()](#type-cont)) -> {[[match()](#type-match)], [cont()](#type-cont)} | '$end_of_table'
+
+
+
+
+
+Continues a match started with match_object/3.
+
+
+__See also:__ [ets:match_object/1](ets.md#match_object-1).
+
+###match_object/2##
+
+
+
+
+match_object(Tab::[tab()](#type-tab), Pattern::[pattern()](#type-pattern)) -> [[match()](#type-match)]
+
+
+
+
+
+Matches the objects in the table Tab against the pattern
+Pattern.
+
+
+__See also:__ [ets:match_object/2](ets.md#match_object-2).
+
+###match_object/3##
+
+
+
+
+match_object(Tab::[tab()](#type-tab), Pattern::[pattern()](#type-pattern), Limit::[limit()](#type-limit)) -> {[[match()](#type-match)], [cont()](#type-cont)} | '$end_of_table'
+
+
+
+
+
+Matches the objects in the table Tab against the pattern
+Pattern and returns a limited (Limit) number of matching
+objects.
+
+
+__See also:__ [ets:match_object/3](ets.md#match_object-3).
+
+###member/2##
+
+
+
+
+member(Tab::[tab()](#type-tab), Key::[key()](#type-key)) -> true | false
+
+
+
+
+
+Returns true if one or more elements in the table Tab has
+the key Key, false otherwise.
+
+
+__See also:__ [ets:member/2](ets.md#member-2).
###new/2##
-new(Name::atom(), Options::[opts()](#type-opts)) -> [tab()](#type-tab)
+new(Name::[name()](#type-name), Opts::[opts()](#type-opts)) -> [tab()](#type-tab)
@@ -782,14 +1087,32 @@ table Tab. If there is no next key, $end_of_table is
returned.
-__See also:__ [ets:next/2](ets.md#next-2).
+__See also:__ [ets:next/2](ets.md#next-2).
+
+###prev/2##
+
+
+
+
+prev(Tab::[tab()](#type-tab), Key::[key()](#type-key)) -> [key()](#type-key) | '$end_of_table'
+
+
+
+
+
+Returns the previous key Key2, following the key Key1 in
+the table Tab. If there is no previous key, $end_of_table is
+returned.
+
+
+__See also:__ [ets:prev/2](ets.md#prev-2).
###repair/2##
-repair(Name::atom(), Options::[opts()](#type-opts)) -> true
+repair(Name::[name()](#type-name), Opts::[opts()](#type-opts)) -> true
@@ -800,7 +1123,142 @@ method to resurrect as much of the contents of the table as
possible. Some data may be lost, so be careful when calling this
function on a table that contains important information. This
function only applies to driver and nif implementations.
-
+
+
+###select/1##
+
+
+
+
+select(X1::[cont()](#type-cont)) -> {[[match()](#type-match)], [cont()](#type-cont)} | '$end_of_table'
+
+
+
+
+
+Continues a select started with select/3.
+
+
+__See also:__ [ets:select/1](ets.md#select-1).
+
+###select/2##
+
+
+
+
+select(Tab::[tab()](#type-tab), Spec::[spec()](#type-spec)) -> [[match()](#type-match)]
+
+
+
+
+
+Matches the objects in the table Tab against the spec
+Spec.
+
+
+__See also:__ [ets:select/2](ets.md#select-2).
+
+###select/3##
+
+
+
+
+select(Tab::[tab()](#type-tab), Spec::[spec()](#type-spec), Limit::[limit()](#type-limit)) -> {[[match()](#type-match)], [cont()](#type-cont)} | '$end_of_table'
+
+
+
+
+
+Matches the objects in the table Tab against the spec Spec
+and returns a limited (Limit) number of matching objects.
+
+
+__See also:__ [ets:select/3](ets.md#select-3).
+
+###select_count/2##
+
+
+
+
+select_count(Tab::[tab()](#type-tab), Spec::[pattern()](#type-pattern)) -> pos_integer()
+
+
+
+
+
+Counts all objects which match the spec Spec from the
+table Tab and returns the number matched.
+
+
+__See also:__ [ets:select_count/2](ets.md#select_count-2).
+
+###select_delete/2##
+
+
+
+
+select_delete(Tab::[tab()](#type-tab), Spec::[pattern()](#type-pattern)) -> pos_integer()
+
+
+
+
+
+Deletes all objects which match the spec Spec from the
+table Tab and returns the number deleted.
+
+
+__See also:__ [ets:select_delete/2](ets.md#select_delete-2).
+
+###select_reverse/1##
+
+
+
+
+select_reverse(X1::[cont()](#type-cont)) -> {[[match()](#type-match)], [cont()](#type-cont)} | '$end_of_table'
+
+
+
+
+
+Continues a select reverse started with select_reverse/3.
+
+
+__See also:__ [ets:select_reverse/1](ets.md#select_reverse-1).
+
+###select_reverse/2##
+
+
+
+
+select_reverse(Tab::[tab()](#type-tab), Spec::[spec()](#type-spec)) -> [[match()](#type-match)]
+
+
+
+
+
+Matches in reverse the objects in the table Tab against the
+spec Spec.
+
+
+__See also:__ [ets:select_reverse/2](ets.md#select_reverse-2).
+
+###select_reverse/3##
+
+
+
+
+select_reverse(Tab::[tab()](#type-tab), Spec::[spec()](#type-spec), Limit::[limit()](#type-limit)) -> {[[match()](#type-match)], [cont()](#type-cont)} | '$end_of_table'
+
+
+
+
+
+Matches in reverse the objects in the table Tab against the
+spec Spec and returns a limited (Limit) number of matching
+objects.
+
+
+__See also:__ [ets:select_reverse/3](ets.md#select_reverse-3).
###tab2list/1##
diff --git a/doc/lets_drv.md b/doc/lets_drv.md
index d70a155..8016aa7 100644
--- a/doc/lets_drv.md
+++ b/doc/lets_drv.md
@@ -12,13 +12,22 @@
##Function Index##
-
+
##Function Details##
+
+
+###delete/1##
+
+
+
+
+`delete(Tab) -> any()`
+
###delete/2##
@@ -26,25 +35,16 @@
-`delete(Tab, Impl) -> any()`
+`delete(Tab, Key) -> any()`
-
+
-###delete/3##
+###delete_all_objects/1##
-`delete(Tab, Impl, Key) -> any()`
-
-
-
-###delete_all_objects/2##
-
-
-
-
-`delete_all_objects(Tab, Impl) -> any()`
+`delete_all_objects(Tab) -> any()`
@@ -55,68 +55,176 @@
`destroy(Tab, Options, ReadOptions, WriteOptions) -> any()`
-
+
-###first/2##
+###first/1##
-`first(Tab, Impl) -> any()`
+`first(Tab) -> any()`
-
+
-###info_memory/2##
+###foldl/3##
-`info_memory(Tab, Impl) -> any()`
+`foldl(Fun, Acc0, Tab) -> any()`
-
+
-###info_size/2##
+###foldr/3##
-`info_size(Tab, Impl) -> any()`
+`foldr(Fun, Acc0, Tab) -> any()`
-
+
-###insert/3##
+###info_memory/1##
-`insert(Tab, Impl, Object) -> any()`
+`info_memory(Tab) -> any()`
-
+
-###insert_new/3##
+###info_size/1##
-`insert_new(Tab, Impl, Object) -> any()`
+`info_size(Tab) -> any()`
-
+
-###lookup/3##
+###insert/2##
-`lookup(Tab, Impl, Key) -> any()`
+`insert(Tab, Object) -> any()`
-
+
-###next/3##
+###insert_new/2##
-`next(Tab, Impl, Key) -> any()`
+`insert_new(Tab, Object) -> any()`
+
+
+
+###last/1##
+
+
+
+
+`last(Tab) -> any()`
+
+
+
+###lookup/2##
+
+
+
+
+`lookup(Tab, Key) -> any()`
+
+
+
+###lookup_element/3##
+
+
+
+
+`lookup_element(Tab, Key, Pos) -> any()`
+
+
+
+###match/1##
+
+
+
+
+`match(Cont) -> any()`
+
+
+
+###match/2##
+
+
+
+
+`match(Tab, Pattern) -> any()`
+
+
+
+###match/3##
+
+
+
+
+`match(Tab, Pattern, Limit) -> any()`
+
+
+
+###match_delete/2##
+
+
+
+
+`match_delete(Tab, Pattern) -> any()`
+
+
+
+###match_object/1##
+
+
+
+
+`match_object(Cont) -> any()`
+
+
+
+###match_object/2##
+
+
+
+
+`match_object(Tab, Pattern) -> any()`
+
+
+
+###match_object/3##
+
+
+
+
+`match_object(Tab, Pattern, Limit) -> any()`
+
+
+
+###member/2##
+
+
+
+
+`member(Tab, Key) -> any()`
+
+
+
+###next/2##
+
+
+
+
+`next(Tab, Key) -> any()`
@@ -127,6 +235,15 @@
`open(Tab, Options, ReadOptions, WriteOptions) -> any()`
+
+
+###prev/2##
+
+
+
+
+`prev(Tab, Key) -> any()`
+
###repair/4##
@@ -136,12 +253,84 @@
`repair(Tab, Options, ReadOptions, WriteOptions) -> any()`
-
+
-###tab2list/2##
+###select/1##
-`tab2list(Tab, Impl) -> any()`
+`select(Cont0) -> any()`
+
+
+
+###select/2##
+
+
+
+
+`select(Tab, Spec) -> any()`
+
+
+
+###select/3##
+
+
+
+
+`select(Tab, Spec, Limit) -> any()`
+
+
+
+###select_count/2##
+
+
+
+
+`select_count(Tab, Spec) -> any()`
+
+
+
+###select_delete/2##
+
+
+
+
+`select_delete(Tab, Spec) -> any()`
+
+
+
+###select_reverse/1##
+
+
+
+
+`select_reverse(Cont0) -> any()`
+
+
+
+###select_reverse/2##
+
+
+
+
+`select_reverse(Tab, Spec) -> any()`
+
+
+
+###select_reverse/3##
+
+
+
+
+`select_reverse(Tab, Spec, Limit) -> any()`
+
+
+
+###tab2list/1##
+
+
+
+
+`tab2list(Tab) -> any()`
diff --git a/doc/lets_ets.md b/doc/lets_ets.md
index ad37f21..3ad4ecb 100644
--- a/doc/lets_ets.md
+++ b/doc/lets_ets.md
@@ -12,13 +12,22 @@
##Function Index##
-
+
##Function Details##
+
+
+###delete/1##
+
+
+
+
+`delete(Tab) -> any()`
+
###delete/2##
@@ -26,25 +35,16 @@
-`delete(Tab, Ets) -> any()`
+`delete(Tab, Key) -> any()`
-
+
-###delete/3##
+###delete_all_objects/1##
-`delete(Tab, Ets, Key) -> any()`
-
-
-
-###delete_all_objects/2##
-
-
-
-
-`delete_all_objects(Tab, Ets) -> any()`
+`delete_all_objects(Tab) -> any()`
@@ -55,68 +55,176 @@
`destroy(Tab) -> any()`
-
+
-###first/2##
+###first/1##
-`first(Tab, Ets) -> any()`
+`first(Tab) -> any()`
-
+
-###info_memory/2##
+###foldl/3##
-`info_memory(Tab, Ets) -> any()`
+`foldl(Function, Acc0, Tab) -> any()`
-
+
-###info_size/2##
+###foldr/3##
-`info_size(Tab, Ets) -> any()`
+`foldr(Function, Acc0, Tab) -> any()`
-
+
-###insert/3##
+###info_memory/1##
-`insert(Tab, Ets, ObjectOrObjects) -> any()`
+`info_memory(Tab) -> any()`
-
+
-###insert_new/3##
+###info_size/1##
-`insert_new(Tab, Ets, ObjectOrObjects) -> any()`
+`info_size(Tab) -> any()`
-
+
-###lookup/3##
+###insert/2##
-`lookup(Tab, Ets, Key) -> any()`
+`insert(Tab, ObjOrObjs) -> any()`
-
+
-###next/3##
+###insert_new/2##
-`next(Tab, Ets, Key) -> any()`
+`insert_new(Tab, ObjOrObjs) -> any()`
+
+
+
+###last/1##
+
+
+
+
+`last(Tab) -> any()`
+
+
+
+###lookup/2##
+
+
+
+
+`lookup(Tab, Key) -> any()`
+
+
+
+###lookup_element/3##
+
+
+
+
+`lookup_element(Tab, Key, Pos) -> any()`
+
+
+
+###match/1##
+
+
+
+
+`match(Cont) -> any()`
+
+
+
+###match/2##
+
+
+
+
+`match(Tab, Pattern) -> any()`
+
+
+
+###match/3##
+
+
+
+
+`match(Tab, Pattern, Limit) -> any()`
+
+
+
+###match_delete/2##
+
+
+
+
+`match_delete(Tab, Pattern) -> any()`
+
+
+
+###match_object/1##
+
+
+
+
+`match_object(Cont) -> any()`
+
+
+
+###match_object/2##
+
+
+
+
+`match_object(Tab, Pattern) -> any()`
+
+
+
+###match_object/3##
+
+
+
+
+`match_object(Tab, Pattern, Limit) -> any()`
+
+
+
+###member/2##
+
+
+
+
+`member(Tab, Key) -> any()`
+
+
+
+###next/2##
+
+
+
+
+`next(Tab, Key) -> any()`
@@ -127,6 +235,15 @@
`open(Tab) -> any()`
+
+
+###prev/2##
+
+
+
+
+`prev(Tab, Key) -> any()`
+
###repair/1##
@@ -136,12 +253,84 @@
`repair(Tab) -> any()`
-
+
-###tab2list/2##
+###select/1##
-`tab2list(Tab, Ets) -> any()`
+`select(Cont) -> any()`
+
+
+
+###select/2##
+
+
+
+
+`select(Tab, Spec) -> any()`
+
+
+
+###select/3##
+
+
+
+
+`select(Tab, Spec, Limit) -> any()`
+
+
+
+###select_count/2##
+
+
+
+
+`select_count(Tab, Spec) -> any()`
+
+
+
+###select_delete/2##
+
+
+
+
+`select_delete(Tab, Spec) -> any()`
+
+
+
+###select_reverse/1##
+
+
+
+
+`select_reverse(Cont) -> any()`
+
+
+
+###select_reverse/2##
+
+
+
+
+`select_reverse(Tab, Spec) -> any()`
+
+
+
+###select_reverse/3##
+
+
+
+
+`select_reverse(Tab, Spec, Limit) -> any()`
+
+
+
+###tab2list/1##
+
+
+
+
+`tab2list(Tab) -> any()`
diff --git a/doc/lets_nif.md b/doc/lets_nif.md
index b9114c8..9285904 100644
--- a/doc/lets_nif.md
+++ b/doc/lets_nif.md
@@ -12,13 +12,22 @@
##Function Index##
-
+
##Function Details##
+
+
+###delete/1##
+
+
+
+
+`delete(Tab) -> any()`
+
###delete/2##
@@ -26,25 +35,16 @@
-`delete(Tab, Impl) -> any()`
+`delete(Tab, Key) -> any()`
-
+
-###delete/3##
+###delete_all_objects/1##
-`delete(Tab, Impl, Key) -> any()`
-
-
-
-###delete_all_objects/2##
-
-
-
-
-`delete_all_objects(Tab, Impl) -> any()`
+`delete_all_objects(Tab) -> any()`
@@ -55,68 +55,176 @@
`destroy(Tab, Options, ReadOptions, WriteOptions) -> any()`
-
+
-###first/2##
+###first/1##
-`first(Tab, Impl) -> any()`
+`first(Tab) -> any()`
-
+
-###info_memory/2##
+###foldl/3##
-`info_memory(Tab, Impl) -> any()`
+`foldl(Fun, Acc0, Tab) -> any()`
-
+
-###info_size/2##
+###foldr/3##
-`info_size(Tab, Impl) -> any()`
+`foldr(Fun, Acc0, Tab) -> any()`
-
+
-###insert/3##
+###info_memory/1##
-`insert(Tab, Impl, Object) -> any()`
+`info_memory(Tab) -> any()`
-
+
-###insert_new/3##
+###info_size/1##
-`insert_new(Tab, Impl, Object) -> any()`
+`info_size(Tab) -> any()`
-
+
-###lookup/3##
+###insert/2##
-`lookup(Tab, Impl, Key) -> any()`
+`insert(Tab, Object) -> any()`
-
+
-###next/3##
+###insert_new/2##
-`next(Tab, Impl, Key) -> any()`
+`insert_new(Tab, Object) -> any()`
+
+
+
+###last/1##
+
+
+
+
+`last(Tab) -> any()`
+
+
+
+###lookup/2##
+
+
+
+
+`lookup(Tab, Key) -> any()`
+
+
+
+###lookup_element/3##
+
+
+
+
+`lookup_element(Tab, Key, Pos) -> any()`
+
+
+
+###match/1##
+
+
+
+
+`match(Cont) -> any()`
+
+
+
+###match/2##
+
+
+
+
+`match(Tab, Pattern) -> any()`
+
+
+
+###match/3##
+
+
+
+
+`match(Tab, Pattern, Limit) -> any()`
+
+
+
+###match_delete/2##
+
+
+
+
+`match_delete(Tab, Pattern) -> any()`
+
+
+
+###match_object/1##
+
+
+
+
+`match_object(Cont) -> any()`
+
+
+
+###match_object/2##
+
+
+
+
+`match_object(Tab, Pattern) -> any()`
+
+
+
+###match_object/3##
+
+
+
+
+`match_object(Tab, Pattern, Limit) -> any()`
+
+
+
+###member/2##
+
+
+
+
+`member(Tab, Key) -> any()`
+
+
+
+###next/2##
+
+
+
+
+`next(Tab, Key) -> any()`
@@ -127,6 +235,15 @@
`open(Tab, Options, ReadOptions, WriteOptions) -> any()`
+
+
+###prev/2##
+
+
+
+
+`prev(Tab, Key) -> any()`
+
###repair/4##
@@ -136,12 +253,84 @@
`repair(Tab, Options, ReadOptions, WriteOptions) -> any()`
-
+
-###tab2list/2##
+###select/1##
-`tab2list(Tab, Impl) -> any()`
+`select(Cont0) -> any()`
+
+
+
+###select/2##
+
+
+
+
+`select(Tab, Spec) -> any()`
+
+
+
+###select/3##
+
+
+
+
+`select(Tab, Spec, Limit) -> any()`
+
+
+
+###select_count/2##
+
+
+
+
+`select_count(Tab, Spec) -> any()`
+
+
+
+###select_delete/2##
+
+
+
+
+`select_delete(Tab, Spec) -> any()`
+
+
+
+###select_reverse/1##
+
+
+
+
+`select_reverse(Cont0) -> any()`
+
+
+
+###select_reverse/2##
+
+
+
+
+`select_reverse(Tab, Spec) -> any()`
+
+
+
+###select_reverse/3##
+
+
+
+
+`select_reverse(Tab, Spec, Limit) -> any()`
+
+
+
+###tab2list/1##
+
+
+
+
+`tab2list(Tab) -> any()`
diff --git a/doc/overview.edoc b/doc/overview.edoc
index 6672fd8..f84d573 100644
--- a/doc/overview.edoc
+++ b/doc/overview.edoc
@@ -8,7 +8,8 @@ LETS is an alternative Erlang Term Storage using LevelDB as the
storage implementation. LETS tries to address some bad properties of
ETS and DETS. ETS is limited by physical memory. DETS is limited by
a 2 GB file size limitation and does not implement ordered sets. LETS
-has neither of these limitations.
+has neither of these limitations. Data can also be automatically
+compressed using the Snappy compression library.
For testing and comparison purposes, LETS supports three
implementations:
@@ -18,20 +19,40 @@ implementations:
- +ets+ Erlang ETS backend
LETS is not intended to be an exact clone of ETS. The currently
-supported APIs are:
+supported ETS APIs are:
-- +new/2+
-- +destroy/2+ _only driver and nif implementations_
-- +repair/2+ _only driver and nif implementations_
-- +insert/2+
-- +insert_new/2+ _only the ets implementation_
- +delete/1+
- +delete/2+
-- +delete_all_objects/1+ _only the ets implementation_
-- +lookup/2+
+- +delete_all_objects/1+ _only ets implementation_
- +first/1+
-- +next/2+
+- +foldl/3+
+- +foldr/3+
+- +info/1+ _only a subset of items_
- +info/2+ _only a subset of items_
+- +insert/2+
+- +insert_new/2+ _only ets implementation_
+- +last/1+
+- +lookup/2+
+- +lookup_element/3+
+- +match/1+
+- +match/2+
+- +match/3+
+- +match_delete/2+
+- +match_object/1+
+- +match_object/2+
+- +match_object/3+
+- +member/2+
+- +new/2+
+- +next/2+
+- +prev/2+
+- +select/1+
+- +select/2+
+- +select/3+
+- +select_count/2+
+- +select_delete/2+
+- +select_reverse/1+
+- +select_reverse/2+
+- +select_reverse/3+
- +tab2list/1+
_This repository is experimental in nature - use at your own risk and
@@ -63,7 +84,7 @@ please read further.
This README is the only bit of documentation right now.
-The QC (a.k.a. QuickCheck, Proper, etc.) tests underneath the
+The QC (a.k.a. QuickCheck, PropEr, etc.) tests underneath the
"tests/qc" directory should be helpful for understanding the
specification and behavior of ETS and LETS. These QC tests also
illustrate several strategies for testing Erlang Driver-based and
@@ -85,6 +106,12 @@ provides an ordered mapping from string keys to string values.
See http://code.google.com/p/leveldb/ for further details.
+=== What is Snappy?
+
+Snappy is a fast compression/decompression library written at Google.
+
+See http://code.google.com/p/snappy/ for further details.
+
== To download
1. Configure your e-mail and name for Git
@@ -212,16 +239,45 @@ $ make compile-eqc eqc-compile
$ cd working-directory-name/src/lib/lets/.eunit
$ erl -smp +A 5 -pz ../../sext/ebin -pz ../../qc/ebin
-1> qc_statem_lets:run(5000).
+1> qc_statem_lets:qc_run(5000).
+....
+OK, passed 5000 tests
+
+9.022% {delete,ok}
+7.800% {new,ok}
+4.535% {match_delete,ok}
+4.491% {lookup,ok}
+4.399% {select,ok}
+4.352% {select_delete,ok}
+4.348% {tab2list,ok}
+4.341% {member,ok}
+4.334% {last,ok}
+4.315% {foldl,ok}
+4.308% {select_reverse,ok}
+4.301% {select_count,ok}
+4.293% {select31,ok}
+4.264% {first,ok}
+4.216% {foldr,ok}
+4.202% {match_object,ok}
+4.184% {match,ok}
+4.056% {insert,ok}
+3.997% {prev,ok}
+3.774% {next,ok}
+3.416% {lookup_element,{error,badarg}}
+1.298% {insert_new,ok}
+0.757% {lookup_element,ok}
+0.516% {next,{error,badarg}}
+0.483% {prev,{error,badarg}}
+true
.......
------
+
TIP: For testing LevelDB directly using the C bindings, try
- +qc_statemc_lets:run(5000)+.
+ +qc_statemc_lets:qc_run(5000)+.
-== To test - Proper
+== To test - PropEr
-1. Make sure Proper is in your Erlang code path. One simple way to
+1. Make sure PropEr is in your Erlang code path. One simple way to
accomplish this is by adding the code path to your +~/.erlang+
resource file.
+
@@ -229,7 +285,7 @@ TIP: For testing LevelDB directly using the C bindings, try
true = code:add_pathz(os:getenv("HOME")++"/.erlang.d/lib/proper/ebin").
------
-2. Compile for Proper
+2. Compile for PropEr
+
------
$ cd working-directory-name/src
@@ -237,20 +293,49 @@ $ make clean
$ make compile-proper proper-compile
------
-3. Run 5,000 Proper tests
+3. Run 5,000 PropEr tests
+
------
$ cd working-directory-name/src/lib/lets/.eunit
$ erl -smp +A 5 -pz ../../sext/ebin -pz ../../qc/ebin
-1> qc_statem_lets:run(5000).
+1> qc_statem_lets:qc_run(5000).
+....
+OK: Passed 5000 test(s).
+
+11% {new,ok}
+8% {delete,ok}
+4% {member,ok}
+4% {select,ok}
+4% {select_count,ok}
+4% {select_reverse,ok}
+4% {lookup,ok}
+4% {match_object,ok}
+4% {tab2list,ok}
+4% {last,ok}
+4% {match,ok}
+4% {foldl,ok}
+4% {match_delete,ok}
+3% {prev,ok}
+3% {select31,ok}
+3% {select_delete,ok}
+3% {foldr,ok}
+3% {insert,ok}
+3% {first,ok}
+3% {next,ok}
+3% {lookup_element,{error,badarg}}
+1% {insert_new,ok}
+0% {prev,{error,badarg}}
+0% {lookup_element,ok}
+0% {next,{error,badarg}}
+true
.......
------
== Roadmap
- Documentation
- * Explain how to run QuickCheck/Proper tests using a new rebar
+ * Explain how to run QuickCheck/PropEr tests using a new rebar
plugin.
* Explain how to build and to run lets with valgrind enabled
OTP/Erlang virtual machine
@@ -271,6 +356,10 @@ $ erl -smp +A 5 -pz ../../sext/ebin -pz ../../qc/ebin
* +delete_all_objects/1+
(http://code.google.com/p/leveldb/issues/detail?id=43)
+ * Add custom (i.e. not supported by native ETS) APIs for providing
+ access to LevelDB\'s iterators for +drv+ and +nif+ backend
+ implementations.
+
- Existing APIs (TBD)
* +delete/1+
(http://code.google.com/p/leveldb/issues/detail?id=48)
diff --git a/rebar b/rebar
index 70174d3d3a9339c34e9afee0b849ea48ef57c1e0..4f3e9959e50ffc8f4a4ff87396facfe609d1ee54 100755
GIT binary patch
delta 84590
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