From: Nicolas C. <war...@fr...> - 2003-04-18 03:03:35
|
> >> Well, is there I want to remind that those enumeration really look like > >> Stream. one could use Stream for this. > > > > Haven't looked at streams- although I thought they required Camlp4? > > Well, yes, no, mmm, it depend. One can do a lot of things with stream > using : > Stream.from > Stream.next > Stream.peek > Stream.junk > > an then, you don't have to use camlp4. > > by the way, there are thing that are done by the enum module, and not > by stream. Yes, the Enum module is quite more "abstract" then the Stream one, and has differents goals. BTW, about your "count" problem you HAVE TO return the lines count, because for exemple Array.of_enum will require it to create the array before putting elements inside. The solution is quite easy to do : when "count" is called the first time, you're reading all remaining files and then have to modify your Enum.t which will now iter on the builded list. This is almost what the "Enum.force" is doing, but I modified its behavior so it can be used this way. The problem is that you can't right now do a "force" in a count function since you're have not yet any Enum.t to work on, but ok let's try : Here's the code : let lines_enum ch = let dummy = ref None in let e = Enum.make ~next:(fun () -> try input_line ch with End_of_file -> raise Enum.No_more_elements) ~count:(fun () -> match !dummy with None -> assert false | Some e -> Enum.force e; Enum.count e) in dummy := e; e Done ! (and added to the Std module) Nicolas Cannasse |