src/LinkedLists.jl

Mon, 18 Nov 2019 11:31:40 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 18 Nov 2019 11:31:40 -0500
changeset 3
ec9084e97e46
parent 0
888dfd34d24a
child 4
59fd17a3cea0
permissions
-rw-r--r--

Add write_log to LinkedLists

0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 ####################################################################
3
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
2 # Immutable linked lists (different from the mutable lists of
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 # https://github.com/ChrisRackauckas/LinkedLists.jl)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 ####################################################################
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6 module LinkedLists
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7
3
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
8 using DelimitedFiles
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
9
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
10 using ..StructTools
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
11
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 ##############
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 # Our exports
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 ##############
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 export LinkedListEntry,
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 LinkedList,
3
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
18 unfold_linked_list,
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
19 write_log
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 #############
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 # Data types
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 #############
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 struct LinkedListEntry{T}
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 value :: T
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 next :: Union{LinkedListEntry{T},Nothing}
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 LinkedList{T} = Union{LinkedListEntry{T},Nothing}
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 ############
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 # Functions
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 ############
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 function Base.iterate(list::LinkedList{T}) where T
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 return Base.iterate(list, list)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 function Base.iterate(list::LinkedList{T}, tail::Nothing) where T
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 return nothing
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 function Base.iterate(list::LinkedList{T}, tail::LinkedListEntry{T}) where T
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 return tail.value, tail.next
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 # Return the items in the list with the tail first
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 function unfold_linked_list(list::LinkedList{T}) where T
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 res = []
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 for value ∈ list
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 push!(res, value)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 return reverse(res)
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 end
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56
3
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
57 # Write out a a “log” of LinkedList of IterableStructs as a delimited file
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
58 function write_log(filename::String, log::LinkedList{T}, comment::String) where T <: IterableStruct
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
59 open(filename, "w") do io
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
60 print(io, comment)
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
61 writedlm(io, [String.(fieldnames(T))])
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
62 writedlm(io, unfold_linked_list(log))
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
63 end
0
888dfd34d24a Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 end
3
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
65
ec9084e97e46 Add write_log to LinkedLists
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
66 end

mercurial