Functional Weave
Code in Rust

collections.dedupe-by-key@1.0.0

vectors.json

2,969 bytes · view raw

[
  {
    "name": "keep first: the earliest record of each key survives, in its own place",
    "args": [[{ "id": "a", "v": 1 }, { "id": "b", "v": 1 }, { "id": "a", "v": 2 }], "id", "first"],
    "expect": [{ "id": "a", "v": 1 }, { "id": "b", "v": 1 }]
  },
  {
    "name": "keep last: the latest record survives, at the latest record's position",
    "args": [[{ "id": "a", "v": 1 }, { "id": "b", "v": 1 }, { "id": "a", "v": 2 }], "id", "last"],
    "expect": [{ "id": "b", "v": 1 }, { "id": "a", "v": 2 }]
  },
  {
    "name": "three copies, keep last, interleaved with others",
    "args": [[{ "id": 1, "n": "x" }, { "id": 2, "n": "y" }, { "id": 1, "n": "z" }, { "id": 3, "n": "w" }, { "id": 1, "n": "q" }], "id", "last"],
    "expect": [{ "id": 2, "n": "y" }, { "id": 3, "n": "w" }, { "id": 1, "n": "q" }]
  },
  {
    "name": "three copies, keep first",
    "args": [[{ "id": 1, "n": "x" }, { "id": 2, "n": "y" }, { "id": 1, "n": "z" }, { "id": 3, "n": "w" }, { "id": 1, "n": "q" }], "id", "first"],
    "expect": [{ "id": 1, "n": "x" }, { "id": 2, "n": "y" }, { "id": 3, "n": "w" }]
  },
  {
    "name": "no duplicates leaves the list as it was",
    "args": [[{ "id": "c" }, { "id": "a" }, { "id": "b" }], "id", "first"],
    "expect": [{ "id": "c" }, { "id": "a" }, { "id": "b" }]
  },
  {
    "name": "an empty list stays empty",
    "args": [[], "id", "last"],
    "expect": []
  },
  {
    "name": "records without the key are always kept, never collapsed into one",
    "args": [[{ "n": 1 }, { "id": "a", "n": 2 }, { "n": 3 }, { "id": null, "n": 4 }, { "id": "a", "n": 5 }], "id", "first"],
    "expect": [{ "n": 1 }, { "id": "a", "n": 2 }, { "n": 3 }, { "id": null, "n": 4 }]
  },
  {
    "name": "the number 1 and the string \"1\" are the same key, as in group-by-key",
    "args": [[{ "id": 1, "src": "api" }, { "id": "1", "src": "csv" }], "id", "last"],
    "expect": [{ "id": "1", "src": "csv" }]
  },
  {
    "name": "case matters: \"A\" and \"a\" are different keys",
    "args": [[{ "id": "A" }, { "id": "a" }], "id", "first"],
    "expect": [{ "id": "A" }, { "id": "a" }]
  },
  {
    "name": "booleans are keys too",
    "args": [[{ "flag": true, "n": 1 }, { "flag": false, "n": 2 }, { "flag": true, "n": 3 }], "flag", "last"],
    "expect": [{ "flag": false, "n": 2 }, { "flag": true, "n": 3 }]
  },
  {
    "name": "an unknown keep mode is an error",
    "args": [[{ "id": 1 }], "id", "middle"],
    "expectError": "keep must be \"first\" or \"last\""
  },
  {
    "name": "an empty key name is an error",
    "args": [[{ "id": 1 }], "", "first"],
    "expectError": "needs a non-empty key name"
  },
  {
    "name": "a fractional number at the key is an error, not a guess",
    "args": [[{ "id": 1.5 }], "id", "first"],
    "expectError": "cannot dedupe by the fractional number"
  },
  {
    "name": "a list at the key is an error",
    "args": [[{ "id": [1, 2] }], "id", "first"],
    "expectError": "cannot dedupe by the list or map"
  }
]