codon/stdlib/bisect.codon

132 lines
5.0 KiB
Python
Raw Normal View History

Dynamic Polymorphism (#58) * Use Static[] for static inheritance * Support .seq extension * Fix #36 * Polymorphic typechecking; vtables [wip] * v-table dispatch [wip] * vtable routing [wip; bug] * vtable routing [MVP] * Fix texts * Add union type support * Update FAQs * Clarify * Add BSL license * Add makeUnion * Add IR UnionType * Update union representation in LLVM * Update README * Update README.md * Update README * Update README.md * Add benchmarks * Add more benchmarks and README * Add primes benchmark * Update benchmarks * Fix cpp * Clean up list * Update faq.md * Add binary trees benchmark * Add fannkuch benchmark * Fix paths * Add PyPy * Abort on fail * More benchmarks * Add cpp word_count * Update set_partition cpp * Add nbody cpp * Add TAQ cpp; fix word_count timing * Update CODEOWNERS * Update README * Update README.md * Update CODEOWNERS * Fix bench script * Update binary_trees.cpp * Update taq.cpp * Fix primes benchmark * Add mandelbrot benchmark * Fix OpenMP init * Add Module::unsafeGetUnionType * UnionType [wip] [skip ci] * Integrate IR unions and Union * UnionType refactor [skip ci] * Update README.md * Update docs * UnionType [wip] [skip ci] * UnionType and automatic unions * Add Slack * Update faq.md * Refactor types * New error reporting [wip] * New error reporting [wip] * peglib updates [wip] [skip_ci] * Fix parsing issues * Fix parsing issues * Fix error reporting issues * Make sure random module matches Python * Update releases.md * Fix tests * Fix #59 * Fix #57 * Fix #50 * Fix #49 * Fix #26; Fix #51; Fix #47; Fix #49 * Fix collection extension methods * Fix #62 * Handle *args/**kwargs with Callable[]; Fix #43 * Fix #43 * Fix Ptr.__sub__; Fix polymorphism issues * Add typeinfo * clang-format * Upgrade fmtlib to v9; Use CPM for fmtlib; format spec support; __format__ support * Use CPM for semver and toml++ * Remove extension check * Revamp str methods * Update str.zfill * Fix thunk crashes [wip] [skip_ci] * Fix str.__reversed__ * Fix count_with_max * Fix vtable memory allocation issues * Add poly AST tests * Use PDQsort when stability does not matter * Fix dotted imports; Fix issues * Fix kwargs passing to Python * Fix #61 * Fix #37 * Add isinstance support for unions; Union methods return Union type if different * clang-format * Nicely format error tracebacks * Fix build issues; clang-format * Fix OpenMP init * Fix OpenMP init * Update README.md * Fix tests * Update license [skip ci] * Update license [ci skip] * Add copyright header to all source files * Fix super(); Fix error recovery in ClassStmt * Clean up whitespace [ci skip] * Use Python 3.9 on CI * Print info in random test * Fix single unions * Update random_test.codon * Fix polymorhic thunk instantiation * Fix random test * Add operator.attrgetter and operator.methodcaller * Add code documentation * Update documentation * Update README.md * Fix tests * Fix random init Co-authored-by: A. R. Shajii <ars@ars.me>
2022-12-05 00:45:21 +00:00
# Copyright (C) 2022 Exaloop Inc. <https://exaloop.io>
2022-01-14 17:49:19 +00:00
# Pats of this file: (c) 2022 Python Software Foundation. All right reserved.
# License:
# 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and
# the Individual or Organization ("Licensee") accessing and otherwise using Python
# 3.10.2 software in source or binary form and its associated documentation.
#
# 2. Subject to the terms and conditions of this License Agreement, PSF hereby
# grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
# analyze, test, perform and/or display publicly, prepare derivative works,
# distribute, and otherwise use Python 3.10.2 alone or in any derivative
# version, provided, however, that PSF's License Agreement and PSF's notice of
# copyright, i.e., "Copyright © 2001-2022 Python Software Foundation; All Rights
# Reserved" are retained in Python 3.10.2 alone or in any derivative version
# prepared by Licensee.
#
# 3. In the event Licensee prepares a derivative work that is based on or
# incorporates Python 3.10.2 or any part thereof, and wants to make the
# derivative work available to others as provided herein, then Licensee hereby
# agrees to include in any such work a brief summary of the changes made to Python
# 3.10.2.
#
# 4. PSF is making Python 3.10.2 available to Licensee on an "AS IS" basis.
# PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF
# EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
# WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
# USE OF PYTHON 3.10.2 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
#
# 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 3.10.2
# FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
# MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 3.10.2, OR ANY DERIVATIVE
# THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
#
# 6. This License Agreement will automatically terminate upon a material breach of
# its terms and conditions.
#
# 7. Nothing in this License Agreement shall be deemed to create any relationship
# of agency, partnership, or joint venture between PSF and Licensee. This License
# Agreement does not grant permission to use PSF trademarks or trade name in a
# trademark sense to endorse or promote products or services of Licensee, or any
# third party.
#
# 8. By copying, installing or otherwise using Python 3.10.2, Licensee agrees
# to be bound by the terms and conditions of this License Agreement.
def bisect_left(
a: List[T], x: S, lo: int = 0, hi: Optional[int] = None, T: type, S: type
) -> int:
2021-09-27 18:02:44 +00:00
"""
Return the index where to insert item x in list a, assuming a is sorted.
The return value i is such that all e in a[:i] have e < x, and all e in
a[i:] have e >= x. So if x already appears in the list, a.insert(x) will
insert just before the leftmost x already there.
Optional args lo (default 0) and hi (default len(a)) bound the
slice of a to be searched.
2022-01-14 17:49:19 +00:00
Default values: lo=0, hi=None
2021-09-27 18:02:44 +00:00
"""
if lo < 0:
2022-01-14 17:49:19 +00:00
raise ValueError("lo must be non-negative")
2022-02-16 15:51:16 +00:00
hi: int = len(a) if hi is None else hi
2021-09-27 18:02:44 +00:00
while lo < hi:
mid = (lo + hi) // 2
2022-01-14 17:49:19 +00:00
if a[mid] < x:
lo = mid + 1
else:
hi = mid
2021-09-27 18:02:44 +00:00
return lo
2022-01-14 17:49:19 +00:00
def bisect_right(
a: List[T], x: S, lo: int = 0, hi: Optional[int] = None, T: type, S: type
) -> int:
2021-09-27 18:02:44 +00:00
"""
Return the index where to insert item x in list a, assuming a is sorted.
The return value i is such that all e in a[:i] have e <= x, and all e in
a[i:] have e > x. So if x already appears in the list, a.insert(x) will
insert just after the rightmost x already there.
Optional args lo (default 0) and hi (default len(a)) bound the
slice of a to be searched.
2022-01-14 17:49:19 +00:00
Default values: lo=0, hi=None
2021-09-27 18:02:44 +00:00
"""
if lo < 0:
2022-01-14 17:49:19 +00:00
raise ValueError("lo must be non-negative")
2022-02-16 15:51:16 +00:00
hi: int = len(a) if hi is None else hi
2021-09-27 18:02:44 +00:00
while lo < hi:
mid = (lo + hi) // 2
2022-01-14 17:49:19 +00:00
if x < a[mid]:
hi = mid
else:
lo = mid + 1
2021-09-27 18:02:44 +00:00
return lo
2022-01-14 17:49:19 +00:00
def insort_left(
a: List[T], x: S, lo: int = 0, hi: Optional[int] = None, T: type, S: type
2022-02-16 15:51:16 +00:00
):
2021-09-27 18:02:44 +00:00
"""
Insert item x in list a, and keep it sorted assuming a is sorted.
If x is already in a, insert it to the left of the leftmost x.
2022-01-14 17:49:19 +00:00
Default values: lo=0, hi=None
2021-09-27 18:02:44 +00:00
For now seq will use len(a) instead of None
"""
lo = bisect_left(a, x, lo, hi)
a.insert(lo, x)
2022-01-14 17:49:19 +00:00
def insort_right(
a: List[T], x: S, lo: int = 0, hi: Optional[int] = None, T: type, S: type
2022-02-16 15:51:16 +00:00
):
2021-09-27 18:02:44 +00:00
"""
Insert item x in list a, and keep it sorted assuming a is sorted.
If x is already in a, insert it to the right of the rightmost x.
2022-01-14 17:49:19 +00:00
Default values: lo=0, hi=None
2021-09-27 18:02:44 +00:00
For now seq will use len(a) instead of None
"""
lo = bisect_right(a, x, lo, hi)
if lo == len(a):
a.append(x)
else:
a.insert(lo, x)
2022-01-14 17:49:19 +00:00
bisect = bisect_right
insort = insort_right