Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 0.97 KB | None | 0 0
  1. module type SOURCE =
  2.   sig
  3.     type element
  4.     type iterator
  5.     type leftovers
  6.    
  7.     type result =
  8.       | Cont of element * iterator
  9.       | Done of leftovers
  10.    
  11.     val get : iterator -> result
  12.   end
  13.  
  14. module type SINK =
  15.   sig
  16.     type element
  17.     type iterator
  18.     type leftovers
  19.    
  20.     type result =
  21.       | Cont of iterator
  22.       | Done of leftovers
  23.    
  24.     val put : iterator * element -> result
  25.   end
  26.  
  27. module Transform (Source : SOURCE) (Sink : SINK) =
  28.   struct
  29.     type result =
  30.       | Depleted of Source.leftovers * Sink.iterator
  31.       | Saturated of Source.iterator * Sink.leftovers
  32.    
  33.     let transform f =
  34.       let rec loop (source, sink) =
  35.         match Source.get source with
  36.         | Done leftovers -> Depleted (leftovers, sink)
  37.         | Cont (element, source) ->
  38.            match Sink.put (sink, f element) with
  39.            | Done leftovers -> Saturated (source, leftovers)
  40.            | Cont sink -> loop (source, sink)
  41.   end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement