mirror of
https://github.com/exaloop/codon.git
synced 2025-06-03 15:03:52 +08:00
stdlib/bisect.codon
This commit is contained in:
parent
cc55bf9a21
commit
26863d2fba
@ -1,4 +1,52 @@
|
||||
def bisect_left(a, x, lo: int = 0, hi: int = -1) -> int:
|
||||
# (c) 2022 Exaloop Inc. All rights reserved.
|
||||
# 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:
|
||||
"""
|
||||
Return the index where to insert item x in list a, assuming a is sorted.
|
||||
|
||||
@ -9,20 +57,24 @@ def bisect_left(a, x, lo: int = 0, hi: int = -1) -> int:
|
||||
Optional args lo (default 0) and hi (default len(a)) bound the
|
||||
slice of a to be searched.
|
||||
|
||||
Default values: lo=0, high=None
|
||||
For now seq will use len(a) instead of None
|
||||
Default values: lo=0, hi=None
|
||||
"""
|
||||
if lo < 0:
|
||||
raise ValueError('lo must be non-negative')
|
||||
if hi == -1:
|
||||
raise ValueError("lo must be non-negative")
|
||||
if hi is None:
|
||||
hi = len(a)
|
||||
while lo < hi:
|
||||
mid = (lo + hi) // 2
|
||||
if a[mid] < x: lo = mid+1
|
||||
else: hi = mid
|
||||
if a[mid] < x:
|
||||
lo = mid + 1
|
||||
else:
|
||||
hi = mid
|
||||
return lo
|
||||
|
||||
def bisect_right(a, x, lo: int = 0, hi: int = -1) -> int:
|
||||
|
||||
def bisect_right(
|
||||
a: List[T], x: S, lo: int = 0, hi: Optional[int] = None, T: type, S: type
|
||||
) -> int:
|
||||
"""
|
||||
Return the index where to insert item x in list a, assuming a is sorted.
|
||||
|
||||
@ -33,47 +85,45 @@ def bisect_right(a, x, lo: int = 0, hi: int = -1) -> int:
|
||||
Optional args lo (default 0) and hi (default len(a)) bound the
|
||||
slice of a to be searched.
|
||||
|
||||
Default values: lo=0, high=None
|
||||
For now seq will use len(a) instead of None
|
||||
Default values: lo=0, hi=None
|
||||
"""
|
||||
# lo = 0
|
||||
# hi = len(a)
|
||||
if lo < 0:
|
||||
raise ValueError('lo must be non-negative')
|
||||
if hi == -1:
|
||||
raise ValueError("lo must be non-negative")
|
||||
if hi is None:
|
||||
hi = len(a)
|
||||
while lo < hi:
|
||||
mid = (lo + hi) // 2
|
||||
if x < a[mid]: hi = mid
|
||||
else: lo = mid+1
|
||||
if x < a[mid]:
|
||||
hi = mid
|
||||
else:
|
||||
lo = mid + 1
|
||||
return lo
|
||||
|
||||
def bisect(a, x, lo: int = 0, hi: int = -1) -> int:
|
||||
"""
|
||||
bisect = bisect_right
|
||||
"""
|
||||
# lo, hi = 0, len(a)
|
||||
return bisect_right(a, x, lo, hi)
|
||||
|
||||
def insort_left(a, x, lo: int = 0, hi: int = -1):
|
||||
def insort_left(
|
||||
a: List[T], x: S, lo: int = 0, hi: Optional[int] = None, T: type, S: type
|
||||
) -> void:
|
||||
"""
|
||||
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.
|
||||
|
||||
Default values: lo=0, high=None
|
||||
Default values: lo=0, hi=None
|
||||
For now seq will use len(a) instead of None
|
||||
"""
|
||||
lo = bisect_left(a, x, lo, hi)
|
||||
a.insert(lo, x)
|
||||
|
||||
def insort_right(a, x, lo: int = 0, hi: int = -1):
|
||||
|
||||
def insort_right(
|
||||
a: List[T], x: S, lo: int = 0, hi: Optional[int] = None, T: type, S: type
|
||||
) -> void:
|
||||
"""
|
||||
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.
|
||||
|
||||
Default values: lo=0, high=None
|
||||
Default values: lo=0, hi=None
|
||||
For now seq will use len(a) instead of None
|
||||
"""
|
||||
lo = bisect_right(a, x, lo, hi)
|
||||
@ -83,8 +133,6 @@ def insort_right(a, x, lo: int = 0, hi: int = -1):
|
||||
else:
|
||||
a.insert(lo, x)
|
||||
|
||||
def insort(a, x, lo: int = 0, hi: int = -1):
|
||||
"""
|
||||
insort = insort_right
|
||||
"""
|
||||
insort_right(a, x, lo, hi)
|
||||
|
||||
bisect = bisect_right
|
||||
insort = insort_right
|
||||
|
Loading…
x
Reference in New Issue
Block a user