list.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package core
  2. import "kumachan/standalone/ctn"
  3. type List struct { Head *ListNode; Size uint }
  4. type ListNode struct {
  5. Value Object
  6. Next *ListNode
  7. }
  8. func NodesToList(nodes ([] ListNode)) List {
  9. var n = len(nodes)
  10. if n > 0 {
  11. for i := 0; i < (n - 1); i += 1 {
  12. nodes[i].Next = &(nodes[i+1])
  13. }
  14. return List { &(nodes[0]), uint(n) }
  15. } else {
  16. return List {}
  17. }
  18. }
  19. func ToObjectList[T any] (slice ([] T)) List {
  20. var nodes = make([] ListNode, len(slice))
  21. for i := range slice {
  22. nodes[i].Value = ToObject[T](slice[i])
  23. }
  24. return NodesToList(nodes)
  25. }
  26. func EmptyList() List {
  27. return (List {})
  28. }
  29. func Cons(value Object, l List) List {
  30. return List {
  31. Head: &ListNode {
  32. Value: value,
  33. Next: l.Head,
  34. },
  35. Size: (l.Size + 1),
  36. }
  37. }
  38. func Count(n int) List {
  39. if (n < 0) { n = 0 }
  40. var nodes = make([] ListNode, n)
  41. for i := 0; i < n; i += 1 {
  42. nodes[i].Value = ToObject(i)
  43. }
  44. return NodesToList(nodes)
  45. }
  46. type ListBuilder struct {
  47. nodes ([] ListNode)
  48. }
  49. func (buf *ListBuilder) Append(item Object) {
  50. buf.nodes = append(buf.nodes, ListNode { Value: item })
  51. }
  52. func (buf *ListBuilder) Collect() List {
  53. return NodesToList(buf.nodes)
  54. }
  55. type Seq struct {
  56. list List
  57. }
  58. func (s Seq) Empty() bool {
  59. return s.list.Empty()
  60. }
  61. func (s Seq) Length() int {
  62. return s.list.Length()
  63. }
  64. func (s Seq) ToList() List {
  65. return s.list.Reversed()
  66. }
  67. func (s Seq) Last() (Object, bool) {
  68. return s.list.First()
  69. }
  70. func (s Seq) Appended(item Object) Seq {
  71. return Seq { Cons(item, s.list) }
  72. }
  73. func (s Seq) Sorted(lt ctn.Less[Object]) Seq {
  74. return Seq { s.list.Sorted(lt).Reversed() }
  75. }
  76. func (s Seq) Filter(f func(Object)(bool)) Seq {
  77. return Seq { s.list.Filter(f) }
  78. }
  79. func (l List) ToSeq() Seq {
  80. return Seq { l.Reversed() }
  81. }
  82. func (l List) Length() int {
  83. return int(l.Size)
  84. }
  85. func (l List) ForEach(f func(Object)) {
  86. var node = l.Head
  87. for node != nil {
  88. f(node.Value)
  89. node = node.Next
  90. }
  91. }
  92. func (l List) ForEachWithIndex(f func(int,Object)) int {
  93. var node = l.Head
  94. var i = 0
  95. for node != nil {
  96. f(i, node.Value)
  97. i += 1
  98. node = node.Next
  99. }
  100. return i
  101. }
  102. func (l List) Reversed() List {
  103. var items = make([] Object, 0)
  104. l.ForEach(func(item Object) {
  105. items = append(items, item)
  106. })
  107. var L = len(items)
  108. var buf ListBuilder
  109. for i := (L-1); i >= 0; i -= 1 {
  110. buf.Append(items[i])
  111. }
  112. return buf.Collect()
  113. }
  114. //go:noinline
  115. func (l List) Empty() bool {
  116. return (l.Head == nil)
  117. }
  118. func (l List) First() (Object, bool) {
  119. if l.Head != nil {
  120. return l.Head.Value, true
  121. } else {
  122. return nil, false
  123. }
  124. }
  125. func (l List) Shifted() (Object, List, bool) {
  126. if l.Head != nil {
  127. var value = l.Head.Value
  128. var new_head = l.Head.Next
  129. var new_size = (l.Size - 1)
  130. return value, List{new_head,new_size}, true
  131. } else {
  132. return nil, List{}, false
  133. }
  134. }
  135. func (l List) Sorted(lt ctn.Less[Object]) List {
  136. var nodes = make([] ListNode, 0)
  137. l.ForEach(func(item Object) {
  138. nodes = append(nodes, ListNode { Value: item })
  139. })
  140. nodes, _ = ctn.StableSorted(nodes, func(a ListNode, b ListNode) bool {
  141. return lt(a.Value, b.Value)
  142. })
  143. return NodesToList(nodes)
  144. }
  145. func (l List) Take(limit int) List {
  146. if limit <= 0 {
  147. return List {}
  148. }
  149. var buf ListBuilder
  150. var count = 0
  151. var node = l.Head
  152. for node != nil {
  153. buf.Append(node.Value)
  154. count++
  155. node = node.Next
  156. if count == limit {
  157. break
  158. }
  159. }
  160. return buf.Collect()
  161. }
  162. func (l List) WithIndex() List {
  163. var nodes = make([] ListNode, 0)
  164. l.ForEachWithIndex(func(i int, a Object) {
  165. var pair = ToObject(ctn.MakePair(a, i))
  166. nodes = append(nodes, ListNode { Value: pair })
  167. })
  168. return NodesToList(nodes)
  169. }
  170. func (l List) Map(f func(Object)(Object)) List {
  171. var nodes = make([] ListNode, 0)
  172. l.ForEach(func(a Object) {
  173. var b = f(a)
  174. nodes = append(nodes, ListNode { Value: b })
  175. })
  176. return NodesToList(nodes)
  177. }
  178. func (l List) DeflateMap(f func(Object)(ctn.Maybe[Object])) List {
  179. var nodes = make([] ListNode, 0)
  180. l.ForEach(func(a Object) {
  181. if b, ok := f(a).Value(); ok {
  182. nodes = append(nodes, ListNode { Value: b })
  183. }
  184. })
  185. return NodesToList(nodes)
  186. }
  187. func (l List) FlatMap(f func(Object)(List)) List {
  188. var nodes = make([] ListNode, 0)
  189. l.ForEach(func(a Object) {
  190. var b = f(a)
  191. b.ForEach(func(b Object) {
  192. nodes = append(nodes, ListNode { Value: b })
  193. })
  194. })
  195. return NodesToList(nodes)
  196. }
  197. func (l List) ZipMap(m List, f func(Object,Object)(Object)) List {
  198. var u = l.Head
  199. var v = m.Head
  200. var nodes = make([] ListNode, 0)
  201. for {
  202. if u == nil || v == nil {
  203. return NodesToList(nodes)
  204. } else {
  205. var a, b = u.Value, v.Value
  206. var c = f(a, b)
  207. nodes = append(nodes, ListNode { Value: c })
  208. u = u.Next
  209. v = v.Next
  210. }
  211. }
  212. }
  213. func (l List) Filter(f func(Object)(bool)) List {
  214. var nodes = make([] ListNode, 0)
  215. l.ForEach(func(a Object) {
  216. if f(a) {
  217. nodes = append(nodes, ListNode { Value: a })
  218. }
  219. })
  220. return NodesToList(nodes)
  221. }
  222. func (l List) Scan(b Object, f func(Object,Object)(Object)) List {
  223. var nodes = make([] ListNode, 0)
  224. l.ForEach(func(a Object) {
  225. b = f(b, a)
  226. nodes = append(nodes, ListNode { Value: b })
  227. })
  228. return NodesToList(nodes)
  229. }
  230. func (l List) Fold(b Object, f func(Object,Object)(Object)) Object {
  231. l.ForEach(func(a Object) {
  232. b = f(b, a)
  233. })
  234. return b
  235. }