Skip to content

Latest commit

 

History

History
115 lines (78 loc) · 2.72 KB

README.md

File metadata and controls

115 lines (78 loc) · 2.72 KB

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.