DataStructuresDemo.vala 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. using Astralis;
  2. using Invercargill;
  3. using Invercargill.DataStructures;
  4. /**
  5. * DataStructuresDemo Example
  6. *
  7. * Demonstrates various Invercargill data structures.
  8. * Shows how to use Series, Vector, RingBuffer, and other structures
  9. * with the Astralis web framework.
  10. */
  11. void main() {
  12. var router = new Router();
  13. var server = new Server(8086, router);
  14. // Root endpoint
  15. router.map_func("/", (context) => {
  16. return new BufferedHttpResult.from_string(
  17. """Data Structures Demo
  18. This example demonstrates various Invercargill data structures:
  19. Endpoints:
  20. GET /series - Series operations
  21. GET /vector - Vector operations
  22. GET /ring-buffer - RingBuffer operations
  23. GET /immutable-buffer - ImmutableBuffer operations
  24. GET /wrap-operations - Wrap utility functions
  25. GET /combined-operations - Combined operations
  26. """
  27. );
  28. });
  29. // Series operations
  30. router.map_func("/series", (context) => {
  31. var series_array = new string[3];
  32. series_array[0] = "First";
  33. series_array[1] = "Second";
  34. series_array[2] = "Third";
  35. var parts = new Series<string>();
  36. parts.add_start("Series contents: ");
  37. foreach (var item in series_array) {
  38. parts.add_start(item + " ");
  39. }
  40. var count = series_array.length;
  41. parts.add_start("\nCount: " + count.to_string());
  42. var result = parts.to_immutable_buffer()
  43. .aggregate<string>("", (acc, s) => acc + s);
  44. return new BufferedHttpResult.from_string(result);
  45. });
  46. // Vector operations
  47. router.map_func("/vector", (context) => {
  48. var numbers = new int[5];
  49. numbers[0] = 1;
  50. numbers[1] = 2;
  51. numbers[2] = 3;
  52. numbers[3] = 4;
  53. numbers[4] = 5;
  54. var vector = Wrap.array<int>(numbers).as_enumerable().to_vector();
  55. var count = vector.count();
  56. var first = vector.first_or_default(n => true);
  57. var last = vector.last_or_default(n => true);
  58. var result = @"Vector operations:
  59. Count: $count
  60. First: $first
  61. Last: $last
  62. Elements: 1, 2, 3, 4, 5";
  63. return new BufferedHttpResult.from_string(result);
  64. });
  65. // RingBuffer operations
  66. router.map_func("/ring-buffer", (context) => {
  67. var buffer_array = new string[5];
  68. buffer_array[0] = "Item 1";
  69. buffer_array[1] = "Item 2";
  70. buffer_array[2] = "Item 3";
  71. buffer_array[3] = "Item 4";
  72. buffer_array[4] = "Item 5";
  73. var buffer = Wrap.array<string>(buffer_array).as_enumerable().to_ring_buffer(3);
  74. var count = buffer.count();
  75. var result = @"RingBuffer operations:
  76. Size: 3
  77. Count: $count
  78. Note: RingBuffer automatically overwrites old items when full";
  79. return new BufferedHttpResult.from_string(result);
  80. });
  81. // ImmutableBuffer operations
  82. router.map_func("/immutable-buffer", (context) => {
  83. var items_array = new string[4];
  84. items_array[0] = "Apple";
  85. items_array[1] = "Banana";
  86. items_array[2] = "Cherry";
  87. items_array[3] = "Date";
  88. var buffer = Wrap.array<string>(items_array).as_enumerable().to_immutable_buffer();
  89. var count = buffer.count();
  90. var parts = new Series<string>();
  91. parts.add_start("ImmutableBuffer contents: ");
  92. buffer.iterate((item) => {
  93. parts.add_start(item + " ");
  94. });
  95. parts.add_start("\nCount: " + count.to_string());
  96. var result = parts.to_immutable_buffer()
  97. .aggregate<string>("", (acc, s) => acc + s);
  98. return new BufferedHttpResult.from_string(result);
  99. });
  100. // Wrap utility functions
  101. router.map_func("/wrap-operations", (context) => {
  102. var numbers = new int[5];
  103. numbers[0] = 1;
  104. numbers[1] = 2;
  105. numbers[2] = 3;
  106. numbers[3] = 4;
  107. numbers[4] = 5;
  108. var strings = new string[5];
  109. strings[0] = "one";
  110. strings[1] = "two";
  111. strings[2] = "three";
  112. strings[3] = "four";
  113. strings[4] = "five";
  114. var num_count = Wrap.array<int>(numbers).as_enumerable().count();
  115. var str_count = Wrap.array<string>(strings).as_enumerable().count();
  116. var result = @"Wrap operations:
  117. Array of ints count: $num_count
  118. Array of strings count: $str_count
  119. Numbers: 1, 2, 3, 4, 5
  120. Strings: one, two, three, four, five";
  121. return new BufferedHttpResult.from_string(result);
  122. });
  123. // Combined operations
  124. router.map_func("/combined-operations", (context) => {
  125. var numbers1 = new int[3];
  126. numbers1[0] = 1;
  127. numbers1[1] = 2;
  128. numbers1[2] = 3;
  129. var numbers2 = new int[3];
  130. numbers2[0] = 4;
  131. numbers2[1] = 5;
  132. numbers2[2] = 6;
  133. var concatenated = Wrap.array<int>(numbers1).as_enumerable()
  134. .concat(Wrap.array<int>(numbers2).as_enumerable());
  135. var sum = concatenated.aggregate<int>(0, (acc, n) => acc + n);
  136. var avg = (double)sum / concatenated.count();
  137. var filtered = concatenated.where(n => n > 2);
  138. var sorted = filtered.order_by<int>(n => n);
  139. var parts = new Series<string>();
  140. parts.add_start("Combined operations:\n");
  141. parts.add_start("Original arrays: [1,2,3] and [4,5,6]\n");
  142. parts.add_start("Concatenated: ");
  143. parts.add_start(enumerable_int_to_string(concatenated));
  144. parts.add_start("\n");
  145. parts.add_start(@"Sum: $sum\n");
  146. parts.add_start(@"Average: $avg\n");
  147. parts.add_start("Filtered (>2): ");
  148. parts.add_start(enumerable_int_to_string(filtered));
  149. parts.add_start("\n");
  150. parts.add_start("Sorted: ");
  151. parts.add_start(enumerable_int_to_string(sorted));
  152. var result = parts.to_immutable_buffer()
  153. .aggregate<string>("", (acc, s) => acc + s);
  154. return new BufferedHttpResult.from_string(result);
  155. });
  156. print("Data Structures Demo Server running on port 8086\n");
  157. print("Try these endpoints:\n");
  158. print(" - http://localhost:8086/\n");
  159. print(" - http://localhost:8086/series\n");
  160. print(" - http://localhost:8086/vector\n");
  161. print(" - http://localhost:8086/ring-buffer\n");
  162. print(" - http://localhost:8086/immutable-buffer\n");
  163. print(" - http://localhost:8086/wrap-operations\n");
  164. print(" - http://localhost:8086/combined-operations\n");
  165. server.run();
  166. }
  167. // Helper functions
  168. string enumerable_int_to_string(Enumerable<int> enumerable) {
  169. return enumerable.to_immutable_buffer()
  170. .aggregate<string>("[", (acc, n) => {
  171. if (acc == "[") return acc + n.to_string();
  172. return acc + ", " + n.to_string();
  173. }) + "]";
  174. }