返回顶部

收藏

Stream的Ruby实现

更多
class Stream
    def initialize(head = nil, tail = nil)
        @head = head
        @tailFunc = tail
    end

    def empty?
        @head == nil
    end

    def head
        @head
    end

    def tail
        @tailFunc.call
    end

    def length
        count = 0
        walk { count += 1}
        return count
    end

    def add(s2)
        return zip(s2) {|x, y| x + y}
    end

    def substract(s2)
        return zip(s2) {|x, y| x - y}
    end

    def times(s2)
        return zip(s2) {|x, y| x * y}
    end

    def zip(s2, &block)
        return s2 if empty?
        return self if s2.empty?
        return Stream.new(block.call(head, s2.head), lambda { tail.zip(s2.tail, &block) })
    end

    def take(count)
        return self if empty?
        return Stream.new if count == 0
        return Stream.new(head, lambda { tail.take(count - 1) })
    end

    def map(&block)
        return self if empty?
        return Stream.new(block.call(head), lambda { tail.map(&block) })
    end

    def scale(factor)
        return map { |x| x * factor}
    end

    def filter(&block)
        return self if empty?
        return Stream.new(head, lambda { tail.filter(&block) }) if block.call(head)
        return tail.filter(&block)
    end

    def drop(count)
        return self if empty?
        s = self
        count.times {s = s.tail}
        return s
    end

    def member?(item)
        s = self
        s = s.tail until s.empty? || s.head == item
        return s.head == item
    end

    def force
        s = self
        s = s.tail until (s.empty?)
    end

    def walk(&block)
        map { |s| block.call(s); s }.force
    end

    def print
        walk { |s| puts s}
    end

    def item(index)
        s = self
        index.times { s = s.tail}
        return s.head
    end

    def sum
        return reduce(0) {|sum, new| sum + new}
    end

    def reduce(init, &block)
        return init if empty?
        return tail.reduce(block.call(init, head), &block);
    end

    def Stream.range(low = 1, high = nil)
        return Stream.make(low) if low == high
        return Stream.new(low, lambda { Stream.range(low + 1, high) })
    end

    def Stream.make(*args)
        return Stream.new if args.empty?
        return Stream.new(args.shift, lambda { Stream.make(*args) })
    end

    def Stream.make_ones
        return Stream.new(1, lambda { Stream.make_ones })
    end

    def Stream.make_natural_nums
        return Stream.new(1, lambda{ Stream.make_ones.add(Stream.make_natural_nums) })
    end

    def Stream.make_fib_nums_drop1
        return Stream.new(1, lambda {Stream.make_fib_nums.add(Stream.make_fib_nums_drop1) })
    end

    def Stream.make_fib_nums
        return Stream.new(0, lambda { Stream.make_fib_nums_drop1 })
    end

    def Stream.make_factor
        return Stream.new(1, lambda {  Stream.make_natural_nums.drop(1).times(Stream.make_factor) })
    end
end

Stream.make_factor.take(10).print

标签:ruby

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. Alex Wood 发表 2014-10-15 13:06:29 Deploying Ruby on Rails Applications to AWS OpsWor
  2. Alex Wood 发表 2014-10-22 12:04:19 Caching the Rails Asset Pipeline with Amazon Cloud
  3. Trevor Rowe 发表 2014-11-18 19:04:17 Using Resources
  4. Trevor Rowe 发表 2014-11-20 19:04:22 Waiters
  5. Trevor Rowe 发表 2014-11-20 19:04:22 Waiters
  6. Trevor Rowe 发表 2014-11-26 19:04:20 Client Response Stubs
  7. Alex Wood 发表 2014-12-02 17:32:13 AWS re:Invent 2014 Ruby Recap
  8. Alex Wood 发表 2014-12-10 17:20:18 Using Amazon RDS with Ruby on Rails and AWS OpsWor
  9. Trevor Rowe 发表 2015-01-28 17:48:41 Upcoming Stable Release of AWS SDK for Ruby – Vers
  10. Trevor Rowe 发表 2015-02-05 23:46:12 Announcing V2 of the AWS SDK for Ruby
  11. Trevor Rowe 发表 2015-02-13 00:00:22 Amazon DynamoDB Document API in Ruby (Part 1 – Pro
  12. Trevor Rowe 发表 2015-02-18 21:28:00 Amazon DynamoDB Document API in Ruby (Part 2 – Con

发表评论