File: thread_id.rb

package info (click to toggle)
sonic-pi 3.2.2~repack-8
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 71,872 kB
  • sloc: ruby: 30,548; cpp: 8,490; sh: 957; ansic: 461; erlang: 360; lisp: 141; makefile: 44
file content (77 lines) | stat: -rw-r--r-- 1,632 bytes parent folder | download | duplicates (4)
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