From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS22989 208.118.235.0/24 X-Spam-Status: No, score=-6.9 required=3.0 tests=BAYES_00,RCVD_IN_DNSWL_HI shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: dtas-all@80x24.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id CECDD2055A for ; Sun, 6 Dec 2015 02:44:28 +0000 (UTC) Received: from localhost ([::1]:48452 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a5PJM-0001Zk-6r for dtas-all@80x24.org; Sat, 05 Dec 2015 21:44:28 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35038) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a5PJK-0001Yd-GX for dtas-all@nongnu.org; Sat, 05 Dec 2015 21:44:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a5PJG-00008G-DV for dtas-all@nongnu.org; Sat, 05 Dec 2015 21:44:26 -0500 Received: from dcvr.yhbt.net ([64.71.152.64]:52606) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a5PJG-00008C-7i for dtas-all@nongnu.org; Sat, 05 Dec 2015 21:44:22 -0500 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id BE84B2055A for ; Sun, 6 Dec 2015 02:44:20 +0000 (UTC) From: Eric Wong To: Subject: [PATCH] tracklist: avoid needlessly building a hash for track IDs Date: Sun, 6 Dec 2015 02:44:20 +0000 Message-Id: <20151206024420.17146-1-e@80x24.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 64.71.152.64 X-BeenThere: dtas-all@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dtas-all-bounces+dtas-all=80x24.org@nongnu.org Sender: dtas-all-bounces+dtas-all=80x24.org@nongnu.org Building this hash is a linear operation anyways, so there's no point in doing it when Array#index can stop early if the track is found, to avoid unnecessary work. --- lib/dtas/tracklist.rb | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/lib/dtas/tracklist.rb b/lib/dtas/tracklist.rb index 1750f26..1ae2719 100644 --- a/lib/dtas/tracklist.rb +++ b/lib/dtas/tracklist.rb @@ -56,25 +56,14 @@ class DTAS::Tracklist # :nodoc: @pos = TL_DEFAULTS["pos"] end - def size - @list.size - end - - # caching this probably isn't worth it. a tracklist is usually - # a few tens of tracks, maybe a hundred at most. - def _track_id_map - by_track_id = {} - @list.each_with_index { |t,i| by_track_id[t.track_id] = i } - by_track_id - end - def get_tracks(track_ids) - by_track_id = _track_id_map - track_ids.map do |track_id| - idx = by_track_id[track_id] - # dtas-mpris fills in the metadata, we just return a path - [ track_id, idx ? @list[idx].to_path : nil ] + want = {} + track_ids.each { |i| want[i] = i } + rv = [] + @list.each do |t| + i = want[t.track_id] and rv << [ i, t.to_path ] end + rv end def tracks @@ -105,8 +94,7 @@ class DTAS::Tracklist # :nodoc: def add_track(track, after_track_id = nil, set_as_current = false) track = new_track(track) if after_track_id - by_track_id = _track_id_map - idx = by_track_id[after_track_id] or + idx = _idx_of(after_track_id) or raise ArgumentError, "after_track_id invalid" @list[idx, 1] = [ @list[idx], track ] if set_as_current @@ -125,9 +113,12 @@ class DTAS::Tracklist # :nodoc: track.track_id end + def _idx_of(track_id) + @list.index { |t| t.track_id == track_id } + end + def remove_track(track_id) - by_track_id = _track_id_map - idx = by_track_id.delete(track_id) or return false + idx = _idx_of(track_id) or return false track = @list.delete_at(idx) len = @list.size if @pos >= len @@ -138,8 +129,7 @@ class DTAS::Tracklist # :nodoc: end def go_to(track_id, offset_hhmmss = nil) - by_track_id = _track_id_map - if idx = by_track_id[track_id] + if idx = _idx_of(track_id) @goto_off = offset_hhmmss return @list[@goto_pos = idx].to_path end -- EW