From: Simon Strandgaard Date: 2004-06-03T01:08:55+09:00 Subject: [ann] bidirectional iterator 0.8 I am pleased to announce the release of version 0.8 of my Bidirectional Iterator package. download as TGZ: http://rubyforge.org/frs/download.php/703/iterator-0.8.tar.gz download as ZIP: http://rubyforge.org/frs/download.php/704/iterator-0.8.zip documentation: http://aeditor.rubyforge.org/iterator/ What Is It? =========== A bunch of external iterators, which both can go forward and backwards. You may already know iterators from Java. The main methods are #next, #has_next? and #current. Its carefully unittested and is being used by my regexp engine where it indirectly is being exercised by +2000 tests. Changes Since Last ================== For my regexp engine I needed primitives to iterate through unicode strings (UTF8, UTF16BE, UTF16LE), both forward and backwards. You never know when you need to search backwards through an huge UTF8 file. I have putted much effort into ensuring that decoding are robust to malformed data, so when encountering malformed data we doesn't eat bytes of the next maybe valid codepoint. Also when doing backwards decoding its still robust to malformed data. Talking about File.. I have also added an iterator which can traverse through a file. Forward and backwards. The interface is still the same. Some Examples ============= # # example 1. map on String.each_line # require 'iterator' str = %w(a b c).join("\n") iterator = Iterator::Continuation.new(str, :each_line) result = iterator.map{|i|"<<#{i}>>"} iterator.close p result # ["<>", "<>", "<>"] # # example 2. multiway each # require 'iterator' data_a = %w(a b c d) data_b = (0..3) ia = Iterator::Continuation.new(data_a, :each) ib = Iterator::Continuation.new(data_b, :each) result = [] while ia.has_next? and ib.has_next? result << ia.current result << ib.current ia.next ib.next end ia.close ib.close p result # ["a", 0, "b", 1, "c", 2, "d", 3] # # example 3. decode UTF8 encoded string # require 'iterator' str = [1000, 50000, 40, 999, 30000].pack('U*') byte_iterator = str.create_iterator res = Iterator::DecodeUTF8.new(byte_iterator).to_a p res # [1000, 50000, 40, 999, 30000] Call For Help ============= Do you have knowledge about Asian text-encodings: Big5, EUC, SJIS, KOI. Then please contact me. BTW: if you have ideas for improvement, then speak out. -- Simon Strandgaard