{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/scratch/venn-source/venn.js"],"names":["binder","applier","pack","distribute","force","vennLayout","venn","normalizeSolution","scaleSolution","intersectionAreaPath","computeTextCentres","distance","opts","sets","setsAccessor","setsAccessorFn","setsSize","packingStragegy","packingConfig","value","valueFn","size","padding","layoutFunction","orientation","Math","PI","normalize","circles","nodes","packer","centres","data","arguments","length","compute","setsValues","layout","width","height","solution","oldCircles","extractSets","values","console","info","k","previous","forEach","set","d","pathTween","center","innerRadius","computeDistanceToCircles","circle","dist","isInside","isOverlapp","candidate","Infinity","indexOf","checkOverlapp","radius","i","l","c","t","map","start","end","x","y","d3","__key__","individualSets","accessor","s","key","n","sort","join","val","get","__setKey__","push","v","_","config"],"mappings":"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","file":"venn.js","sourcesContent":["import {\n  binder,\n  applier\n}\nfrom \"./getSet.js\";\nimport {\n  pack, distribute, force\n}\nfrom \"./packStrategies.js\";\n// import distributeCircles from \"./distributeCircles\";\n// import distributeCircles from \"./distributeCircles\"; // as an alternative to packCircles\nimport {\n  venn as vennLayout, normalizeSolution, scaleSolution\n}\nfrom \"../venn.js/src/layout.js\";\nimport {\n  intersectionAreaPath, computeTextCentres\n}\nfrom \"../venn.js/src/diagram.js\"\nimport {\n  distance\n}\nfrom \"../venn.js/src/circleintersection.js\"\n\n\nexport default function() {\n  // d3.layout.venn = function() {\n\n  var opts = {\n    sets: null,\n    setsAccessor: setsAccessorFn,\n    setsSize: setsSize,\n    packingStragegy: pack,\n    packingConfig: {\n      value: valueFn,\n    },\n    size: [1, 1],\n    padding: 0,\n\n    // options from venn (https://github.com/benfred/venn.js)\n    layoutFunction: vennLayout,\n    orientation: Math.PI / 2,\n    normalize: true\n\n  };\n\n  var circles,\n    nodes,\n    packer,\n    centres;\n\n\n  // Build simple getter and setter Functions\n  binder(venn, opts);\n\n  //The layout function\n  function venn(data) {\n    if (!arguments.length) return nodes;\n     nodes = compute(data);\n     return venn;\n  }\n\n\n\n  function compute(data) {\n    var sets = venn.sets(),\n        setsValues,\n      layout = venn.layoutFunction(),\n      packingStragegy = venn.packingStragegy(),\n      size = venn.size(),\n      width = size[0],\n      height = size[1],\n      // normalizeSolution = normalizeSolution,\n      // scaleSolution = scaleSolution,\n      // computeTextCentres = computeTextCentres,\n\n      solution,\n      oldCircles;\n\n\n    sets = extractSets(data);\n    setsValues = sets.values()\n    solution = layout(setsValues);\n\n    console.info(\"data: \", data)\n    console.info(\"sets: \", sets)\n\n    if (venn.normalize()) {\n      solution = normalizeSolution(solution, venn.orientation());\n    }\n\n    oldCircles = circles;\n    circles = scaleSolution(solution, width, height, venn.padding());\n\n    for (var k in oldCircles) {\n      if (circles[k]) {\n        circles[k].previous = oldCircles[k];\n      }\n    }\n    oldCircles = null;\n\n    centres = computeTextCentres(circles, setsValues);\n\n    // store intersectionAreaPath into sets\n    sets.forEach(function(k,set) {\n      set.d = pathTween(set);\n      set.center = centres[k];\n      set.innerRadius = computeDistanceToCircles(set);\n      // packingStragegy(set, valueFunction, circles);\n    });\n\n    packer = packingStragegy(venn, data)\n\n    function computeDistanceToCircles(set) {\n      var sets = set.sets,\n        center = set.center,\n        // hasOneSet = set.length ==1,\n        k, circle, dist, isInside, isOverlapp,\n        candidate = Infinity;\n      // if(sets.length ==1)  {\n      for (k in circles) {\n        circle = circles[k];\n        isInside = sets.indexOf(k) > -1;\n        isOverlapp = sets.indexOf(k) < -1 && checkOverlapp(sets, circle);\n        dist = distance(center, circle);\n        dist = isInside ? circle.radius - dist : isOverlapp ? dist - circle.radius : dist + circle.radius;\n        if (dist < candidate) {\n          candidate = dist;\n        }\n\n      }\n      return candidate;\n    }\n\n    function checkOverlapp(sets, circle) {\n      var i = 0,\n        l = sets.length,\n        c;\n      for (i; i < l; i++) {\n        c = circles[sets[i]];\n        if (distance(c, circle) < c.radius) {\n          return true;\n        }\n      }\n      return false;\n    }\n    // interpolate intersection area paths between previous and\n    // current paths\n    function pathTween(set) {\n      return function(t) {\n        var c = set.sets.map(function(set) {\n          // var start = previous[set],\n          var circle = circles[set];\n\n          var start = circle && circle[\"previous\"],\n            end = circle;\n          if (!start) {\n            start = {\n              x: width / 2,\n              y: height / 2,\n              radius: 1\n            };\n          }\n          if (!end) {\n            end = {\n              x: width / 2,\n              y: height / 2,\n              radius: 1\n            };\n          }\n          if (t == 1 && circle) {\n            circle[\"previous\"] = end;\n          }\n          return {\n            'x': start.x * (1 - t) + end.x * t,\n            'y': start.y * (1 - t) + end.y * t,\n            'radius': start.radius * (1 - t) + end.radius * t\n          };\n        });\n\n        return intersectionAreaPath(c);\n      };\n    };\n    return data\n  }\n\n  // loop over data and build the set so that they comply with https://github.com/benfred/venn.js\n  /*\n  from  data = [\n      {\"set\":[\"A\"],\"name\":\"node_0\"},\n      {\"set\":[\"B\"],\"name\":\"node_1\"},\n      {\"set\":[\"B\",\"A\"],\"name\":\"node_2\"}\n      {\"set\":[\"B\",\"A\"],\"name\":\"node_3\"}\n      ]\n\n  to sets = [ \n      {sets: ['A'], size: 1, nodes : ['node_0']}, \n      {sets: ['B'], size: 1, nodes : ['node_1']},\n      {sets: ['A','B'], size: 2, nodes ['node_2', 'node_3']}\n      ];\n  */\n  function extractSets(data) {\n    var sets = d3.map({}, function(d) {\n        return d.__key__\n      }),\n      individualSets = d3.map(),\n      accessor = venn.setsAccessor(),\n      size = venn.setsSize(),\n      set,\n      s,\n      key,\n      i,\n      n = data.length;\n\n    for (i = -1; ++i < n;) {\n      set = accessor(data[i]);\n      if (set.length) {\n        key = set.sort().join(','); //so taht we have the same key as in https://github.com/benfred/venn.js\n        set.forEach(function(val) {\n          if (s = individualSets.get(val)) {\n            s.size += 1;\n            // s.nodes.push([data[i]]);\n\n          } else {\n            individualSets.set(val, {\n              __key__: val,\n              size: 1,\n              sets: [val],\n              nodes: []\n                // nodes: [data[i]]\n            })\n          }\n        });\n        data[i].__setKey__ = key;\n        if (s = sets.get(key)) {\n          s.size++;\n          s.nodes.push(data[i]);\n        } else {\n          sets.set(key, {\n            __key__: key,\n            sets: set,\n            size: 1,\n            nodes: [data[i]]\n          });\n        }\n      }\n\n    }\n    individualSets.forEach(function(k, v) {\n      if (!sets.get(k)) {\n        sets.set(k, v);\n      }\n    });\n    // reset the size for each set. \n    sets.forEach(function(k, v) {\n      v.size = size(v.size);\n    })\n    // sets = sets.values();\n\n    venn.sets(sets);\n    return sets;\n  }\n\n  function setsSize(size) {\n    return size;\n  }\n\n  // data accessors \n  function setsAccessorFn(d) {\n    return d.set || [];\n  }\n\n  function valueFn(d) {\n    return d.value;\n  }\n  venn.packingConfig = function(_) {\n    var config = opts.packingConfig;\n    if (!arguments.length) {\n      return config;\n    }\n    for (var k in _) {\n      config[k] = _[k]\n    }\n    if(packer) {\n        applier(packer, _)\n    }\n    return venn;\n\n  };\n\n  venn.packer = function() {\n    return packer;\n  }\n\n  venn.circles = function() {\n    return circles;\n  };\n\n  venn.centres = function() {\n    return centres;\n  };\n\n  venn.nodes = venn;\n\n  return venn;\n  // return d3.rebind(venn, event, \"on\");\n};\nexport {\n  pack, distribute, force\n};\n"]}