-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsongs.rb
103 lines (73 loc) · 2.4 KB
/
songs.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
require_relative 'my_enumerable'
class Song
attr_reader :name, :artist, :duration
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
def play
puts "Playing '#{name}' by #{artist} (#{duration} mins)..."
end
def each_filename
basename = "#{name}-#{artist}".gsub(" ", "-").downcase
extensions = [".mp3", ".wav", ".ac"]
extensions.each { |ext| yield basename + ext }
end
end
song1 = Song.new("Where is my mind", "The dust brothers", "4")
song2 = Song.new("The man comes around", "Jonny Cash", "5")
song3 = Song.new("Radioactive", "Imagine Dragons", "7")
song4 = Song.new("Somewhere I belong", "Linkin park", "8")
class Playlist
#include Enumerable
include MyEnumerable
def initialize(name)
@name = name
@songs = []
end
def add_song(song)
@songs << song
end
def each
@songs.each do |song|
yield song
end
end
def each_tagline
@songs.each { |song| yield "#{song.name} - #{song.artist}" }
end
def each_by_artist(artist)
select { |song| song.artist == artist }.each { |song| yield song }
end
end
playlist = Playlist.new("Favorite")
playlist.add_song(song1)
playlist.add_song(song2)
playlist.add_song(song3)
playlist.add_song(song4)
#playlist.each { |song| song.play }
# mind_songs = playlist.my_select { |song| song.name =~ /mind/ }
# p mind_songs
# short = playlist.detect { |song| song.duration.to_i < 6 }
# p short
# dragons = playlist.any? { |song| song.artist =~ /Dragons/ }
# p dragons
# longest = playlist.inject(0) do |sum, song|
# puts "Yielding #{sum}"
# sum > song.duration.to_i ? sum : song.duration.to_i
# end
# puts longest
# song_labels = playlist.my_map { |song| "#{song.name} - #{song.artist}" }
# p song_labels
# song_labels = playlist.my_reject { |song| song.name =~ /mind/ }
# p song_labels
# total_duration = playlist.reduce(0) { |sum, song| sum + song.duration.to_i }
# p total_duration
# playlist.each_tagline { |tagline| puts tagline }
# playlist.each_by_artist("Linkin park") { |song| song.play }
# song1.each_filename { |filename| puts filename }
# p playlist.my_detect { |song| song.artist == "Linkin park" }
# p playlist.my_any? { |song| song.artist == "Linkin park" }
total_duration = playlist.my_reduce(0) { |sum, song| sum + song.duration.to_i }
p total_duration