venn

fluent API library for set operations

npm install venn
34 downloads in the last week
73 downloads in the last month

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 unions. There's so many that do it, like underscore, the problem I found was that none of them had a fluent API, so I took a take on doing my own.

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.

npm loves you