This commit is contained in:
swrup 2025-11-11 02:07:51 +01:00
parent aa2ff7b2f0
commit 2f3113f55d
11742 changed files with 1223940 additions and 0 deletions

View file

@ -0,0 +1,73 @@
(**************************************************************************)
(* *)
(* OCaml *)
(* *)
(* Simon Cruanes *)
(* *)
(* Copyright 2017 Institut National de Recherche en Informatique et *)
(* en Automatique. *)
(* *)
(* All rights reserved. This file is distributed under the terms of *)
(* the GNU Lesser General Public License version 2.1, with the *)
(* special exception on linking described in the file LICENSE. *)
(* *)
(**************************************************************************)
(* Module [Seq]: functional iterators *)
type +'a node =
| Nil
| Cons of 'a * 'a t
and 'a t = unit -> 'a node
let empty () = Nil
let return x () = Cons (x, empty)
let rec map f seq () = match seq() with
| Nil -> Nil
| Cons (x, next) -> Cons (f x, map f next)
let rec filter_map f seq () = match seq() with
| Nil -> Nil
| Cons (x, next) ->
match f x with
| None -> filter_map f next ()
| Some y -> Cons (y, filter_map f next)
let rec filter f seq () = match seq() with
| Nil -> Nil
| Cons (x, next) ->
if f x
then Cons (x, filter f next)
else filter f next ()
let rec flat_map f seq () = match seq () with
| Nil -> Nil
| Cons (x, next) ->
flat_map_app f (f x) next ()
(* this is [append seq (flat_map f tail)] *)
and flat_map_app f seq tail () = match seq () with
| Nil -> flat_map f tail ()
| Cons (x, next) ->
Cons (x, flat_map_app f next tail)
let fold_left f acc seq =
let rec aux f acc seq = match seq () with
| Nil -> acc
| Cons (x, next) ->
let acc = f acc x in
aux f acc next
in
aux f acc seq
let iter f seq =
let rec aux seq = match seq () with
| Nil -> ()
| Cons (x, next) ->
f x;
aux next
in
aux seq