Mon, 18 Nov 2019 11:00:54 -0500
Initialise
0 | 1 | #################################################################### |
2 | # Immutable linked list (different from the mutable lists of | |
3 | # https://github.com/ChrisRackauckas/LinkedLists.jl) | |
4 | #################################################################### | |
5 | ||
6 | module LinkedLists | |
7 | ||
8 | ############## | |
9 | # Our exports | |
10 | ############## | |
11 | ||
12 | export LinkedListEntry, | |
13 | LinkedList, | |
14 | unfold_linked_list | |
15 | ||
16 | ############# | |
17 | # Data types | |
18 | ############# | |
19 | ||
20 | struct LinkedListEntry{T} | |
21 | value :: T | |
22 | next :: Union{LinkedListEntry{T},Nothing} | |
23 | end | |
24 | ||
25 | LinkedList{T} = Union{LinkedListEntry{T},Nothing} | |
26 | ||
27 | ############ | |
28 | # Functions | |
29 | ############ | |
30 | ||
31 | function Base.iterate(list::LinkedList{T}) where T | |
32 | return Base.iterate(list, list) | |
33 | end | |
34 | ||
35 | function Base.iterate(list::LinkedList{T}, tail::Nothing) where T | |
36 | return nothing | |
37 | end | |
38 | ||
39 | function Base.iterate(list::LinkedList{T}, tail::LinkedListEntry{T}) where T | |
40 | return tail.value, tail.next | |
41 | end | |
42 | ||
43 | # Return the items in the list with the tail first | |
44 | function unfold_linked_list(list::LinkedList{T}) where T | |
45 | res = [] | |
46 | for value ∈ list | |
47 | push!(res, value) | |
48 | end | |
49 | return reverse(res) | |
50 | end | |
51 | ||
52 | end |