1 
2 
3 module llist.slist;
4 
5 
6 
7 struct Node(T) {
8 	// A node with the next pointer of `null` is a "Sentinel node".
9 	Node!T* next;
10 
11 	T payload;
12 	alias value = payload;
13 }
14 
15 
16 
17 public {
18 	@property bool empty(T)(Node!T* node) {
19 		return (node is null);
20 	}
21 }
22 public {
23 	Node!T dup(T)(Node!T* node) {
24 		return new Node!T(node.next, node.payload);
25 	}
26 }
27 public {
28 	void removeNext(T)(Node!T* node) {
29 		assert(!node.empty);
30 		node.next = node.next.next;
31 	}
32 	void insertAfter(T)(Node!T* node, Node!T* newNode) {
33 		newNode.next	= node.next;
34 		node.next	= newNode;
35 	}
36 	void insertAfter(T)(Node!T* node, T value) {
37 		node.insertAfter(new Node!T(null, value));
38 	}
39 
40 	////void append(T)(Node!T* node, T value) {
41 	////	assert(node.empty, "Can only append to the last node.  If you want to force this operation use `redirect`.");
42 	////	node.payload	= value;
43 	////	node.next	= new Node!T;
44 	////}
45 
46 	void redirect(bool checkAtEnd=true, T)(Node!T* node, Node!T* newNode) {
47 		node.next = newNode;
48 	}
49 }
50 
51 public {
52 	Iterator!T iterator(T)(Node!T* node) {
53 		return Iterator!T(node);
54 	}
55 	private struct Iterator(T) {
56 		private Node!T* node;
57 		@disable this();
58 		this(Node!T* node) {
59 			this.node = node;
60 		}
61 		@property bool empty() {
62 			return node.empty;
63 		}
64 		@property Node!T* front() {
65 			assert(!empty);
66 			return node;
67 		}
68 		void popFront() {
69 			assert(!empty);
70 			node = node.next;
71 		}
72 	}
73 }
74 
75 
76 unittest {
77 	import std.stdio;
78 	import std.algorithm.iteration;
79 	import std.algorithm.searching;
80 
81 	Node!int* s = new Node!int();
82 	s.append(4);
83 
84 	foreach(a;s.iterator){
85 		a.value.writeln;
86 	}
87 	////
88 	s.insertAfter(5);
89 	////s = s.next;
90 	////s = s.next;
91 	writeln;
92 	foreach(a;s.iterator){a.value.writeln;}
93 	////s.find!(a=>a.empty).append(6);
94 
95 	writeln;
96 	foreach(a;s.iterator){a.value.writeln;}
97 	writeln;
98 	foreach(a;s.iterator){a.value.writeln;}
99 
100 	s.iterator.each!(a=>a.value.writeln);
101 
102 
103 	int[][] a = [[4,6,2],[1,2,3]];
104 	a.each!writeln;
105 }
106 
107 
108 
109 
110 
111 
112 
113 
114 
115