array-mumu 0.2.0-rc.5

Array tools plugin for the Mumu ecosystem
Documentation
extend("test")
extend("array")
extend("std")

describe("array:key_eq + std:deep integration", () => {

  it("builds a partial predicate and evaluates on single items", () => {
    people = [
      [name:"Abby",  age:7,  hair:"blond"],
      [name:"Fred",  age:12, hair:"brown"],
      [name:"Rusty", age:30, hair:"brown"],
      [name:"Alois", age:65, disposition:"surly"]
    ]
    hasBrownHair = array:key_eq("brown", "hair")
    expect_equal(hasBrownHair(people[1]), true)
    expect_equal(hasBrownHair(people[0]), false)
    expect_equal(hasBrownHair(people[3]), false)
  })

  it("supports full application with value, key, and object", () => {
    people = [
      [name:"Abby",  age:7,  hair:"blond"],
      [name:"Fred",  age:12, hair:"brown"],
      [name:"Rusty", age:30, hair:"brown"],
      [name:"Alois", age:65, disposition:"surly"]
    ]
    expect_equal(array:key_eq("brown", "hair", people[2]), true)
    expect_equal(array:key_eq("blond", "hair", people[2]), false)
  })

  it("supports placeholder completion for the value first", () => {
    people = [
      [name:"Abby",  age:7,  hair:"blond"],
      [name:"Fred",  age:12, hair:"brown"],
      [name:"Rusty", age:30, hair:"brown"],
      [name:"Alois", age:65, disposition:"surly"]
    ]
    eqHair = array:key_eq(_, "hair")
    expect_equal(eqHair("brown", people[2]), true)
    expect_equal(eqHair("blond", people[2]), false)
  })

  it("filters a mixed array of keyed objects and deep-prints", () => {
    people = [
      [name:"Abby",  age:7,  hair:"blond"],
      [name:"Fred",  age:12, hair:"brown"],
      [name:"Rusty", age:30, hair:"brown"],
      [name:"Alois", age:65, disposition:"surly"]
    ]
    hasBrownHair = array:key_eq("brown", "hair")
    result = std:deep(array:filter(hasBrownHair, people))
    expect_equal(
      result,
      [
        [name:"Fred",  age:12, hair:"brown"],
        [name:"Rusty", age:30, hair:"brown"]
      ]
    )
  })

  it("works with array:find and array:findIndex", () => {
    people = [
      [name:"Abby",  age:7,  hair:"blond"],
      [name:"Fred",  age:12, hair:"brown"],
      [name:"Rusty", age:30, hair:"brown"],
      [name:"Alois", age:65, disposition:"surly"]
    ]
    hasBrownHair = array:key_eq("brown", "hair")
    first = array:find(hasBrownHair, people)
    expect_equal(first["name"], "Fred")
    idx = array:findIndex(hasBrownHair, people)
    expect_equal(idx, 1)
  })

  it("composes with other predicates", () => {
    people = [
      [name:"Abby",  age:7,  hair:"blond"],
      [name:"Fred",  age:12, hair:"brown"],
      [name:"Rusty", age:30, hair:"brown"],
      [name:"Alois", age:65, disposition:"surly"]
    ]
    hasBrownHair = array:key_eq("brown", "hair")
    isAdult = p => p["age"] >= 18
    both = array:filter(p => hasBrownHair(p) && isAdult(p), people)
    expect_equal(both, [[name:"Rusty", age:30, hair:"brown"]])
  })

  it("compares numeric values by key", () => {
    people = [
      [name:"Abby",  age:7,  hair:"blond"],
      [name:"Fred",  age:12, hair:"brown"],
      [name:"Rusty", age:30, hair:"brown"]
    ]
    isAge12 = array:key_eq(12, "age")
    expect_equal(isAge12(people[1]), true)
    expect_equal(isAge12(people[2]), false)
    only12 = array:filter(isAge12, people)
    expect_equal(only12, [[name:"Fred", age:12, hair:"brown"]])
  })

  it("treats missing keys as false", () => {
    people = [
      [name:"Abby",  age:7,  hair:"blond"],
      [name:"Fred",  age:12, hair:"brown"],
      [name:"Rusty", age:30, hair:"brown"],
      [name:"Alois", age:65, disposition:"surly"]
    ]
    hasDispositionSurly = array:key_eq("surly", "disposition")
    expect_equal(hasDispositionSurly(people[3]), true)
    expect_equal(hasDispositionSurly(people[0]), false)
  })

  it("integrates with every and some", () => {
    people = [
      [name:"Abby",  age:7,  hair:"blond"],
      [name:"Fred",  age:12, hair:"brown"],
      [name:"Rusty", age:30, hair:"brown"]
    ]
    hasBrownHair = array:key_eq("brown", "hair")
    expect_equal(array:every(p => p["age"] > 0, people), true)
    expect_equal(array:some(hasBrownHair, people), true)
  })

  it("supports passing a key_eq partial into a filter partial", () => {
    people = [
      [name:"Abby",  age:7,  hair:"blond"],
      [name:"Fred",  age:12, hair:"brown"],
      [name:"Rusty", age:30, hair:"brown"]
    ]
    hasBrownHair = array:key_eq("brown", "hair")
    filterBrownHair = array:filter(hasBrownHair)
    expect_equal(
      filterBrownHair(people),
      [
        [name:"Fred",  age:12, hair:"brown"],
        [name:"Rusty", age:30, hair:"brown"]
      ]
    )
  })

})