Sha256: 2e89a07c33959c9106f88b7006091b8a3f6e4fec4707ecfa294a6096f284259d

Contents?: true

Size: 1.49 KB

Versions: 1

Compression:

Stored size: 1.49 KB

Contents

require "xi/version"
require 'xi/core_ext'
require 'xi/pattern'
require 'xi/event'
require 'xi/stream'
require 'xi/clock'

def inf
  Float::INFINITY
end

module Xi
  def self.default_backend
    @default_backend
  end

  def self.default_backend=(new_name)
    @default_backend = new_name && new_name.to_sym
  end

  module Init
    def peek(pattern, *args)
      pattern.peek(*args)
    end

    def peek_events(pattern, *args)
      pattern.peek_events(*args)
    end

    def clock
      @default_clock ||= Clock.new
    end

    def stop_all
      @streams.each do |backend, ss|
        ss.each do |name, stream|
          stream.stop
        end
      end
    end
    alias_method :hush, :stop_all

    def method_missing(method, backend=nil, **opts)
      backend ||= Xi.default_backend
      super if backend.nil?

      if !backend.is_a?(String) && !backend.is_a?(Symbol)
        fail ArgumentError, "invalid backend '#{backend}'"
      end

      @streams ||= {}
      @streams[backend] ||= {}

      s = @streams[backend][method] ||= begin
        require "xi/#{backend}"
        cls = Class.const_get("#{backend.to_s.capitalize}::Stream")
        cls.new(method, self.clock, **opts)
      end

      b = Pry.binding_for(self)
      b.local_variable_set(method, s)

      s
    end
  end
end

singleton_class.include Xi::Init

# Try to load Supercollider backend and set it as default if installed
begin
  require "xi/supercollider"
  Xi.default_backend = :supercollider
rescue LoadError
  Xi.default_backend = nil
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
xi-lang-0.1.3 lib/xi.rb