# maxheap
A **max-heap** library with an API that mirrors Python’s `heapq`—but **max-first**.
It ships with a fast **C accelerator** (`maxheap._cmaxheap`) and a **pure-Python fallback**.
* Python: 3.9–3.13
* License: MIT
* Package name: `maxheap`
---
## Features
* Functional API: `heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`, `peek`, `is_heap`
* OO wrapper: `MaxHeap` with `push/pop/peek/replace/pushpop`
* Optional C extension for speed; pure-Python fallback if unavailable
* Reproducible **microbenchmarks** with CSV output
* Test suite (`pytest`) including property tests
---
## Quickstart (from a fresh clone)
> **Run all commands from the project root** (the folder that contains `pyproject.toml`).
### macOS/Linux (bash/zsh)
```bash
# 0) Verify you're in the repo root
pwd
ls pyproject.toml
# 1) Create a clean virtualenv
python3 -m venv .venv
# 2) Activate it
source .venv/bin/activate
# 3) Confirm it's active & valid
echo "VIRTUAL_ENV=$VIRTUAL_ENV"
test -x .venv/bin/python && echo "venv OK" || echo "venv MISSING"
python -V
# 4) Install in editable mode (builds the C extension)
python -m pip install -U pip setuptools wheel
python -m pip install -e .
# 5) Sanity check the extension is loaded
python - <<'PY'
import maxheap, sys
print("HAVE_CEXT:", getattr(maxheap, "_HAVE_CEXT", None))
print("heapify impl:", maxheap.heapify.__module__)
print("python:", sys.version)
PY
```
Expected:
```
HAVE_CEXT: True
heapify impl: maxheap._cmaxheap
python: 3.13.x (...)
```
If `HAVE_CEXT` is `False`, you’re using the pure-Python fallback.
### Windows (PowerShell)
```powershell
# 0) Verify you're in the repo root
Get-ChildItem pyproject.toml
# 1) Create a venv
py -m venv .venv
# 2) Activate
. .\.venv\Scripts\Activate.ps1
# 3) Install (use -m to ensure the venv's Python)
python -m pip install -U pip setuptools wheel
python -m pip install -e .
# 4) Sanity
python - <<'PY'
import maxheap, sys
print("HAVE_CEXT:", getattr(maxheap, "_HAVE_CEXT", None))
print("heapify impl:", maxheap.heapify.__module__)
print("python:", sys.version)
PY
```
---
## Rebuilding after C changes
Any time you modify `src/maxheap/_cmaxheap.c`, rebuild:
```bash
# inside the activated venv
rm -rf build
python -m pip install -e .
```
---
## Usage
The API mirrors Python’s built-in [`heapq`](https://docs.python.org/3/library/heapq.html) — but instead of a min-heap that requires negating keys for max-first behavior, **`maxheap` stores the largest element at index `0`** and operates directly without the negation overhead.
You can choose between a **functional API** (works on plain lists) and an **OO wrapper** (`MaxHeap` class).
---
### Functional API
```python
import maxheap as heapq # same API names as heapq
# Start with an empty list
h = []
# Push elements
heapq.heappush(h, 3)
heapq.heappush(h, 10)
heapq.heappush(h, 5)
# Peek at the largest without removing it
heapq.peek(h) # -> 10
# Pop the largest
heapq.heappop(h) # -> 10
heapq.peek(h) # -> 5
# Replace the largest atomically
heapq.heapreplace(h, 4) # pops max (5), pushes 4 -> returns 5
# Push an element and pop the largest in a single step
heapq.heappushpop(h, 7) # pushes 7, pops max -> returns 7
# Turn any list into a valid max-heap in place
data = [1, 8, 3, 2]
heapq.heapify(data) # data is now a valid max-heap
```
**When to use:**
* You want to use the `heapq`-style API but without the min-heap + negation hack.
* You don’t need to subclass or wrap the heap in your own object.
---
### OO wrapper
```python
from maxheap import MaxHeap
# Initialize from iterable
h = MaxHeap([3, 1, 6, 5, 2, 4])
# Push and pop
h.push(10)
h.peek() # -> 10
h.pop() # -> 10
# Length and iteration
len(h) # -> 6
list(h) # Pops all items in descending order
# Check if a list is a valid max-heap
MaxHeap.is_heap([10, 5, 6, 2]) # True
```
**When to use:**
* You want an object that *owns* its heap data.
* You want utility methods (`peek`, `is_heap`, iteration) with clean semantics.
---
**Tip:** All hot-path operations (`heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`) are C-accelerated — so you get **max-heap behavior faster than `heapq` with negation**.
---
## Running the tests
```bash
# ensure venv is active and package is installed
source .venv/bin/activate # Windows: .venv\Scripts\activate
python -m pip install -e .
python -m pip install -q pytest hypothesis
python -m pytest -q
```
You should see all tests green (`tests/test_maxheap.py`, `tests/test_properties.py`).
---
## Benchmarks
The benchmark compares `maxheap` with a **baseline** using stdlib `heapq` as a max-heap via negation (`-x`).
### Quick run
```bash
python benchmarks/bench_maxheap.py
```
### Larger run + CSV output
```bash
mkdir -p benchmarks
python benchmarks/bench_maxheap.py --n 100000 --repeat 10 --warmup 3 --seed 1 \
--csv benchmarks/results.csv
head benchmarks/results.csv
```
**CLI flags**
* `--n` (default `10000`) — number of items
* `--repeat` (default `5`) — measured iterations per case
* `--warmup` (default `1`) — warmup runs
* `--seed` (default `1337`) — RNG seed
* `--csv` — write a results CSV
**Benchmarks covered**
* `heappush`
* `heapify`
* `heapify+drain` (heapify then pop all)
* `heappushpop`
* `heapreplace`
**Interpreting output**
Each line prints `min / median / mean`. When a baseline exists (the negation variant), a `%` indicates **median** speedup (positive = faster than baseline).
---
## A/B: Force the pure-Python fallback (optional)
If you want to compare C vs Python on your machine, temporarily let the package respect an env var:
```python
# top of src/maxheap/__init__.py
import os
try:
if os.getenv("MAXHEAP_PURE"):
raise ImportError
from ._cmaxheap import heapify, heappush, heappop, heappushpop, heapreplace # type: ignore
_HAVE_CEXT = True
except Exception:
from ._core import heapify, heappush, heappop, heappushpop, heapreplace
_HAVE_CEXT = False
```
Then:
```bash
python -m pip install -e .
python benchmarks/bench_maxheap.py --csv benchmarks/results_cext.csv
MAXHEAP_PURE=1 python benchmarks/bench_maxheap.py --csv benchmarks/results_pure.csv
```
---
## Packaging (optional)
```bash
rm -rf dist
python -m build # pip install build, if needed
python -m pip install -U twine
twine upload --repository testpypi dist/*
```
Fresh-venv verification:
```bash
python -m venv /tmp/venv && source /tmp/venv/bin/activate
python -m pip install -i https://test.pypi.org/simple/ maxheap
python - <<'PY'
import maxheap
print(maxheap._HAVE_CEXT, maxheap.heapify.__module__)
PY
```
---
## Project layout
```
.
├── benchmarks/
│ └── bench_maxheap.py # microbenchmarks (CSV capable)
├── src/
│ └── maxheap/
│ ├── _cmaxheap.c # C accelerator (optional)
│ ├── _core.py # pure-Python implementation
│ └── __init__.py # optional import of C ext, fallback to Python
├── tests/
│ ├── test_maxheap.py # unit tests
│ └── test_properties.py # property-based tests
├── pyproject.toml
└── README.md
```
---
## Troubleshooting
### “`.venv/bin/python: No such file or directory`” or prompt shows `(.venv)` but it’s broken
You’re in a shell with a **stale** venv path. Fix:
```bash
deactivate 2>/dev/null || true
rm -rf .venv build *.egg-info src/*.egg-info
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip setuptools wheel
python -m pip install -e .
```
Check:
```bash
echo "$VIRTUAL_ENV" # should point to .../maxheap/library/.venv
which python # should be .../maxheap/library/.venv/bin/python
```
### “`ModuleNotFoundError: No module named 'maxheap'`”
* Ensure you ran `python -m pip install -e .` in the **repo root**.
* Ensure tests are run with the **same venv**:
```bash
python -m pytest -q
```
* Confirm where `maxheap` is imported from:
```bash
python - <<'PY'
```
import maxheap, os
print(os.path.dirname(maxheap.**file**))
PY
````
### Rebuild didn’t pick up code changes
Remove build artifacts and reinstall:
```bash
rm -rf build
python -m pip install -e .
````
---
## API reference (quick)
```python
# functional API
heapify(x: List[T]) -> None
heappush(heap: List[T], item: T) -> None
heappop(heap: List[T]) -> T
heappushpop(heap: List[T], item: T) -> T
heapreplace(heap: List[T], item: T) -> T
peek(heap: List[T]) -> T
is_heap(x: List[T]) -> bool
# OO wrapper
class MaxHeap(Generic[T]):
def __init__(self, iterable: Optional[Iterable[T]] = None) -> None: ...
def push(self, item: T) -> None: ...
def pop(self) -> T: ...
def peek(self) -> T: ...
def replace(self, item: T) -> T: ...
def pushpop(self, item: T) -> T: ...
def heap(self) -> List[T]: ...
def __len__(self) -> int: ...
```
---
## Notes on performance
* The accelerator focuses on the hot operations that do comparisons and pointer moves (`heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`).
* `peek`, `is_heap`, and the `MaxHeap` wrapper remain in Python—these aren’t hot in typical workloads, and keeping them in Python preserves readability.
### Benchmark highlights
| operation | median time (s) | speedup vs `heapq`+negation |
| ----------------------- | --------------- | --------------------------- |
| heappush (maxheap) | 0.00535 | \~19% faster |
| heapify (maxheap) | 0.00349 | \~28% faster |
| heapify+drain (maxheap) | 0.04043 | \~41% faster |
**Result:** Max-first heap without the negation hack, and *still* beating the pants off `heapq`.
---
## Contributing
* Format/lint: `ruff` (see `pyproject.toml`)
* Types: `mypy` (strict options)
* Tests: `pytest`, property tests via `hypothesis`
PRs and issues welcome!
Raw data
{
"_id": null,
"home_page": null,
"name": "maxheapx",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "heap, priority queue, max-heap, data structures",
"author": "Timothy Roch",
"author_email": null,
"download_url": null,
"platform": null,
"description": "# maxheap\n\nA **max-heap** library with an API that mirrors Python\u2019s `heapq`\u2014but **max-first**.\nIt ships with a fast **C accelerator** (`maxheap._cmaxheap`) and a **pure-Python fallback**.\n\n* Python: 3.9\u20133.13\n* License: MIT\n* Package name: `maxheap`\n\n---\n\n## Features\n\n* Functional API: `heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`, `peek`, `is_heap`\n* OO wrapper: `MaxHeap` with `push/pop/peek/replace/pushpop`\n* Optional C extension for speed; pure-Python fallback if unavailable\n* Reproducible **microbenchmarks** with CSV output\n* Test suite (`pytest`) including property tests\n\n---\n\n## Quickstart (from a fresh clone)\n\n> **Run all commands from the project root** (the folder that contains `pyproject.toml`).\n\n### macOS/Linux (bash/zsh)\n\n```bash\n# 0) Verify you're in the repo root\npwd\nls pyproject.toml\n\n# 1) Create a clean virtualenv\npython3 -m venv .venv\n\n# 2) Activate it\nsource .venv/bin/activate\n\n# 3) Confirm it's active & valid\necho \"VIRTUAL_ENV=$VIRTUAL_ENV\"\ntest -x .venv/bin/python && echo \"venv OK\" || echo \"venv MISSING\"\npython -V\n\n# 4) Install in editable mode (builds the C extension)\npython -m pip install -U pip setuptools wheel\npython -m pip install -e .\n\n# 5) Sanity check the extension is loaded\npython - <<'PY'\nimport maxheap, sys\nprint(\"HAVE_CEXT:\", getattr(maxheap, \"_HAVE_CEXT\", None))\nprint(\"heapify impl:\", maxheap.heapify.__module__)\nprint(\"python:\", sys.version)\nPY\n```\n\nExpected:\n\n```\nHAVE_CEXT: True\nheapify impl: maxheap._cmaxheap\npython: 3.13.x (...)\n```\n\nIf `HAVE_CEXT` is `False`, you\u2019re using the pure-Python fallback.\n\n### Windows (PowerShell)\n\n```powershell\n# 0) Verify you're in the repo root\nGet-ChildItem pyproject.toml\n\n# 1) Create a venv\npy -m venv .venv\n\n# 2) Activate\n. .\\.venv\\Scripts\\Activate.ps1\n\n# 3) Install (use -m to ensure the venv's Python)\npython -m pip install -U pip setuptools wheel\npython -m pip install -e .\n\n# 4) Sanity\npython - <<'PY'\nimport maxheap, sys\nprint(\"HAVE_CEXT:\", getattr(maxheap, \"_HAVE_CEXT\", None))\nprint(\"heapify impl:\", maxheap.heapify.__module__)\nprint(\"python:\", sys.version)\nPY\n```\n\n---\n\n## Rebuilding after C changes\n\nAny time you modify `src/maxheap/_cmaxheap.c`, rebuild:\n\n```bash\n# inside the activated venv\nrm -rf build\npython -m pip install -e .\n```\n\n---\n\n\n## Usage\n\nThe API mirrors Python\u2019s built-in [`heapq`](https://docs.python.org/3/library/heapq.html) \u2014 but instead of a min-heap that requires negating keys for max-first behavior, **`maxheap` stores the largest element at index `0`** and operates directly without the negation overhead.\n\nYou can choose between a **functional API** (works on plain lists) and an **OO wrapper** (`MaxHeap` class).\n\n---\n\n### Functional API\n\n```python\nimport maxheap as heapq # same API names as heapq\n\n# Start with an empty list\nh = []\n\n# Push elements\nheapq.heappush(h, 3)\nheapq.heappush(h, 10)\nheapq.heappush(h, 5)\n\n# Peek at the largest without removing it\nheapq.peek(h) # -> 10\n\n# Pop the largest\nheapq.heappop(h) # -> 10\nheapq.peek(h) # -> 5\n\n# Replace the largest atomically\nheapq.heapreplace(h, 4) # pops max (5), pushes 4 -> returns 5\n\n# Push an element and pop the largest in a single step\nheapq.heappushpop(h, 7) # pushes 7, pops max -> returns 7\n\n# Turn any list into a valid max-heap in place\ndata = [1, 8, 3, 2]\nheapq.heapify(data) # data is now a valid max-heap\n```\n\n**When to use:**\n\n* You want to use the `heapq`-style API but without the min-heap + negation hack.\n* You don\u2019t need to subclass or wrap the heap in your own object.\n\n---\n\n### OO wrapper\n\n```python\nfrom maxheap import MaxHeap\n\n# Initialize from iterable\nh = MaxHeap([3, 1, 6, 5, 2, 4])\n\n# Push and pop\nh.push(10)\nh.peek() # -> 10\nh.pop() # -> 10\n\n# Length and iteration\nlen(h) # -> 6\nlist(h) # Pops all items in descending order\n\n# Check if a list is a valid max-heap\nMaxHeap.is_heap([10, 5, 6, 2]) # True\n```\n\n**When to use:**\n\n* You want an object that *owns* its heap data.\n* You want utility methods (`peek`, `is_heap`, iteration) with clean semantics.\n\n---\n\n**Tip:** All hot-path operations (`heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`) are C-accelerated \u2014 so you get **max-heap behavior faster than `heapq` with negation**.\n\n---\n\n## Running the tests\n\n```bash\n# ensure venv is active and package is installed\nsource .venv/bin/activate # Windows: .venv\\Scripts\\activate\npython -m pip install -e .\npython -m pip install -q pytest hypothesis\npython -m pytest -q\n```\n\nYou should see all tests green (`tests/test_maxheap.py`, `tests/test_properties.py`).\n\n---\n\n## Benchmarks\n\nThe benchmark compares `maxheap` with a **baseline** using stdlib `heapq` as a max-heap via negation (`-x`).\n\n### Quick run\n\n```bash\npython benchmarks/bench_maxheap.py\n```\n\n### Larger run + CSV output\n\n```bash\nmkdir -p benchmarks\npython benchmarks/bench_maxheap.py --n 100000 --repeat 10 --warmup 3 --seed 1 \\\n --csv benchmarks/results.csv\nhead benchmarks/results.csv\n```\n\n**CLI flags**\n\n* `--n` (default `10000`) \u2014 number of items\n* `--repeat` (default `5`) \u2014 measured iterations per case\n* `--warmup` (default `1`) \u2014 warmup runs\n* `--seed` (default `1337`) \u2014 RNG seed\n* `--csv` \u2014 write a results CSV\n\n**Benchmarks covered**\n\n* `heappush`\n* `heapify`\n* `heapify+drain` (heapify then pop all)\n* `heappushpop`\n* `heapreplace`\n\n**Interpreting output**\n\nEach line prints `min / median / mean`. When a baseline exists (the negation variant), a `%` indicates **median** speedup (positive = faster than baseline).\n\n---\n\n## A/B: Force the pure-Python fallback (optional)\n\nIf you want to compare C vs Python on your machine, temporarily let the package respect an env var:\n\n```python\n# top of src/maxheap/__init__.py\nimport os\ntry:\n if os.getenv(\"MAXHEAP_PURE\"):\n raise ImportError\n from ._cmaxheap import heapify, heappush, heappop, heappushpop, heapreplace # type: ignore\n _HAVE_CEXT = True\nexcept Exception:\n from ._core import heapify, heappush, heappop, heappushpop, heapreplace\n _HAVE_CEXT = False\n```\n\nThen:\n\n```bash\npython -m pip install -e .\npython benchmarks/bench_maxheap.py --csv benchmarks/results_cext.csv\n\nMAXHEAP_PURE=1 python benchmarks/bench_maxheap.py --csv benchmarks/results_pure.csv\n```\n\n---\n\n## Packaging (optional)\n\n```bash\nrm -rf dist\npython -m build # pip install build, if needed\npython -m pip install -U twine\ntwine upload --repository testpypi dist/*\n```\n\nFresh-venv verification:\n\n```bash\npython -m venv /tmp/venv && source /tmp/venv/bin/activate\npython -m pip install -i https://test.pypi.org/simple/ maxheap\npython - <<'PY'\nimport maxheap\nprint(maxheap._HAVE_CEXT, maxheap.heapify.__module__)\nPY\n```\n\n---\n\n## Project layout\n\n```\n.\n\u251c\u2500\u2500 benchmarks/\n\u2502 \u2514\u2500\u2500 bench_maxheap.py # microbenchmarks (CSV capable)\n\u251c\u2500\u2500 src/\n\u2502 \u2514\u2500\u2500 maxheap/\n\u2502 \u251c\u2500\u2500 _cmaxheap.c # C accelerator (optional)\n\u2502 \u251c\u2500\u2500 _core.py # pure-Python implementation\n\u2502 \u2514\u2500\u2500 __init__.py # optional import of C ext, fallback to Python\n\u251c\u2500\u2500 tests/\n\u2502 \u251c\u2500\u2500 test_maxheap.py # unit tests\n\u2502 \u2514\u2500\u2500 test_properties.py # property-based tests\n\u251c\u2500\u2500 pyproject.toml\n\u2514\u2500\u2500 README.md\n```\n\n---\n\n## Troubleshooting\n\n### \u201c`.venv/bin/python: No such file or directory`\u201d or prompt shows `(.venv)` but it\u2019s broken\n\nYou\u2019re in a shell with a **stale** venv path. Fix:\n\n```bash\ndeactivate 2>/dev/null || true\nrm -rf .venv build *.egg-info src/*.egg-info\npython3 -m venv .venv\nsource .venv/bin/activate\npython -m pip install -U pip setuptools wheel\npython -m pip install -e .\n```\n\nCheck:\n\n```bash\necho \"$VIRTUAL_ENV\" # should point to .../maxheap/library/.venv\nwhich python # should be .../maxheap/library/.venv/bin/python\n```\n\n### \u201c`ModuleNotFoundError: No module named 'maxheap'`\u201d\n\n* Ensure you ran `python -m pip install -e .` in the **repo root**.\n* Ensure tests are run with the **same venv**:\n\n ```bash\n python -m pytest -q\n ```\n* Confirm where `maxheap` is imported from:\n\n ```bash\n python - <<'PY'\n ```\n\nimport maxheap, os\nprint(os.path.dirname(maxheap.**file**))\nPY\n\n````\n\n### Rebuild didn\u2019t pick up code changes\n\nRemove build artifacts and reinstall:\n\n```bash\nrm -rf build\npython -m pip install -e .\n````\n\n---\n\n## API reference (quick)\n\n```python\n# functional API\nheapify(x: List[T]) -> None\nheappush(heap: List[T], item: T) -> None\nheappop(heap: List[T]) -> T\nheappushpop(heap: List[T], item: T) -> T\nheapreplace(heap: List[T], item: T) -> T\npeek(heap: List[T]) -> T\nis_heap(x: List[T]) -> bool\n\n# OO wrapper\nclass MaxHeap(Generic[T]):\n def __init__(self, iterable: Optional[Iterable[T]] = None) -> None: ...\n def push(self, item: T) -> None: ...\n def pop(self) -> T: ...\n def peek(self) -> T: ...\n def replace(self, item: T) -> T: ...\n def pushpop(self, item: T) -> T: ...\n def heap(self) -> List[T]: ...\n def __len__(self) -> int: ...\n```\n\n---\n\n\n## Notes on performance\n\n* The accelerator focuses on the hot operations that do comparisons and pointer moves (`heapify`, `heappush`, `heappop`, `heappushpop`, `heapreplace`).\n* `peek`, `is_heap`, and the `MaxHeap` wrapper remain in Python\u2014these aren\u2019t hot in typical workloads, and keeping them in Python preserves readability.\n\n### Benchmark highlights\n\n| operation | median time (s) | speedup vs `heapq`+negation |\n| ----------------------- | --------------- | --------------------------- |\n| heappush (maxheap) | 0.00535 | \\~19% faster |\n| heapify (maxheap) | 0.00349 | \\~28% faster |\n| heapify+drain (maxheap) | 0.04043 | \\~41% faster |\n\n**Result:** Max-first heap without the negation hack, and *still* beating the pants off `heapq`.\n\n---\n\n\n## Contributing\n\n* Format/lint: `ruff` (see `pyproject.toml`)\n* Types: `mypy` (strict options)\n* Tests: `pytest`, property tests via `hypothesis`\n\nPRs and issues welcome!\n",
"bugtrack_url": null,
"license": null,
"summary": "A max-heap library with an API that mirrors Python's heapq (but max-first).",
"version": "0.1.1",
"project_urls": {
"Documentation": "https://maxheap.vercel.app/docs",
"Homepage": "https://maxheap.vercel.app",
"Issues": "https://github.com/timothyroch/maxheap/issues",
"Source": "https://github.com/timothyroch/maxheap"
},
"split_keywords": [
"heap",
" priority queue",
" max-heap",
" data structures"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "9b14bd8319b78da282e65bc401996465d69cc9f2d58821fa7627f5f08e921d90",
"md5": "623e580128a4545babfb97e51080d27f",
"sha256": "353c19a43c4ba07b9ca88a66d3f792fac82ab91423a1c840e3e53dbf12a00b6b"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"has_sig": false,
"md5_digest": "623e580128a4545babfb97e51080d27f",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 23422,
"upload_time": "2025-08-14T02:02:56",
"upload_time_iso_8601": "2025-08-14T02:02:56.591880Z",
"url": "https://files.pythonhosted.org/packages/9b/14/bd8319b78da282e65bc401996465d69cc9f2d58821fa7627f5f08e921d90/maxheapx-0.1.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "324bec30a01bc100e119fac77649ec34927a7966891e8fecd68ff75afc6969be",
"md5": "9711fffc4c9c3c46c10a2e20a643989a",
"sha256": "476f66e0432e6fb45661a57b22652188c3682506628e79e5227cbd17f98cc6f5"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp310-cp310-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "9711fffc4c9c3c46c10a2e20a643989a",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 23408,
"upload_time": "2025-08-14T02:02:58",
"upload_time_iso_8601": "2025-08-14T02:02:58.253086Z",
"url": "https://files.pythonhosted.org/packages/32/4b/ec30a01bc100e119fac77649ec34927a7966891e8fecd68ff75afc6969be/maxheapx-0.1.1-cp310-cp310-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4c93355b59881e6307e214cbeccf73531ebb0c0b8fe593f614ad1bb92d8c71dc",
"md5": "a8a651f3d6969d1762c12cb5c5313c39",
"sha256": "574863a484f24d78f7b543de8f50978d99a6f92788261aac9c3a36d2a56c4906"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"has_sig": false,
"md5_digest": "a8a651f3d6969d1762c12cb5c5313c39",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 24797,
"upload_time": "2025-08-14T02:02:59",
"upload_time_iso_8601": "2025-08-14T02:02:59.698045Z",
"url": "https://files.pythonhosted.org/packages/4c/93/355b59881e6307e214cbeccf73531ebb0c0b8fe593f614ad1bb92d8c71dc/maxheapx-0.1.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a092f6dd0eb50f49e0a73cad8756b15aabbc9161b328856d4a31dcac47f7ee91",
"md5": "9214bb3d824ce03765a706fc12d7746d",
"sha256": "5c2ab61f5749e96a6566fd644aebd0308faef440948efb7b9af3c605dd58788b"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp311-cp311-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "9214bb3d824ce03765a706fc12d7746d",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 24808,
"upload_time": "2025-08-14T02:03:01",
"upload_time_iso_8601": "2025-08-14T02:03:01.031386Z",
"url": "https://files.pythonhosted.org/packages/a0/92/f6dd0eb50f49e0a73cad8756b15aabbc9161b328856d4a31dcac47f7ee91/maxheapx-0.1.1-cp311-cp311-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9c840828b5109013d052e3b716b00392f01b8c8cc4647f5d5f4d1ad4dfaa59f8",
"md5": "11a286916e445e7b8153c1d1790c288f",
"sha256": "80df0a07193729b9134c04bac958ce7d96a857422ff38821a5a154a1bf9c5ee2"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"has_sig": false,
"md5_digest": "11a286916e445e7b8153c1d1790c288f",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 25881,
"upload_time": "2025-08-14T02:03:02",
"upload_time_iso_8601": "2025-08-14T02:03:02.249054Z",
"url": "https://files.pythonhosted.org/packages/9c/84/0828b5109013d052e3b716b00392f01b8c8cc4647f5d5f4d1ad4dfaa59f8/maxheapx-0.1.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c712a0d96d3290529c49b77d093d35e305ecf94c4b8d1e397798f950957ecbf5",
"md5": "81eecfa00079af69e879c9db1b81a798",
"sha256": "742c4acfb592f9164ca7f4cc780fbe67ed1ca704ee81ca94172de06eb4a73326"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "81eecfa00079af69e879c9db1b81a798",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 25793,
"upload_time": "2025-08-14T02:03:03",
"upload_time_iso_8601": "2025-08-14T02:03:03.495470Z",
"url": "https://files.pythonhosted.org/packages/c7/12/a0d96d3290529c49b77d093d35e305ecf94c4b8d1e397798f950957ecbf5/maxheapx-0.1.1-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6b6028d187c6e7cdfbc747a62e857f31cab6681ce0194a906f784fa5b1f9dc9d",
"md5": "c5e50cc6148ee1d73d1dd23c4d1d3766",
"sha256": "c909e1492f0f8616d0c753ce519542c43ef46e2204bd95f14c650fabc4838439"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"has_sig": false,
"md5_digest": "c5e50cc6148ee1d73d1dd23c4d1d3766",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 25958,
"upload_time": "2025-08-14T02:03:05",
"upload_time_iso_8601": "2025-08-14T02:03:05.011751Z",
"url": "https://files.pythonhosted.org/packages/6b/60/28d187c6e7cdfbc747a62e857f31cab6681ce0194a906f784fa5b1f9dc9d/maxheapx-0.1.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "53f32a610a5b504b1c8c6b8ea5fa85319063cb659a7d34286cab331474b9084d",
"md5": "adfdc0da2b75d4f1b040547f1a0bb28e",
"sha256": "5fa895db83d63bdd56aae86130254f47a83ac235837474082f819b036ee23efe"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp313-cp313-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "adfdc0da2b75d4f1b040547f1a0bb28e",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 25832,
"upload_time": "2025-08-14T02:03:06",
"upload_time_iso_8601": "2025-08-14T02:03:06.343053Z",
"url": "https://files.pythonhosted.org/packages/53/f3/2a610a5b504b1c8c6b8ea5fa85319063cb659a7d34286cab331474b9084d/maxheapx-0.1.1-cp313-cp313-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7ea02b5c4e15e164e6c496561aaa0663854e5174f67af9cee7ea3730f31165fe",
"md5": "c4e7e9b2d8ad926ae612b39e141c9824",
"sha256": "abd549dd40421a037bc89c784e6402517c4010f89018252b0dc50522fb8cfe36"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"has_sig": false,
"md5_digest": "c4e7e9b2d8ad926ae612b39e141c9824",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 26064,
"upload_time": "2025-08-14T02:03:07",
"upload_time_iso_8601": "2025-08-14T02:03:07.274226Z",
"url": "https://files.pythonhosted.org/packages/7e/a0/2b5c4e15e164e6c496561aaa0663854e5174f67af9cee7ea3730f31165fe/maxheapx-0.1.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f26bc1135414b06712f35844c23daab161b6fc89ad3b8df41f4396b4ba2bc22b",
"md5": "144b8586d9108870ddf094f286d74ee8",
"sha256": "be3f89d05944cece18175c9db639ee519fc1e8c252561e3c92c0835c81ac2e56"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp314-cp314-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "144b8586d9108870ddf094f286d74ee8",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 25944,
"upload_time": "2025-08-14T02:03:08",
"upload_time_iso_8601": "2025-08-14T02:03:08.493533Z",
"url": "https://files.pythonhosted.org/packages/f2/6b/c1135414b06712f35844c23daab161b6fc89ad3b8df41f4396b4ba2bc22b/maxheapx-0.1.1-cp314-cp314-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2bb975449ede9353cf5bdde5655a82203eece4d5cbd7c48355df8a11a35d2b3c",
"md5": "39f1d43cc7c35f246f56e8ec9fc72773",
"sha256": "ff9ea72f8af2a17319892c9c81e560339e4a6bb1b4dc14ea021e657074b508ce"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"has_sig": false,
"md5_digest": "39f1d43cc7c35f246f56e8ec9fc72773",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 30876,
"upload_time": "2025-08-14T02:03:09",
"upload_time_iso_8601": "2025-08-14T02:03:09.381782Z",
"url": "https://files.pythonhosted.org/packages/2b/b9/75449ede9353cf5bdde5655a82203eece4d5cbd7c48355df8a11a35d2b3c/maxheapx-0.1.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8c0e0f719fb5bf642400f7dbdf26753de94ca5c3d46ad039b163346fb9237e75",
"md5": "2f05d2800a6ea4678df7625e3e534e0e",
"sha256": "de606dcdadb9898659b136e9d48f3b272b7a357ddc504486e6c5b77845f97548"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "2f05d2800a6ea4678df7625e3e534e0e",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 30380,
"upload_time": "2025-08-14T02:03:10",
"upload_time_iso_8601": "2025-08-14T02:03:10.846832Z",
"url": "https://files.pythonhosted.org/packages/8c/0e/0f719fb5bf642400f7dbdf26753de94ca5c3d46ad039b163346fb9237e75/maxheapx-0.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c3b12a7f8496a80578b9c6df20127eaa169552310b14bc6b3379fa2ceb6af3c3",
"md5": "b62f36579b3e350bf58b1092854936bb",
"sha256": "bab208c6a6cb26c61220afc6ee013391d325a362d307218f7ab9f18d285bc69a"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"has_sig": false,
"md5_digest": "b62f36579b3e350bf58b1092854936bb",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 23175,
"upload_time": "2025-08-14T02:03:11",
"upload_time_iso_8601": "2025-08-14T02:03:11.873528Z",
"url": "https://files.pythonhosted.org/packages/c3/b1/2a7f8496a80578b9c6df20127eaa169552310b14bc6b3379fa2ceb6af3c3/maxheapx-0.1.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "785b72094cc5a5aba564c508da1904be28de124c70e634928cf1bcf6f73d0709",
"md5": "90636afb5391be5698b87e8ca0453895",
"sha256": "70d3d323edbd8765e50642f035ca5670a16e899c105a77f402ff2e6435c484d0"
},
"downloads": -1,
"filename": "maxheapx-0.1.1-cp39-cp39-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "90636afb5391be5698b87e8ca0453895",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 23157,
"upload_time": "2025-08-14T02:03:13",
"upload_time_iso_8601": "2025-08-14T02:03:13.509948Z",
"url": "https://files.pythonhosted.org/packages/78/5b/72094cc5a5aba564c508da1904be28de124c70e634928cf1bcf6f73d0709/maxheapx-0.1.1-cp39-cp39-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-14 02:02:56",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "timothyroch",
"github_project": "maxheap",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "maxheapx"
}