)]}'
{
  "log": [
    {
      "commit": "62de8c46ede02a7675c4c79c84883eb164cb71e3",
      "tree": "6e8919316b790f60e8c6eaa312c2e58e15039c0f",
      "parents": [
        "dcc34c635223ad0e274085009644a7889d29f437"
      ],
      "author": {
        "name": "Lann",
        "email": "github-lann@lannbox.com",
        "time": "Mon Aug 10 15:23:59 2015"
      },
      "committer": {
        "name": "Lann",
        "email": "github-lann@lannbox.com",
        "time": "Mon Aug 10 15:23:59 2015"
      },
      "message": "Update README.md"
    },
    {
      "commit": "dcc34c635223ad0e274085009644a7889d29f437",
      "tree": "894cf8971daadfe32c508aed3cc1ff1c1dc2353d",
      "parents": [
        "98bbe05bff2029016e062a71ae59327108afb121"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Fri Aug 07 16:05:14 2015"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Fri Aug 07 16:05:14 2015"
      },
      "message": "Use fmt package by name\n\nUse standard Go idiom when invoking functions in the fmt package.\n\n"
    },
    {
      "commit": "98bbe05bff2029016e062a71ae59327108afb121",
      "tree": "87f2019596f0109e829f416e47524b7ed89f055e",
      "parents": [
        "33ddf69629c1bcea76b04f4a4e9e00e4cce82eb6"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Fri Aug 07 16:03:25 2015"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Fri Aug 07 16:03:25 2015"
      },
      "message": "go fmt\n\n"
    },
    {
      "commit": "33ddf69629c1bcea76b04f4a4e9e00e4cce82eb6",
      "tree": "73aa722799168d3135b94de7a7141204e686fbaf",
      "parents": [
        "cb0b562150d5fdb1832f28c1e4b99ff37cc76dbf"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Mon Nov 11 20:22:00 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Mon Nov 11 20:22:00 2013"
      },
      "message": "Fix error messages\n\nThanks to `go vet` for finding these problems\n"
    },
    {
      "commit": "cb0b562150d5fdb1832f28c1e4b99ff37cc76dbf",
      "tree": "5fc506df22efba2757ca8afbb196d958875312bc",
      "parents": [
        "aacbf98b78ff126664803427abdc1f6e48a92ca9"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Mon Mar 25 20:36:11 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Mon Mar 25 20:36:11 2013"
      },
      "message": "Don\u0027t allocate memory in hashKey\n\nConverting from string to []byte allocates a temporary slice.  If we\niterate the string\u0027s runes directly, we can avoid the extra memory\nallocations.  This dramatically improves hash performance and\ntherefore Set and Delete performance in micro benchmarks.\n"
    },
    {
      "commit": "aacbf98b78ff126664803427abdc1f6e48a92ca9",
      "tree": "3e760d005229f054d5f817369a9e0b3af46a9356",
      "parents": [
        "4077d28516895e7a31bed0c8bb496466675f4357"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Mar 21 20:28:56 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Mar 21 20:28:56 2013"
      },
      "message": "Use 8 children per node\n\nOur benchmarks show this configuration as having the same performance\nas two children per node.  Theoretically, by making the tree wider we\nshould have to copy fewer nodes during insert.  That ought to generate\nless GC pressure on maps with many modifications.\n"
    },
    {
      "commit": "4077d28516895e7a31bed0c8bb496466675f4357",
      "tree": "5b88acfc3f05cad11da2cd10a2395f37cf46192d",
      "parents": [
        "4964cb25d56aa8a1bf43a76c977732d9f3fdd381"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Mar 21 20:19:29 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Mar 21 20:19:29 2013"
      },
      "message": "Use array of children for each node\n\nThis vastly simplifies the code and makes it easy to add more children\nper node if that becomes useful.\n"
    },
    {
      "commit": "4964cb25d56aa8a1bf43a76c977732d9f3fdd381",
      "tree": "39d1ab87785caed6c448e90477d6ae6d2e688a1d",
      "parents": [
        "ccc391905e1d368217a586e8802b0ad1f1f89e96"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 22:17:06 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 22:17:06 2013"
      },
      "message": "Don\u0027t copy structs manually\n\nI don\u0027t know what I was thinking before.  Go structs are values so\nassigning them makes a copy.\n"
    },
    {
      "commit": "ccc391905e1d368217a586e8802b0ad1f1f89e96",
      "tree": "ffc64287877d785cd8ec0d56ec093dcec4d53b07",
      "parents": [
        "f5bc121cd1f5c8c34ae24d9d31d2905596638cb2"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 22:11:15 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 22:11:15 2013"
      },
      "message": "Inline FNV-1a hash algorithm\n\nThe algorithm is so simple there\u0027s no need to incur the performance\noverhead over using hash/fnv package and the associated Write\ninterface.  This change makes hashKey 40% faster than before.  That\u0027s\na 72% improvement over what we had a few commits ago.\n"
    },
    {
      "commit": "f5bc121cd1f5c8c34ae24d9d31d2905596638cb2",
      "tree": "a0b527d0c2771b2e49451cac15284558f8c7c145",
      "parents": [
        "9309397e75264b5b85a36d50ac360b7bba3bda17"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 22:03:56 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 22:03:56 2013"
      },
      "message": "Switch to FNV-1a hashing\n\nThis algorithm has better avalanche characteristics that FNV-1 while\nbeing just as fast.\n"
    },
    {
      "commit": "9309397e75264b5b85a36d50ac360b7bba3bda17",
      "tree": "808ea3ff3310d806cfeb9ecd362b80ddff50ebe4",
      "parents": [
        "d29085f6e0d485261e965dfd63e65ffcd9c84553"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 21:53:56 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 21:53:56 2013"
      },
      "message": "Use hash/fnv\u0027s Writer interface directly\n\nThis technique generates the same hash key (in all my tests) but is\n54% faster.\n"
    },
    {
      "commit": "d29085f6e0d485261e965dfd63e65ffcd9c84553",
      "tree": "3a3502cfdd0ee571eace408913f3f78c20c94be5",
      "parents": [
        "6362cf77d5626e1206b1bf43168400ae4c67c357"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 21:47:12 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 21:47:12 2013"
      },
      "message": "Benchmark for key hashing\n\nThis code is frequently used and seems to be generating far more\ngarbage and consuming more CPU than I expected it would.  This is a\nfirst step towards optimizing it.\n"
    },
    {
      "commit": "6362cf77d5626e1206b1bf43168400ae4c67c357",
      "tree": "b63d859cc37e4d2c407e2df16773a30df0214420",
      "parents": [
        "e543ee0aea9493207d9ac6e2355340f92c72a439"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 21:47:00 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Mar 20 21:47:00 2013"
      },
      "message": "Convenience script for generating profile data\n"
    },
    {
      "commit": "e543ee0aea9493207d9ac6e2355340f92c72a439",
      "tree": "3283f3f91e5a2890534c0260602dde54f3a8d223",
      "parents": [
        "fa57205988bb1f0930843e6942a04684f45c510f"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Tue Feb 19 22:57:08 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Tue Feb 19 22:57:08 2013"
      },
      "message": "Include installation instructions"
    },
    {
      "commit": "fa57205988bb1f0930843e6942a04684f45c510f",
      "tree": "40139701553c63a00d78e7306dc838d4adf26b37",
      "parents": [
        "4bf27b16a8f2505782f519615f4339b9fe72d97a"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Tue Feb 19 22:53:37 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Tue Feb 19 22:53:37 2013"
      },
      "message": "Create MIT license\n\n"
    },
    {
      "commit": "4bf27b16a8f2505782f519615f4339b9fe72d97a",
      "tree": "54eab9be633ed3ac6638d3a4ffc7acdc71905711",
      "parents": [
        "26a0e47bb98fa119bf87f3ddd2d2c8d75fcd687b"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Tue Feb 19 22:51:42 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Tue Feb 19 22:51:42 2013"
      },
      "message": "Create README\n\n"
    },
    {
      "commit": "26a0e47bb98fa119bf87f3ddd2d2c8d75fcd687b",
      "tree": "2ba395453808171212b986aa94d0735d56e5d284",
      "parents": [
        "33c5f69fc0d3a19152f43e7e5d2b081a7c805015"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Mon Feb 18 23:10:53 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Mon Feb 18 23:10:53 2013"
      },
      "message": "Improve documentation\n"
    },
    {
      "commit": "33c5f69fc0d3a19152f43e7e5d2b081a7c805015",
      "tree": "2b1d62fe57c39625926a0995d5747a32e3db7643",
      "parents": [
        "c5d8e061de6c36bc769a45f4385b9b0ebccf9bbd"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Mon Feb 18 23:10:15 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Mon Feb 18 23:10:15 2013"
      },
      "message": "Factor out Map interface\n\nThere are various implementations of the map datatype.  Making this an\ninterface allows consumers to swap in different implementations later,\nas needs require.\n"
    },
    {
      "commit": "c5d8e061de6c36bc769a45f4385b9b0ebccf9bbd",
      "tree": "cf130ea8796d3516329a67ee50635f17cdda40c1",
      "parents": [
        "bfcd6dd448dfedf9ead8953b5eeab08a4aad25be"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Mon Jan 21 23:19:28 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Mon Jan 21 23:19:28 2013"
      },
      "message": "Make List an interface\n\nI don\u0027t plan to provide a different implementation, but this gives me\nthe flexibility.  Code using ps.List without an interface smelled\nwrong in all the clients.  This should have a cleaner feel.\n"
    },
    {
      "commit": "bfcd6dd448dfedf9ead8953b5eeab08a4aad25be",
      "tree": "638d66b3cac70538ac744cf75065f7a2d3314d3a",
      "parents": [
        "6a23182fdaecae4094dc70ec54bb3e5d782028f7"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Jan 16 22:24:06 2013"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Wed Jan 16 22:24:06 2013"
      },
      "message": "Make comments go doc friendly\n"
    },
    {
      "commit": "6a23182fdaecae4094dc70ec54bb3e5d782028f7",
      "tree": "9a200c62a0f04ab8a6da0b99cc687413cec22acc",
      "parents": [
        "aaca984c8b9fea02f02425c5520cca06a2ad7ff2"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Fri Dec 28 19:58:48 2012"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Fri Dec 28 19:58:48 2012"
      },
      "message": "Share a single empty container across instances\n\nPersistent data structures can share a single instance of the empty\ncontainer because nobody will ever modify it.  Implement this for List\nand Map.  This simplifies the code since we can avoid checking for nil\npointers.  It should also reduce memory consumption somewhat.\n"
    },
    {
      "commit": "aaca984c8b9fea02f02425c5520cca06a2ad7ff2",
      "tree": "c39ac9e0ff19195fb0e5ee960844af17a2eb282d",
      "parents": [
        "b117721a37cb22d386ebdf17a9eda2b53ae02c82"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Fri Dec 21 00:35:56 2012"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Fri Dec 21 00:40:34 2012"
      },
      "message": "Rewrite Map using a hash-balanced tree\n\nThe gob-encoded deep copy approach was an easy hack but it failed in\nimportant ways.  This complete rewrite uses a binary search tree where\nthe tree\u0027s keys are hashes of the user\u0027s desired keys.  This makes us\npretty certain the tree will stay reasonably balanced without having\nto write a bunch of tree balancing code.\n\nThis passes all tests and is about 200x faster than the previous\nimplementation.  I hacked this code together pretty quickly and\nthere\u0027s lots of ugliness and repetitive code in there.  I hope to\nclean it up soon.\n"
    },
    {
      "commit": "b117721a37cb22d386ebdf17a9eda2b53ae02c82",
      "tree": "8afe74500bf5340039da5a6fe79fec91777b4c4a",
      "parents": [
        "8802234b41ec52227b82ce6c6d3ce45a84451399"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Dec 20 23:59:15 2012"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Fri Dec 21 00:34:25 2012"
      },
      "message": "Failing test on a map with many keys\n\nMake a map with 100 keys and then delete a few of them.  This is\nlikely to delete keys in the middle of a tree representation (if\nthat\u0027s what we\u0027re using these days) and trigger corner cases.\n"
    },
    {
      "commit": "8802234b41ec52227b82ce6c6d3ce45a84451399",
      "tree": "d414ba0fff14d0c82d4383aea7cd78eee381d690",
      "parents": [
        "4e416d0f03ff0b04269b46bdebbf728723985014"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Dec 20 22:26:59 2012"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Dec 20 22:26:59 2012"
      },
      "message": "Add a failing test for Maps with pointer values\n\nBecause Map is implemented with a deep copy using \"encoding/gob\", we\nlose pointer values during copy.  This originally manifested as a\nproblem with Maps whose values were Lists.  This failing test case\ncaptures the problem too.\n\nNext stop: a real persistent map implementation\n"
    },
    {
      "commit": "4e416d0f03ff0b04269b46bdebbf728723985014",
      "tree": "cb0bacb71c36cac4bd923d85bb2fa3436d450293",
      "parents": [
        "7a7ca8013ad85cd711f151653418f071ea9ee76e"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Dec 20 21:57:44 2012"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Dec 20 21:57:44 2012"
      },
      "message": "Test for maps with multiple keys\n"
    },
    {
      "commit": "7a7ca8013ad85cd711f151653418f071ea9ee76e",
      "tree": "1db5657a40b2120292b57dbf96f9fffff2e5d7b3",
      "parents": [
        "b355418336a2e26c7147de83fe55e16e306c5a2a"
      ],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Dec 20 21:48:22 2012"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Dec 20 21:48:22 2012"
      },
      "message": "Implement and test ps.Map.Keys()\n"
    },
    {
      "commit": "b355418336a2e26c7147de83fe55e16e306c5a2a",
      "tree": "b3738b4ba4791f66d497c33d000d004fea95a5d7",
      "parents": [],
      "author": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Dec 20 18:55:50 2012"
      },
      "committer": {
        "name": "Michael Hendricks",
        "email": "michael@ndrix.org",
        "time": "Thu Dec 20 18:55:50 2012"
      },
      "message": "Initial sketch\n"
    }
  ]
}
