From 8a01142ad73c15fb4d7df39bc239f6e152c4a179 Mon Sep 17 00:00:00 2001 From: Gareth Pendleton Date: Fri, 17 Oct 2025 23:23:34 +0100 Subject: [PATCH] feat: Added take_rev --- src/dllist.gleam | 56 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/src/dllist.gleam b/src/dllist.gleam index 4344bbe..83554e4 100644 --- a/src/dllist.gleam +++ b/src/dllist.gleam @@ -15,25 +15,25 @@ pub type DLList(a) { } pub fn main() { - let l = new() - let l2 = insert(l, 123) |> echo - let l3 = insert(l2, 456) |> echo - let l4 = insert(l3, 789) - let l5 = insert(l4, 0) + // let l = new() + // let l2 = insert(l, 123) |> echo + // let l3 = insert(l2, 456) |> echo + // let l4 = insert(l3, 789) + // let l5 = insert(l4, 0) - get(l5) |> echo - l5 |> echo - l5 |> to_list |> echo - let l6 = delete(l5) - l6 |> echo - let l7 = delete(l6) - l7 |> echo - let l8 = delete(l7) - l8 |> echo - let l9 = delete(l8) - l9 |> echo + // get(l5) |> echo + // l5 |> echo + // l5 |> to_list |> echo + // let l6 = delete(l5) + // l6 |> echo + // let l7 = delete(l6) + // l7 |> echo + // let l8 = delete(l7) + // l8 |> echo + // let l9 = delete(l8) + // l9 |> echo - from_list([1, 2, 3, 4]) |> echo + // from_list([1, 2, 3, 4]) |> echo let l1 = new() |> insert(1) l1 |> echo @@ -43,6 +43,13 @@ pub fn main() { l2 |> echo let l2t = take(l2, 5) l2t |> echo + + let l3 = insert(l2, 3) + l3 |> echo + let l3t = take(l3, 7) + l3t |> echo + let l3t2 = take_rev(l3, 7) + l3t2 |> echo } pub fn new() -> DLList(a) { @@ -210,6 +217,21 @@ fn take_loop(list: DLList(a), n_times: Int, acc: List(a)) -> List(a) { } } +pub fn take_rev(list: DLList(a), n_times: Int) -> List(a) { + take_rev_loop(list, n_times, []) +} + +fn take_rev_loop(list: DLList(a), n_times: Int, acc: List(a)) -> List(a) { + use <- bool.guard(when: is_empty(list), return: []) + case n_times { + 0 -> list.reverse(acc) + n -> { + let assert Ok(item) = get(list) + take_rev_loop(move_left(list), n - 1, [item, ..acc]) + } + } +} + pub fn to_list(list: DLList(a)) -> List(a) { case is_empty(list) { True -> []