gitlab.com/evatix-go/core@v1.3.55/coredata/corestr/LinkedCollectionNode.go (about) 1 package corestr 2 3 import ( 4 "fmt" 5 "strings" 6 7 "gitlab.com/evatix-go/core/constants" 8 ) 9 10 type LinkedCollectionNode struct { 11 Element *Collection 12 next *LinkedCollectionNode 13 } 14 15 func (linkedCollectionNode *LinkedCollectionNode) IsEmpty() bool { 16 return linkedCollectionNode.Element == nil 17 } 18 19 func (linkedCollectionNode *LinkedCollectionNode) HasElement() bool { 20 return linkedCollectionNode.Element != nil 21 } 22 23 func (linkedCollectionNode *LinkedCollectionNode) HasNext() bool { 24 return linkedCollectionNode.next != nil 25 } 26 27 func (linkedCollectionNode *LinkedCollectionNode) Next() *LinkedCollectionNode { 28 return linkedCollectionNode.next 29 } 30 31 func (linkedCollectionNode *LinkedCollectionNode) AddNext( 32 linkedCollection *LinkedCollections, 33 collection *Collection, 34 ) *LinkedCollectionNode { 35 newNode := &LinkedCollectionNode{ 36 Element: collection, 37 next: linkedCollectionNode.Next(), 38 } 39 40 linkedCollectionNode.next = newNode 41 42 linkedCollection.incrementLength() 43 44 return newNode 45 } 46 47 func (linkedCollectionNode *LinkedCollectionNode) AddStringsPtrToNode( 48 linkedCollection *LinkedCollections, 49 isSkipOnNull bool, 50 items *[]string, 51 isMakeClone bool, 52 ) *LinkedCollections { 53 collection := New. 54 Collection. 55 StringsPtrOption(isMakeClone, items) 56 57 return linkedCollection.AddCollectionToNode( 58 isSkipOnNull, 59 linkedCollectionNode, 60 collection) 61 } 62 63 func (linkedCollectionNode *LinkedCollectionNode) AddCollectionToNode( 64 linkedCollection *LinkedCollections, 65 isSkipOnNull bool, 66 collection *Collection, 67 ) *LinkedCollections { 68 return linkedCollection.AddCollectionToNode( 69 isSkipOnNull, 70 linkedCollectionNode, 71 collection) 72 } 73 74 func (linkedCollectionNode *LinkedCollectionNode) AddNextNode( 75 linkedCollection *LinkedCollections, 76 nextNode *LinkedCollectionNode, 77 ) *LinkedCollectionNode { 78 nextNode.next = linkedCollectionNode.Next() 79 linkedCollectionNode.next = nextNode 80 81 linkedCollection.incrementLength() 82 83 return nextNode 84 } 85 86 func (linkedCollectionNode *LinkedCollectionNode) IsChainEqual(another *LinkedCollectionNode) bool { 87 if linkedCollectionNode == another { 88 return true 89 } 90 91 if another == nil && linkedCollectionNode == nil { 92 return true 93 } 94 95 if another == nil || linkedCollectionNode == nil { 96 return false 97 } 98 99 return linkedCollectionNode.IsEqual(another) && 100 linkedCollectionNode.isNextChainEqual(another) 101 } 102 103 func (linkedCollectionNode *LinkedCollectionNode) IsEqual(another *LinkedCollectionNode) bool { 104 if linkedCollectionNode == nil && nil == another { 105 return true 106 } 107 108 if linkedCollectionNode == nil || nil == another { 109 return false 110 } 111 112 if linkedCollectionNode == another { 113 return true 114 } 115 116 //goland:noinspection GoNilness 117 118 elem1 := linkedCollectionNode.Element 119 elem2 := another.Element 120 121 //goland:noinspection GoNilness 122 if elem1 == nil && nil == elem2 { 123 return true 124 } 125 126 if elem1 == nil || nil == elem2 { 127 return false 128 } 129 130 if elem1 == elem2 { 131 return true 132 } 133 134 isElementSame := elem1.IsEqualsPtr(elem2) 135 136 return isElementSame && 137 linkedCollectionNode.isNextEqual(another) 138 } 139 140 func (linkedCollectionNode *LinkedCollectionNode) isNextEqual( 141 another *LinkedCollectionNode, 142 ) bool { 143 next1 := linkedCollectionNode.Next() 144 next2 := another.Next() 145 146 if next1 == nil && nil == next2 { 147 return true 148 } 149 150 if next1 == nil || nil == next2 { 151 return false 152 } 153 154 if next1 == next2 { 155 return true 156 } 157 158 return next1. 159 Element. 160 IsEqualsPtr( 161 next2.Element) 162 } 163 164 func (linkedCollectionNode *LinkedCollectionNode) isNextChainEqual( 165 another *LinkedCollectionNode, 166 ) bool { 167 next1 := linkedCollectionNode.Next() 168 next2 := another.Next() 169 170 if next1 == nil && nil == next2 { 171 return true 172 } 173 174 if next1 == nil || nil == next2 { 175 return false 176 } 177 178 return next1.IsChainEqual(next2) 179 } 180 181 func (linkedCollectionNode *LinkedCollectionNode) IsEqualValue(collection *Collection) bool { 182 elem1 := linkedCollectionNode.Element 183 184 //goland:noinspection GoNilness 185 if elem1 == nil && nil == collection { 186 return true 187 } 188 189 if elem1 == nil || nil == collection { 190 return false 191 } 192 193 if elem1 == collection { 194 return true 195 } 196 197 return elem1.IsEqualsPtr(collection) 198 } 199 200 func (linkedCollectionNode *LinkedCollectionNode) EndOfChain() ( 201 endOfChain *LinkedCollectionNode, 202 length int, 203 ) { 204 node := linkedCollectionNode 205 length++ 206 207 for node.HasNext() { 208 node = node.Next() 209 length++ 210 } 211 212 return node, length 213 } 214 215 func (linkedCollectionNode *LinkedCollectionNode) LoopEndOfChain( 216 processor LinkedCollectionSimpleProcessor, 217 ) (endOfLoop *LinkedCollectionNode, length int) { 218 node := linkedCollectionNode 219 arg := &LinkedCollectionProcessorParameter{ 220 Index: 0, 221 CurrentNode: node, 222 PrevNode: nil, 223 IsFirstIndex: true, 224 IsEndingIndex: false, 225 } 226 227 isBreak := processor(arg) 228 229 length++ 230 231 if isBreak { 232 return node, length 233 } 234 235 i := 1 236 237 for node.HasNext() { 238 prev := node 239 node = node.Next() 240 isEndingIndex := !node.HasNext() 241 arg2 := &LinkedCollectionProcessorParameter{ 242 Index: i, 243 CurrentNode: node, 244 PrevNode: prev, 245 IsFirstIndex: false, 246 IsEndingIndex: isEndingIndex, 247 } 248 249 isBreak = processor(arg2) 250 length++ 251 i++ 252 253 if isBreak { 254 return node, length 255 } 256 } 257 258 return node, length 259 } 260 261 func (linkedCollectionNode *LinkedCollectionNode) CreateLinkedList() *LinkedCollections { 262 return Empty.LinkedCollections(). 263 AppendChainOfNodes(linkedCollectionNode) 264 } 265 266 func (linkedCollectionNode *LinkedCollectionNode) Clone() *LinkedCollectionNode { 267 return &LinkedCollectionNode{ 268 Element: linkedCollectionNode.Element, 269 next: nil, 270 } 271 } 272 273 func (linkedCollectionNode *LinkedCollectionNode) String() string { 274 return linkedCollectionNode.Element.String() 275 } 276 277 func (linkedCollectionNode *LinkedCollectionNode) ListPtr() *[]string { 278 list := make([]string, 0, constants.ArbitraryCapacity100) 279 280 node := linkedCollectionNode 281 list = append(list, node.Element.List()...) 282 283 for node.HasNext() { 284 node = node.Next() 285 286 list = append(list, node.Element.List()...) 287 } 288 289 return &list 290 } 291 292 func (linkedCollectionNode *LinkedCollectionNode) Join(separator string) *string { 293 list := linkedCollectionNode.ListPtr() 294 toString := strings.Join(*list, separator) 295 296 return &toString 297 } 298 299 func (linkedCollectionNode *LinkedCollectionNode) StringListPtr(header string) *string { 300 finalString := header + 301 *linkedCollectionNode.Join(commonJoiner) 302 303 return &finalString 304 } 305 306 func (linkedCollectionNode *LinkedCollectionNode) Print(header string) { 307 finalString := linkedCollectionNode.StringListPtr(header) 308 fmt.Println(finalString) 309 }