File: old_channel_integration.rb

package info (click to toggle)
ruby-concurrent 1.1.6%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 30,284 kB
  • sloc: ruby: 30,875; java: 6,117; javascript: 1,114; ansic: 288; makefile: 10; sh: 6
file content (54 lines) | stat: -rw-r--r-- 1,287 bytes parent folder | download | duplicates (3)
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
module Concurrent
  module Promises
    module FactoryMethods

      # @!visibility private

      module OldChannelIntegration

        # @!visibility private

        # only proof of concept
        # @return [Future]
        def select(*channels)
          # TODO (pitr-ch 26-Mar-2016): re-do, has to be non-blocking
          future do
            # noinspection RubyArgCount
            Channel.select do |s|
              channels.each do |ch|
                s.take(ch) { |value| [value, ch] }
              end
            end
          end
        end
      end

      include OldChannelIntegration
    end

    class Future < AbstractEventFuture

      # @!visibility private

      module OldChannelIntegration

        # @!visibility private

        # Zips with selected value form the suplied channels
        # @return [Future]
        def then_select(*channels)
          future = Concurrent::Promises.select(*channels)
          ZipFuturesPromise.new_blocked_by2(self, future, @DefaultExecutor).future
        end

        # @note may block
        # @note only proof of concept
        def then_put(channel)
          on_fulfillment_using(:io, channel) { |value, channel| channel.put value }
        end
      end

      include OldChannelIntegration
    end
  end
end