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  }