Skip to content

Instantly share code, notes, and snippets.

@nsmmrs
Created April 5, 2021 00:55
Show Gist options
  • Save nsmmrs/9772edcb7813ee326e5dbd0dd849e48f to your computer and use it in GitHub Desktop.
Save nsmmrs/9772edcb7813ee326e5dbd0dd849e48f to your computer and use it in GitHub Desktop.
let filter_take ~f:valid n list =
let rec take_from ?(taken = []) ?(n_taken = 0) list =
if n_taken = n then taken
else
match list with
| [] -> taken
| e :: remaining ->
let taken, n_taken =
if valid e then (e :: taken, n_taken + 1) else (taken, n_taken)
in
take_from remaining ~taken ~n_taken
in
take_from list |> List.rev
@nsmmrs
Copy link
Author

nsmmrs commented Apr 5, 2021

# let numbers = List.(1--100);;

# filter_take 3 numbers ~f:(fun n -> n mod 10 = 0);;
- : int list = [10; 20; 30]

# numbers |> filter_take 3 ~f:(fun n -> n mod 10 = 0);;
- : int list = [10; 20; 30]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment