src/Pure/General/lazy_seq.ML
changeset 15531 08c8dad8e399
parent 15026 60240294bbd5
child 15570 8d8c70b41bab
equal deleted inserted replaced
15530:6f43714517ee 15531:08c8dad8e399
    84 fun make f = Seq (delay f)
    84 fun make f = Seq (delay f)
    85 
    85 
    86 fun null s = is_some (getItem s)
    86 fun null s = is_some (getItem s)
    87 
    87 
    88 local
    88 local
    89     fun F n None = n
    89     fun F n NONE = n
    90       | F n (Some(_,s)) = F (n+1) (getItem s)
    90       | F n (SOME(_,s)) = F (n+1) (getItem s)
    91 in
    91 in
    92 fun length s = F 0 (getItem s)
    92 fun length s = F 0 (getItem s)
    93 end
    93 end
    94 
    94 
    95 fun s1 @ s2 =
    95 fun s1 @ s2 =
    96     let
    96     let
    97 	fun F None = getItem s2
    97 	fun F NONE = getItem s2
    98 	  | F (Some(x,s1')) = Some(x,F' s1')
    98 	  | F (SOME(x,s1')) = SOME(x,F' s1')
    99 	and F' s = make (fn () => F (getItem s))
    99 	and F' s = make (fn () => F (getItem s))
   100     in
   100     in
   101 	F' s1
   101 	F' s1
   102     end
   102     end
   103 
   103 
   104 local
   104 local
   105     fun F None = raise Empty
   105     fun F NONE = raise Empty
   106       | F (Some arg) = arg
   106       | F (SOME arg) = arg
   107 in
   107 in
   108 fun hd s = #1 (F (getItem s))
   108 fun hd s = #1 (F (getItem s))
   109 fun tl s = #2 (F (getItem s))
   109 fun tl s = #2 (F (getItem s))
   110 end
   110 end
   111 
   111 
   112 local
   112 local
   113     fun F x None = x
   113     fun F x NONE = x
   114       | F _ (Some(x,s)) = F x (getItem s)
   114       | F _ (SOME(x,s)) = F x (getItem s)
   115     fun G None = raise Empty
   115     fun G NONE = raise Empty
   116       | G (Some(x,s)) = F x (getItem s)
   116       | G (SOME(x,s)) = F x (getItem s)
   117 in
   117 in
   118 fun last s = G (getItem s)
   118 fun last s = G (getItem s)
   119 end
   119 end
   120 
   120 
   121 local
   121 local
   122     fun F None _ = raise Subscript
   122     fun F NONE _ = raise Subscript
   123       | F (Some(x,_)) 0 = x
   123       | F (SOME(x,_)) 0 = x
   124       | F (Some(_,s)) n = F (getItem s) (n-1)
   124       | F (SOME(_,s)) n = F (getItem s) (n-1)
   125 in
   125 in
   126 fun nth(s,n) =
   126 fun nth(s,n) =
   127     if n < 0
   127     if n < 0
   128     then raise Subscript
   128     then raise Subscript
   129     else F (getItem s) n
   129     else F (getItem s) n
   130 end
   130 end
   131 
   131 
   132 local
   132 local
   133     fun F None _ = raise Subscript
   133     fun F NONE _ = raise Subscript
   134       | F (Some(x,s)) n = Some(x,F' s (n-1))
   134       | F (SOME(x,s)) n = SOME(x,F' s (n-1))
   135     and F' s 0 = Seq (value None)
   135     and F' s 0 = Seq (value NONE)
   136       | F' s n = make (fn () => F (getItem s) n)
   136       | F' s n = make (fn () => F (getItem s) n)
   137 in
   137 in
   138 fun take (s,n) =
   138 fun take (s,n) =
   139     if n < 0
   139     if n < 0
   140     then raise Subscript
   140     then raise Subscript
   141     else F' s n
   141     else F' s n
   142 end
   142 end
   143 
   143 
   144 local
   144 local
   145     fun F s 0 = s
   145     fun F s 0 = s
   146       | F None _ = raise Subscript
   146       | F NONE _ = raise Subscript
   147       | F (Some(_,s)) n = F (getItem s) (n-1)
   147       | F (SOME(_,s)) n = F (getItem s) (n-1)
   148 in
   148 in
   149 fun drop (s,0) = s
   149 fun drop (s,0) = s
   150   | drop (s,n) = 
   150   | drop (s,n) = 
   151     if n < 0
   151     if n < 0
   152     then raise Subscript
   152     then raise Subscript
   153     else make (fn () => F (getItem s) n)
   153     else make (fn () => F (getItem s) n)
   154 end
   154 end
   155 
   155 
   156 local
   156 local
   157     fun F s None = s
   157     fun F s NONE = s
   158       | F s (Some(x,s')) = F (Some(x, Seq (value s))) (getItem s')
   158       | F s (SOME(x,s')) = F (SOME(x, Seq (value s))) (getItem s')
   159 in
   159 in
   160 fun rev s = make (fn () => F None (getItem s))
   160 fun rev s = make (fn () => F NONE (getItem s))
   161 end
   161 end
   162 
   162 
   163 local
   163 local
   164     fun F s None = getItem s
   164     fun F s NONE = getItem s
   165       | F s (Some(x,s')) = F (Seq (value (Some(x,s)))) (getItem s')
   165       | F s (SOME(x,s')) = F (Seq (value (SOME(x,s)))) (getItem s')
   166 in
   166 in
   167 fun revAppend (s1,s2) = make (fn () => F s2 (getItem s1))
   167 fun revAppend (s1,s2) = make (fn () => F s2 (getItem s1))
   168 end
   168 end
   169 
   169 
   170 local
   170 local
   171     fun F None = None
   171     fun F NONE = NONE
   172       | F (Some(s1,s2)) =
   172       | F (SOME(s1,s2)) =
   173 	let
   173 	let
   174 	    fun G None = F (getItem s2)
   174 	    fun G NONE = F (getItem s2)
   175 	      | G (Some(x,s)) = Some(x,make (fn () => G (getItem s)))
   175 	      | G (SOME(x,s)) = SOME(x,make (fn () => G (getItem s)))
   176 	in
   176 	in
   177 	    G (getItem s1)
   177 	    G (getItem s1)
   178 	end
   178 	end
   179 in
   179 in
   180 fun concat s = make (fn () => F (getItem s))
   180 fun concat s = make (fn () => F (getItem s))
   181 end
   181 end
   182 
   182 
   183 fun app f =
   183 fun app f =
   184     let
   184     let
   185 	fun F None = ()
   185 	fun F NONE = ()
   186 	  | F (Some(x,s)) =
   186 	  | F (SOME(x,s)) =
   187 	    (f x;
   187 	    (f x;
   188 	     F (getItem s))
   188 	     F (getItem s))
   189     in
   189     in
   190 	F o getItem
   190 	F o getItem
   191     end
   191     end
   192 
   192 
   193 fun map f =
   193 fun map f =
   194     let
   194     let
   195 	fun F None = None
   195 	fun F NONE = NONE
   196 	  | F (Some(x,s)) = Some(f x,F' s)
   196 	  | F (SOME(x,s)) = SOME(f x,F' s)
   197 	and F' s = make (fn() => F (getItem s))
   197 	and F' s = make (fn() => F (getItem s))
   198     in
   198     in
   199 	F'
   199 	F'
   200     end
   200     end
   201 
   201 
   202 fun mapPartial f =
   202 fun mapPartial f =
   203     let
   203     let
   204 	fun F None = None
   204 	fun F NONE = NONE
   205 	  | F (Some(x,s)) =
   205 	  | F (SOME(x,s)) =
   206 	    (case f x of
   206 	    (case f x of
   207 		 Some y => Some(y,F' s)
   207 		 SOME y => SOME(y,F' s)
   208 	       | None => F (getItem s))
   208 	       | NONE => F (getItem s))
   209 	and F' s = make (fn()=> F (getItem s))
   209 	and F' s = make (fn()=> F (getItem s))
   210     in
   210     in
   211 	F'
   211 	F'
   212     end
   212     end
   213 
   213 
   214 fun find P =
   214 fun find P =
   215     let
   215     let
   216 	fun F None = None
   216 	fun F NONE = NONE
   217 	  | F (Some(x,s)) =
   217 	  | F (SOME(x,s)) =
   218 	    if P x
   218 	    if P x
   219 	    then Some x
   219 	    then SOME x
   220 	    else F (getItem s)
   220 	    else F (getItem s)
   221     in
   221     in
   222 	F o getItem
   222 	F o getItem
   223     end
   223     end
   224 
   224 
   225 (*fun filter p = mapPartial (fn x => if p x then Some x else None)*)
   225 (*fun filter p = mapPartial (fn x => if p x then SOME x else NONE)*)
   226 
   226 
   227 fun filter P =
   227 fun filter P =
   228     let
   228     let
   229 	fun F None = None
   229 	fun F NONE = NONE
   230 	  | F (Some(x,s)) =
   230 	  | F (SOME(x,s)) =
   231 	    if P x
   231 	    if P x
   232 	    then Some(x,F' s)
   232 	    then SOME(x,F' s)
   233 	    else F (getItem s)
   233 	    else F (getItem s)
   234 	and F' s = make (fn () => F (getItem s))
   234 	and F' s = make (fn () => F (getItem s))
   235     in
   235     in
   236 	F'
   236 	F'
   237     end
   237     end
   238 
   238 
   239 fun partition f s =
   239 fun partition f s =
   240     let
   240     let
   241 	val s' = map (fn x => (x,f x)) s
   241 	val s' = map (fn x => (x,f x)) s
   242     in
   242     in
   243 	(mapPartial (fn (x,true) => Some x | _ => None) s',
   243 	(mapPartial (fn (x,true) => SOME x | _ => NONE) s',
   244 	 mapPartial (fn (x,false) => Some x | _ => None) s')
   244 	 mapPartial (fn (x,false) => SOME x | _ => NONE) s')
   245     end
   245     end
   246 
   246 
   247 fun exists P =
   247 fun exists P =
   248     let
   248     let
   249 	fun F None = false
   249 	fun F NONE = false
   250 	  | F (Some(x,s)) = P x orelse F (getItem s)
   250 	  | F (SOME(x,s)) = P x orelse F (getItem s)
   251     in
   251     in
   252 	F o getItem
   252 	F o getItem
   253     end
   253     end
   254 
   254 
   255 fun all P =
   255 fun all P =
   256     let
   256     let
   257 	fun F None = true
   257 	fun F NONE = true
   258 	  | F (Some(x,s)) = P x andalso F (getItem s)
   258 	  | F (SOME(x,s)) = P x andalso F (getItem s)
   259     in
   259     in
   260 	F o getItem
   260 	F o getItem
   261     end
   261     end
   262 
   262 
   263 (*fun tabulate f = map f (iterates (fn x => x + 1) 0)*)
   263 (*fun tabulate f = map f (iterates (fn x => x + 1) 0)*)
   264 
   264 
   265 fun tabulate (n,f) =
   265 fun tabulate (n,f) =
   266     let
   266     let
   267 	fun F n = make (fn () => Some(f n,F (n+1)))
   267 	fun F n = make (fn () => SOME(f n,F (n+1)))
   268     in
   268     in
   269 	F n
   269 	F n
   270     end
   270     end
   271 
   271 
   272 fun collate c (s1,s2) =
   272 fun collate c (s1,s2) =
   273     let
   273     let
   274 	fun F None _ = LESS
   274 	fun F NONE _ = LESS
   275 	  | F _ None = GREATER
   275 	  | F _ NONE = GREATER
   276 	  | F (Some(x,s1)) (Some(y,s2)) =
   276 	  | F (SOME(x,s1)) (SOME(y,s2)) =
   277 	    (case c (x,y) of
   277 	    (case c (x,y) of
   278 		 LESS => LESS
   278 		 LESS => LESS
   279 	       | GREATER => GREATER
   279 	       | GREATER => GREATER
   280 	       | EQUAL => F' s1 s2)
   280 	       | EQUAL => F' s1 s2)
   281 	and F' s1 s2 = F (getItem s1) (getItem s2)
   281 	and F' s1 s2 = F (getItem s1) (getItem s2)
   282     in
   282     in
   283 	F' s1 s2
   283 	F' s1 s2
   284     end
   284     end
   285 
   285 
   286 fun empty  _ = Seq (value None)
   286 fun empty  _ = Seq (value NONE)
   287 fun single x = Seq(value (Some(x,Seq (value None))))
   287 fun single x = Seq(value (SOME(x,Seq (value NONE))))
   288 fun cons a = Seq(value (Some a))
   288 fun cons a = Seq(value (SOME a))
   289 
   289 
   290 fun cycle seqfn =
   290 fun cycle seqfn =
   291     let
   291     let
   292 	val knot = ref (Seq (value None))
   292 	val knot = ref (Seq (value NONE))
   293     in
   293     in
   294 	knot := seqfn (fn () => !knot);
   294 	knot := seqfn (fn () => !knot);
   295 	!knot
   295 	!knot
   296     end
   296     end
   297 
   297 
   298 fun iterates f =
   298 fun iterates f =
   299     let
   299     let
   300 	fun F x = make (fn() => Some(x,F (f x)))
   300 	fun F x = make (fn() => SOME(x,F (f x)))
   301     in
   301     in
   302 	F
   302 	F
   303     end
   303     end
   304 
   304 
   305 fun interleave (s1,s2) =
   305 fun interleave (s1,s2) =
   306     let
   306     let
   307 	fun F None = getItem s2
   307 	fun F NONE = getItem s2
   308 	  | F (Some(x,s1')) = Some(x,interleave(s2,s1'))
   308 	  | F (SOME(x,s1')) = SOME(x,interleave(s2,s1'))
   309     in
   309     in
   310 	make (fn()=> F (getItem s1))
   310 	make (fn()=> F (getItem s1))
   311     end
   311     end
   312 
   312 
   313 (* val force_all = app ignore *)
   313 (* val force_all = app ignore *)
   314 
   314 
   315 local
   315 local
   316     fun F None = ()
   316     fun F NONE = ()
   317       | F (Some(x,s)) = F (getItem s)
   317       | F (SOME(x,s)) = F (getItem s)
   318 in
   318 in
   319 fun force_all s = F (getItem s)
   319 fun force_all s = F (getItem s)
   320 end
   320 end
   321 
   321 
   322 fun of_function f =
   322 fun of_function f =
   323     let
   323     let
   324 	fun F () = case f () of
   324 	fun F () = case f () of
   325 		       Some x => Some(x,make F)
   325 		       SOME x => SOME(x,make F)
   326 		     | None => None
   326 		     | NONE => NONE
   327     in
   327     in
   328 	make F
   328 	make F
   329     end
   329     end
   330 
   330 
   331 local
   331 local
   332     fun F [] = None
   332     fun F [] = NONE
   333       | F (x::xs) = Some(x,F' xs)
   333       | F (x::xs) = SOME(x,F' xs)
   334     and F' xs = make (fn () => F xs)
   334     and F' xs = make (fn () => F xs)
   335 in
   335 in
   336 fun of_list xs = F' xs
   336 fun of_list xs = F' xs
   337 end
   337 end
   338 
   338 
   342     let
   342     let
   343 	val buffer : char list ref = ref []
   343 	val buffer : char list ref = ref []
   344 	fun get_input () =
   344 	fun get_input () =
   345 	    case !buffer of
   345 	    case !buffer of
   346 		(c::cs) => (buffer:=cs;
   346 		(c::cs) => (buffer:=cs;
   347 			    Some c)
   347 			    SOME c)
   348 	      |	[] => (case String.explode (TextIO.input is) of
   348 	      |	[] => (case String.explode (TextIO.input is) of
   349 			   [] => None
   349 			   [] => NONE
   350 			 | (c::cs) => (buffer := cs;
   350 			 | (c::cs) => (buffer := cs;
   351 				       Some c))
   351 				       SOME c))
   352     in
   352     in
   353 	of_function get_input
   353 	of_function get_input
   354     end
   354     end
   355 
   355 
   356 local
   356 local
   357     fun F k None = k []
   357     fun F k NONE = k []
   358       | F k (Some(x,s)) = F (fn xs => k (x::xs)) (getItem s)
   358       | F k (SOME(x,s)) = F (fn xs => k (x::xs)) (getItem s)
   359 in
   359 in
   360 fun list_of s = F (fn x => x) (getItem s)
   360 fun list_of s = F (fn x => x) (getItem s)
   361 end
   361 end
   362 
   362 
   363 (* Adapted from seq.ML *)
   363 (* Adapted from seq.ML *)
   364 
   364 
   365 val succeed = single
   365 val succeed = single
   366 fun fail _ = Seq (value None)
   366 fun fail _ = Seq (value NONE)
   367 
   367 
   368 (* fun op THEN (f, g) x = flat (map g (f x)) *)
   368 (* fun op THEN (f, g) x = flat (map g (f x)) *)
   369 
   369 
   370 fun op THEN (f, g) =
   370 fun op THEN (f, g) =
   371     let
   371     let
   372 	fun F None = None
   372 	fun F NONE = NONE
   373 	  | F (Some(x,xs)) =
   373 	  | F (SOME(x,xs)) =
   374 	    let
   374 	    let
   375 		fun G None = F (getItem xs)
   375 		fun G NONE = F (getItem xs)
   376 		  | G (Some(y,ys)) = Some(y,make (fn () => G (getItem ys)))
   376 		  | G (SOME(y,ys)) = SOME(y,make (fn () => G (getItem ys)))
   377 	    in
   377 	    in
   378 		G (getItem (g x))
   378 		G (getItem (g x))
   379 	    end
   379 	    end
   380     in
   380     in
   381 	fn x => make (fn () => F (getItem (f x)))
   381 	fn x => make (fn () => F (getItem (f x)))
   382     end
   382     end
   383 
   383 
   384 fun op ORELSE (f, g) x =
   384 fun op ORELSE (f, g) x =
   385     make (fn () =>
   385     make (fn () =>
   386 	     case getItem (f x) of
   386 	     case getItem (f x) of
   387 		 None => getItem (g x)
   387 		 NONE => getItem (g x)
   388 	       | some => some)
   388 	       | some => some)
   389 
   389 
   390 fun op APPEND (f, g) x =
   390 fun op APPEND (f, g) x =
   391     let
   391     let
   392 	fun copy s =
   392 	fun copy s =
   393 	    case getItem s of
   393 	    case getItem s of
   394 		None => getItem (g x)
   394 		NONE => getItem (g x)
   395 	      | Some(x,xs) => Some(x,make (fn () => copy xs))
   395 	      | SOME(x,xs) => SOME(x,make (fn () => copy xs))
   396     in
   396     in
   397 	make (fn () => copy (f x))
   397 	make (fn () => copy (f x))
   398     end
   398     end
   399 
   399 
   400 fun EVERY fs = foldr THEN (fs, succeed)
   400 fun EVERY fs = foldr THEN (fs, succeed)
   401 fun FIRST fs = foldr ORELSE (fs, fail)
   401 fun FIRST fs = foldr ORELSE (fs, fail)
   402 
   402 
   403 fun TRY f x =
   403 fun TRY f x =
   404     make (fn () =>
   404     make (fn () =>
   405 	     case getItem (f x) of
   405 	     case getItem (f x) of
   406 		 None => Some(x,Seq (value None))
   406 		 NONE => SOME(x,Seq (value NONE))
   407 	       | some => some)
   407 	       | some => some)
   408 
   408 
   409 fun REPEAT f =
   409 fun REPEAT f =
   410     let
   410     let
   411 	fun rep qs x =
   411 	fun rep qs x =
   412 	    case getItem (f x) of
   412 	    case getItem (f x) of
   413 		None => Some(x, make (fn () => repq qs))
   413 		NONE => SOME(x, make (fn () => repq qs))
   414 	      | Some (x', q) => rep (q :: qs) x'
   414 	      | SOME (x', q) => rep (q :: qs) x'
   415 	and repq [] = None
   415 	and repq [] = NONE
   416 	  | repq (q :: qs) =
   416 	  | repq (q :: qs) =
   417             case getItem q of
   417             case getItem q of
   418 		None => repq qs
   418 		NONE => repq qs
   419               | Some (x, q) => rep (q :: qs) x
   419               | SOME (x, q) => rep (q :: qs) x
   420     in
   420     in
   421      fn x => make (fn () => rep [] x)
   421      fn x => make (fn () => rep [] x)
   422     end
   422     end
   423 
   423 
   424 fun REPEAT1 f = THEN (f, REPEAT f);
   424 fun REPEAT1 f = THEN (f, REPEAT f);
   432     in F end
   432     in F end
   433 
   433 
   434 fun DETERM f x =
   434 fun DETERM f x =
   435     make (fn () =>
   435     make (fn () =>
   436 	     case getItem (f x) of
   436 	     case getItem (f x) of
   437 		 None => None
   437 		 NONE => NONE
   438 	       | Some (x', _) => Some(x',Seq (value None)))
   438 	       | SOME (x', _) => SOME(x',Seq (value NONE)))
   439 
   439 
   440 (*partial function as procedure*)
   440 (*partial function as procedure*)
   441 fun try f x =
   441 fun try f x =
   442     make (fn () =>
   442     make (fn () =>
   443 	     case Library.try f x of
   443 	     case Library.try f x of
   444 		 Some y => Some(y,Seq (value None))
   444 		 SOME y => SOME(y,Seq (value NONE))
   445 	       | None => None)
   445 	       | NONE => NONE)
   446 
   446 
   447 (*functional to print a sequence, up to "count" elements;
   447 (*functional to print a sequence, up to "count" elements;
   448   the function prelem should print the element number and also the element*)
   448   the function prelem should print the element number and also the element*)
   449 fun print prelem count seq =
   449 fun print prelem count seq =
   450     let
   450     let
   451 	fun pr k xq =
   451 	fun pr k xq =
   452 	    if k > count
   452 	    if k > count
   453 	    then ()
   453 	    then ()
   454 	    else
   454 	    else
   455 		case getItem xq of
   455 		case getItem xq of
   456 		    None => ()
   456 		    NONE => ()
   457 		  | Some (x, xq') =>
   457 		  | SOME (x, xq') =>
   458 		    (prelem k x;
   458 		    (prelem k x;
   459 		     writeln "";
   459 		     writeln "";
   460 		     pr (k + 1) xq')
   460 		     pr (k + 1) xq')
   461     in
   461     in
   462 	pr 1 seq
   462 	pr 1 seq
   466 fun it_right f (xq, yq) =
   466 fun it_right f (xq, yq) =
   467     let
   467     let
   468 	fun its s =
   468 	fun its s =
   469 	    make (fn () =>
   469 	    make (fn () =>
   470 		     case getItem s of
   470 		     case getItem s of
   471 			 None => getItem yq
   471 			 NONE => getItem yq
   472 		       | Some (a, s') => getItem(f (a, its s')))
   472 		       | SOME (a, s') => getItem(f (a, its s')))
   473     in
   473     in
   474 	its xq
   474 	its xq
   475     end
   475     end
   476 
   476 
   477 (*map over a sequence s1, append the sequence s2*)
   477 (*map over a sequence s1, append the sequence s2*)
   478 fun mapp f s1 s2 =
   478 fun mapp f s1 s2 =
   479     let
   479     let
   480 	fun F None = getItem s2
   480 	fun F NONE = getItem s2
   481 	  | F (Some(x,s1')) = Some(f x,F' s1')
   481 	  | F (SOME(x,s1')) = SOME(f x,F' s1')
   482 	and F' s = make (fn () => F (getItem s))
   482 	and F' s = make (fn () => F (getItem s))
   483     in
   483     in
   484 	F' s1
   484 	F' s1
   485     end
   485     end
   486 
   486 
   487 (*turn a list of sequences into a sequence of lists*)
   487 (*turn a list of sequences into a sequence of lists*)
   488 local
   488 local
   489     fun F [] = Some([],Seq (value None))
   489     fun F [] = SOME([],Seq (value NONE))
   490       | F (xq :: xqs) =
   490       | F (xq :: xqs) =
   491         case getItem xq of
   491         case getItem xq of
   492             None => None
   492             NONE => NONE
   493           | Some (x, xq') =>
   493           | SOME (x, xq') =>
   494             (case F xqs of
   494             (case F xqs of
   495 		 None => None
   495 		 NONE => NONE
   496 	       | Some (xs, xsq) =>
   496 	       | SOME (xs, xsq) =>
   497 		 let
   497 		 let
   498 		     fun G s =
   498 		     fun G s =
   499 			 make (fn () =>
   499 			 make (fn () =>
   500 				  case getItem s of
   500 				  case getItem s of
   501 				      None => F (xq' :: xqs)
   501 				      NONE => F (xq' :: xqs)
   502 				    | Some(ys,ysq) => Some(x::ys,G ysq))
   502 				    | SOME(ys,ysq) => SOME(x::ys,G ysq))
   503 		 in
   503 		 in
   504 		     Some (x :: xs, G xsq)
   504 		     SOME (x :: xs, G xsq)
   505 		 end)
   505 		 end)
   506 in
   506 in
   507 fun commute xqs = make (fn () => F xqs)
   507 fun commute xqs = make (fn () => F xqs)
   508 end
   508 end
   509 
   509 
   512 fun chop (n, xq) =
   512 fun chop (n, xq) =
   513     if n <= 0
   513     if n <= 0
   514     then ([], xq)
   514     then ([], xq)
   515     else
   515     else
   516 	case getItem xq of
   516 	case getItem xq of
   517 	    None => ([], xq)
   517 	    NONE => ([], xq)
   518 	  | Some (x, xq') => apfst (Library.cons x) (chop (n - 1, xq'))
   518 	  | SOME (x, xq') => apfst (Library.cons x) (chop (n - 1, xq'))
   519 
   519 
   520 fun foldl f e s =
   520 fun foldl f e s =
   521     let
   521     let
   522 	fun F k None = k e
   522 	fun F k NONE = k e
   523 	  | F k (Some(x,s)) = F (fn y => k (f(x,y))) (getItem s)
   523 	  | F k (SOME(x,s)) = F (fn y => k (f(x,y))) (getItem s)
   524     in
   524     in
   525 	F (fn x => x) (getItem s)
   525 	F (fn x => x) (getItem s)
   526     end
   526     end
   527 
   527 
   528 fun foldr f e s =
   528 fun foldr f e s =
   529     let
   529     let
   530 	fun F e None = e
   530 	fun F e NONE = e
   531 	  | F e (Some(x,s)) = F (f(x,e)) (getItem s)
   531 	  | F e (SOME(x,s)) = F (f(x,e)) (getItem s)
   532     in
   532     in
   533 	F e (getItem s)
   533 	F e (getItem s)
   534     end
   534     end
   535 
   535 
   536 end
   536 end