About PFDS The following Oz code is derived from the examples provided in the book:
      "Purely Functional Data Structures" by Chris Okasaki.
      http://okasaki.blogspot.com/2008/02/ten-years-of-purely-functional-data.html

PFDS Chapter #04 Examples in Oz
% Utility functions for tests
proc {StreamTest F}
   A = {F.append [1 2 3] [4 5]}
in
   {Browse A}
   {Browse {F.take A 1}}
   {Browse {F.take A 2}}
   {Browse {F.take A 3}}
   {Browse {F.drop A 1}}
   {Browse {F.drop A 2}}
   {Browse {F.drop A 3}}
   {Browse {F.take {Stream.reverse A} 6}}
end

% 4.2 Stream
STREAM =
   functor
   export
      append   : Append
      take     : Take
      drop     : Drop
      reverse  : Reverse
      fromList : FromList
      toList   : ToList
   define
      fun lazy {Append L1 L2}
         case L1
         of nil then L2
         [] H|T then H|{Append T L2}
         end
      end
      fun {Take L N}
         if N == 0 then
            nil
         else
            case L
            of H|T then H|{Take T N-1}
            [] nil then nil
            end
         end
      end
      fun {Drop L N}
         if N == 0 then
            L
         else
            case L
            of H|T then {Drop T N-1}
            [] nil then nil
            end
         end
      end
      fun lazy {Reverse L}
         fun {Iter L1 L2}
            case L1
            of H|T then {Iter T H|L2}
            [] nil then L2
            end
         end
      in
         {Iter L nil}
      end
      fun {FromList L} L end
      fun {ToList L} L end
   end

[Stream] = {Module.apply [STREAM]}

{StreamTest Stream}

Chris Rathman / Chris.Rathman@tx.rr.com