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
|
# This file is part of Sonic Pi: http://sonic-pi.net
# Full project source: https://github.com/samaaron/sonic-pi
# License: https://github.com/samaaron/sonic-pi/blob/master/LICENSE.md
#
# Copyright 2017 by Sam Aaron (http://sam.aaron.name).
# All rights reserved.
#
# Permission is granted for use, copying, modification, and
# distribution of modified versions of this work as long as this
# notice is included.
#++
module SonicPi
class ThreadId
include Comparable
attr_reader :ids
def self.new_from_serialized(str)
_, name, vals = str.split('::-::')
raise "Unable to deserialize ThreadId: #{str}" unless name == "thread-id"
ids = vals.split('_').map{|v| v.to_i}
new(*ids)
end
def initialize(*ids)
@ids = ids.map { |i| i.to_i }.freeze
@serialized = "::-::thread-id::-::#{ids.join('_')}"
end
def <<(other)
self.class.new(*(@ids + [other]))
end
def ==(other)
@ids == other.ids
end
def <=>(other)
@ids.each_with_index do |el, idx|
# self is larger than other
return 1 if idx >= other.ids.size
return -1 if el < other.ids[idx]
return 1 if el > other.ids[idx]
end
# other is larger than self
return -1 if other.ids.size > @ids.size
# they are both of similar size
# with similar elements
return 0
end
def sp_thread_safe?
true
end
def __sp_make_thread_safe
self
end
def to_s
"#<SonicPi::ThreadId #{@ids.inspect}>"
end
def serialize
@serialized
end
def inspect
to_s
end
end
end
|