curds: Use a bisect for insertion sorts
This drastically cuts down the number of comparisons needed to make an insertion. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
b6830dc337
commit
07f5b9b78d
|
@ -41,28 +41,30 @@ class Playlist(node.PlaylistNode):
|
|||
def add(self, track):
|
||||
if track is not None and track not in self:
|
||||
if len(self.sort_order) == 0:
|
||||
index = self.append_track(track)
|
||||
index = len(self.list)
|
||||
else:
|
||||
index = self.insert_track(track)
|
||||
index = self.bisect_track(track)
|
||||
|
||||
self.list[index:index] = [ track ]
|
||||
notify.notify("add-track", self, track, index)
|
||||
self.changed()
|
||||
|
||||
def append_track(self, track):
|
||||
self.list.append(track)
|
||||
return len(self.list) - 1
|
||||
def bisect_track(self, track):
|
||||
key = self.sort_key(track)
|
||||
begin = 0
|
||||
end = len(self.list)
|
||||
|
||||
while end - begin > 0:
|
||||
pos = (end + begin) // 2
|
||||
if key < self.sort_key(self.list[pos]):
|
||||
end = pos
|
||||
else:
|
||||
begin = pos + 1
|
||||
return begin
|
||||
|
||||
def changed(self):
|
||||
notify.notify("playlist-changed", self)
|
||||
|
||||
def insert_track(self, track):
|
||||
key = self.sort_key(track)
|
||||
for i, t in enumerate(self.list):
|
||||
if key < self.sort_key(t):
|
||||
self.list.insert(i, track)
|
||||
return i
|
||||
return self.append_track(track)
|
||||
|
||||
def next(self):
|
||||
max = len(self) - 1
|
||||
if max == -1:
|
||||
|
|
Loading…
Reference in New Issue
Block a user