Fluent API for set operations.
JavaScript Shell
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
test
.gitignore
.travis.yml
Gruntfile.js
MIT-LICENSE.txt
README.md
_config.yml
bower.json
karma-require-conf.js
karma.conf.js
package.json
pre-commit
venn.js
venn.min.js

README.md

venn Build Status NPM version

Motivation

One of these days I was looking for a library that would allow me to do simple set operations, mostly intersection and union. There's a lot of libraries that do this but I didn't find one with a fluent API. This a stab at one:

Compatible with AMD and node.

getting started

A venn set is just an array on steroids:

  var venn = require("venn")
  venn.create([1,2])   
  console.log(venn) // [1,2]

union

You can now chain operations to this set, using union or or:

  venn.create([1,2])
      .union([1,2,3,4])
      .or([5]) // [1,2,3,4,5]

union and or are just alias for the same operation.

intersection

    venn.create([1,2])
      .union([1,2,3,4]) 
      .intersection([1,5]) // [1]

if you prefer you can also use and instead of intersection

not

If you want to be negative about it, you can check out not

    venn.create([1,2,3,4,5])
      .not([4])
      .not([5]) // [1,2,3]

chaining everything

Or a mix of everything

    venn.create([1,2])
      .or([1,2,3,4,5])
      .and([1,5])
      .or([2]) // [1,5,2]

Objects

If you're crazy you can use venn without a key function. We'll just figure it out how to index the objects.

    venn.create([
        {name: "vitor", age: "23"}
      , {name: "khov",  age: "24"}
      , {name: "pat",   age: "30"}])
      .intersection([
        {name: "vitor",  age: "23"}
      , {name: "newguy", age: "0"}
      , {name: "pat",    age: "50"}])
      .union([
        {name: "khov", age : "10"}
      , {name: "nuno", age : "20"}]) 

    // vitor, khov and nuno

Key function

But really, write your own key function:

  
    var myKeyFunction = function(item) {
      return item.name
    }
    
    venn.create([
        {name: "vitor", age: "100"}
      , {name: "khov",  age: "100"}], myKeyFunction)
      .and([
        {name: "vitor", age: "0"}
      , {name: "khov",  age: "0"}
      .or([
        {name: "khov",  age : "-100"}
      , {name: "nuno",  age : "20"}]) 
   
    // vitor, khov(the first of them), nuno

Some notes

  • The keyFunction only needs to be set once for each venn object (as you would expect)
  • Don't forget if you apply a built-in array function like filter or map the returning object is not a venn object (as you would once again expect)

Let me know if there are improvements I can do to the library. I might take some time to implement the other less used set operations.