Hey guys,

Chendo, thanks for the thought. I'm going to rewrite it and will check
out a few things in more detail.
Nicholas' example has given me some things to think about too.

Cheers,
Chris


On Wed, Jan 23, 2013 at 4:06 PM, Nicholas Jefferson
<[email protected]> wrote:
>> https://gist.github.com/4600139
>
>
>     require "childprocess"
>
>     class Pipes
>         class ProcessBit
>             class Future
>                 def initialize(process)
>                     @process = process
>                     return
>                 end
>
>                 def wait
>                     @process.wait
>                     return
>                 end
>             end
>
>             def initialize(args)
>                 @process = ChildProcess.build(*args)
>                 return
>             end
>
>             def get_o
>                 return @process.io.stdin
>             end
>
>             def start(o)
>                 @process.duplex = true
>                 @process.io.stdout = o
>                 @process.start
>                 o.close
>                 return Future.new(@process)
>             end
>         end
>
>         class BlockBit
>             class Future
>                 def initialize(thread)
>                     @thread = thread
>                     return
>                 end
>
>                 def wait
>                     @thread.join
>                     return
>                 end
>             end
>
>             def initialize(block)
>                 @block = block
>                 @i, @o = IO.pipe
>                 @i.close_on_exec = true
>                 @o.close_on_exec = true
>                 return
>             end
>
>             def get_o
>                 return @o
>             end
>
>             def start(o)
>                 thread = Thread.new do
>                     begin
>                         @block.call(@i, o)
>                     ensure
>                         @i.close
>                         o.close
>                     end
>                 end
>                 return Future.new(thread)
>             end
>         end
>
>         def initialize
>             @bits = []
>             return
>         end
>
>         def to(*args, &block)
>             if block_given?
>                 @bits.push(BlockBit.new(block))
>             else
>                 @bits.push(ProcessBit.new(args))
>             end
>             return self
>         end
>
>         def run
>             futures = []
>             o = File.open("/dev/null", mode: IO::WRONLY)
>             @bits.reverse_each do |bit|
>                 futures.push(bit.start(o))
>                 o = bit.get_o
>             end
>             o.close
>             futures.reverse_each do |future|
>                 future.wait
>             end
>             return
>         end
>     end
>
>     def tee(s, i, o)
>         i.each_line do |line|
>             STDOUT.write("#{s}:#{line}")
>             o.write(line)
>         end
>         return
>     end
>
>     Pipes.new.to("ls").to("sort").to { |i, o|
>         tee("1", i, o)
>     }.to("sort", "-r").to { |i, o|
>         tee("2", i, o)
>     }.run
>
> Thanks,
>
> Nicholas
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby or Rails Oceania" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/rails-oceania?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
or Rails Oceania" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
Visit this group at http://groups.google.com/group/rails-oceania?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to