Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jackrusher/spicerack
A Clojure wrapper for MapDB, which is a fast, disk-persistent data-structures library.
https://github.com/jackrusher/spicerack
clojure mapdb
Last synced: 3 months ago
JSON representation
A Clojure wrapper for MapDB, which is a fast, disk-persistent data-structures library.
- Host: GitHub
- URL: https://github.com/jackrusher/spicerack
- Owner: jackrusher
- License: epl-1.0
- Created: 2016-11-05T07:18:37.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2020-01-17T11:31:25.000Z (about 5 years ago)
- Last Synced: 2024-10-13T15:56:41.641Z (4 months ago)
- Topics: clojure, mapdb
- Language: Clojure
- Homepage:
- Size: 74.2 KB
- Stars: 82
- Watchers: 6
- Forks: 5
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
![The spicerack logo](https://cloud.githubusercontent.com/assets/220188/20091210/d20e41e6-a591-11e6-9411-94852705097b.png)
Sometimes, while making tasty computer programs, one needs a place to
store labeled containers of data. Spicerack is that kind of place.This library is a Clojure wrapper for [MapDB](http://www.mapdb.org) —
a fast, disk-persistent data-structures library. Like many Clojure
wrappers around Java libraries, this one is incomplete. MapDB supports
several data structures (`Map`, `Set` and `List`, implemented with
trees and hashes), and can do fun things with them, like creating a
hash table that acts as a cache with automatic eviction and change
listeners. This wrapper doesn't support any of that. It just provides
an idiomatic way to store something like a Clojure `hash-map` on disk.I plan to add the other data types over time, as I need them for my
own projects. In the meantime, these features are well-tested,
deployed in production, and quite useful.## Usage
``` clojure
[spicerack "0.1.6"]
```There are only a handful of functions in this wrapper. It provides
`open-database` and `close` (though it's best to use clojure's
`with-open` macro to handle closing), `assoc!`, `dissoc!`, and
`update!` for mutation, on top of which `clojure.core`'s `get`
function can be used to access the value of a given key.``` clojure
(require '[spicerack.core :refer [open-database open-hashmap assoc! update!]])(with-open [db (open-database "./baking-db")]
(let [ingredients (open-hashmap db "ingredient-hashmap")]
(assoc! ingredients :apple-pie [:flour :butter :sugar :apples])
;;=> [:flour :butter :sugar :apples]
(update! ingredients :apple-pie conj :cinnamon)))
;;=> [:flour :butter :sugar :apples :cinnamon]
```In addition, Spicerack's `hash-map` implementation can be used like a
normal Clojure `hash-map` with sequence functions such as `map` and
`reduce`:``` clojure
(with-open [db (open-database test-filename)]
(let [hm (open-hashmap db "test-hashmap")]
(doseq [[a b] (map vector (range 10) (range 0 1.0 0.1))]
(assoc! hm a b))(get hm 1)
;;=> 0.1(get hm 47 :hi)
;;=> :hi(reduce (fn [acc [k v]] (+ acc v)) 0 hm)
;;=> 4.5(reduce (fn [acc [k v]] (+ acc k)) 0 hm)
;;=> 45(mapv (fn [[k v]]
{:key k
:val v})
hm)
;;=>
[{:key 0, :val 0}
{:key 8, :val 0.7999999999999999}
{:key 5, :val 0.5}
{:key 3, :val 0.30000000000000004}
{:key 2, :val 0.2}
{:key 6, :val 0.6}
{:key 7, :val 0.7}
{:key 1, :val 0.1}
{:key 9, :val 0.8999999999999999}
{:key 4, :val 0.4}]))
```Note that returning a lazy sequence from inside of a `with-open`
block, then trying to realize that sequence outside of the block, will
cause an exception to be thrown.There are more examples in the test suite. In additon, there is
automatically generated [codox](https://github.com/weavejester/codox)
API documentation [here](https://jackrusher.github.io/spicerack/).## License
Copyright © 2016-2019 Jack Rusher
Distributed under the Eclipse Public License either version 1.0 or (at
your option) any later version.