{"version":3,"file":"use-set.cjs","names":[],"sources":["../../src/use-set/use-set.ts"],"sourcesContent":["import { useRef, useState } from 'react';\n\nexport function readonlySetLikeToSet<T>(input: ReadonlySetLike<T>): Set<T> {\n  if (input instanceof Set) {\n    return input;\n  }\n  const result = new Set<T>();\n  const iterator = input.keys();\n  let next = iterator.next();\n  while (!next.done) {\n    result.add(next.value);\n    next = iterator.next();\n  }\n  return result;\n}\n\nexport function useSet<T>(values?: T[]): Set<T> {\n  const [set, setSet] = useState(() => new Set(values));\n  const setRef = useRef(set);\n  setRef.current = set;\n\n  set.add = (...args) => {\n    const res = Set.prototype.add.apply(setRef.current, args);\n    setSet(new Set(setRef.current));\n    return res;\n  };\n\n  set.clear = (...args) => {\n    Set.prototype.clear.apply(setRef.current, args);\n    setSet(new Set(setRef.current));\n  };\n\n  set.delete = (...args) => {\n    const res = Set.prototype.delete.apply(setRef.current, args);\n    setSet(new Set(setRef.current));\n    return res;\n  };\n\n  set.union = <U>(other: ReadonlySetLike<U>): Set<T | U> => {\n    const result = new Set<T | U>(setRef.current as Set<T>);\n    readonlySetLikeToSet(other).forEach((item) => result.add(item));\n    return result;\n  };\n\n  set.intersection = <U>(other: ReadonlySetLike<U>): Set<T & U> => {\n    const result = new Set<T & U>();\n    const otherSet = readonlySetLikeToSet(other);\n    setRef.current.forEach((item) => {\n      if (otherSet.has(item as any)) {\n        result.add(item as T & U);\n      }\n    });\n    return result;\n  };\n\n  set.difference = <U>(other: ReadonlySetLike<U>): Set<T> => {\n    const result = new Set<T>();\n    const otherSet = readonlySetLikeToSet(other);\n    setRef.current.forEach((item) => {\n      if (!otherSet.has(item as any)) {\n        result.add(item);\n      }\n    });\n    return result;\n  };\n\n  set.symmetricDifference = <U>(other: ReadonlySetLike<U>): Set<T | U> => {\n    const result = new Set<T | U>();\n    const otherSet = readonlySetLikeToSet(other);\n\n    setRef.current.forEach((item) => {\n      if (!otherSet.has(item as any)) {\n        result.add(item);\n      }\n    });\n\n    otherSet.forEach((item) => {\n      if (!setRef.current.has(item as any)) {\n        result.add(item);\n      }\n    });\n\n    return result;\n  };\n\n  return set;\n}\n"],"mappings":";;;AAEA,SAAgB,qBAAwB,OAAmC;CACzE,IAAI,iBAAiB,KACnB,OAAO;CAET,MAAM,yBAAS,IAAI,IAAO;CAC1B,MAAM,WAAW,MAAM,KAAK;CAC5B,IAAI,OAAO,SAAS,KAAK;CACzB,OAAO,CAAC,KAAK,MAAM;EACjB,OAAO,IAAI,KAAK,KAAK;EACrB,OAAO,SAAS,KAAK;CACvB;CACA,OAAO;AACT;AAEA,SAAgB,OAAU,QAAsB;CAC9C,MAAM,CAAC,KAAK,WAAA,GAAA,MAAA,SAAA,OAAyB,IAAI,IAAI,MAAM,CAAC;CACpD,MAAM,UAAA,GAAA,MAAA,OAAA,CAAgB,GAAG;CACzB,OAAO,UAAU;CAEjB,IAAI,OAAO,GAAG,SAAS;EACrB,MAAM,MAAM,IAAI,UAAU,IAAI,MAAM,OAAO,SAAS,IAAI;EACxD,OAAO,IAAI,IAAI,OAAO,OAAO,CAAC;EAC9B,OAAO;CACT;CAEA,IAAI,SAAS,GAAG,SAAS;EACvB,IAAI,UAAU,MAAM,MAAM,OAAO,SAAS,IAAI;EAC9C,OAAO,IAAI,IAAI,OAAO,OAAO,CAAC;CAChC;CAEA,IAAI,UAAU,GAAG,SAAS;EACxB,MAAM,MAAM,IAAI,UAAU,OAAO,MAAM,OAAO,SAAS,IAAI;EAC3D,OAAO,IAAI,IAAI,OAAO,OAAO,CAAC;EAC9B,OAAO;CACT;CAEA,IAAI,SAAY,UAA0C;EACxD,MAAM,SAAS,IAAI,IAAW,OAAO,OAAiB;EACtD,qBAAqB,KAAK,CAAC,CAAC,SAAS,SAAS,OAAO,IAAI,IAAI,CAAC;EAC9D,OAAO;CACT;CAEA,IAAI,gBAAmB,UAA0C;EAC/D,MAAM,yBAAS,IAAI,IAAW;EAC9B,MAAM,WAAW,qBAAqB,KAAK;EAC3C,OAAO,QAAQ,SAAS,SAAS;GAC/B,IAAI,SAAS,IAAI,IAAW,GAC1B,OAAO,IAAI,IAAa;EAE5B,CAAC;EACD,OAAO;CACT;CAEA,IAAI,cAAiB,UAAsC;EACzD,MAAM,yBAAS,IAAI,IAAO;EAC1B,MAAM,WAAW,qBAAqB,KAAK;EAC3C,OAAO,QAAQ,SAAS,SAAS;GAC/B,IAAI,CAAC,SAAS,IAAI,IAAW,GAC3B,OAAO,IAAI,IAAI;EAEnB,CAAC;EACD,OAAO;CACT;CAEA,IAAI,uBAA0B,UAA0C;EACtE,MAAM,yBAAS,IAAI,IAAW;EAC9B,MAAM,WAAW,qBAAqB,KAAK;EAE3C,OAAO,QAAQ,SAAS,SAAS;GAC/B,IAAI,CAAC,SAAS,IAAI,IAAW,GAC3B,OAAO,IAAI,IAAI;EAEnB,CAAC;EAED,SAAS,SAAS,SAAS;GACzB,IAAI,CAAC,OAAO,QAAQ,IAAI,IAAW,GACjC,OAAO,IAAI,IAAI;EAEnB,CAAC;EAED,OAAO;CACT;CAEA,OAAO;AACT"}