extend("test")
extend("array")

describe("array:zip", () => {
  it("zips two int arrays", () => {
    expect_equal(array:zip([1,2,3], [4,5,6]), [[1,4],[2,5],[3,6]])
  })

  it("works with partial usage", () => {
    zipA = array:zip([10,20])
    expect_equal(zipA([100,200]), [[10,100],[20,200]])
  })

  it("supports placeholder usage for first argument", () => {
    partial = array:zip(_, ["a","b"])
    expect_equal(partial(["x","y"]), [["x","a"],["y","b"]])
  })
})

describe("array:zipWith", () => {
  it("zips with a function", () => {
    out = array:zipWith((a,b)=>a+b, [1,2,3], [10,20,30])
    expect_equal(out, [11,22,33])
  })
  # Partial usage could be tested if zipWith supports partials in your bridging.
})

describe("array:intersection", () => {
  it("returns intersection of two int arrays", () => {
    expect_equal(array:intersection([1,2,3,4], [2,4,6]), [2,4])
  })
  it("works with partial usage", () => {
    inter2 = array:intersection([7,8,9])
    expect_equal(inter2([6,7,10]), [7])
  })
  it("supports placeholders", () => {
    partial = array:intersection(_, [1,5,9])
    expect_equal(partial([0,1,2,9]), [1,9])
  })
})

describe("array:difference", () => {
  it("returns difference of two int arrays", () => {
    expect_equal(array:difference([1,2,3,4], [2,4,6]), [1,3])
  })
  it("works with partial usage", () => {
    diff = array:difference([7,8,9])
    expect_equal(diff([8]), [7,9])
  })
  it("supports placeholders", () => {
    partial = array:difference(_, [2,3])
    expect_equal(partial([1,2,3,4]), [1,4])
  })
})

describe("array:union", () => {
  it("returns union of two int arrays", () => {
    expect_equal(array:union([1,2,3], [3,4,5]), [1,2,3,4,5])
  })
  it("works with partial usage", () => {
    unionA = array:union([10,20])
    expect_equal(unionA([20,30,40]), [10,20,30,40])
  })
  it("supports placeholder usage", () => {
    partial = array:union(_, [4,5,6])
    expect_equal(partial([1,4,7]), [1,4,7,5,6])
  })
})
