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:
Anna Schumaker 2019-04-30 07:34:48 -04:00
parent b6830dc337
commit 07f5b9b78d

View File

@ -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: