package dagro

type conflictEntry struct {
	orderEntry
	indegree int
	in       []*conflictEntry
	out      []*conflictEntry
	merged   bool
}

func resolveConflicts( []orderEntry,  *Graph) []orderEntry {
	 := make(map[string]*conflictEntry, len())
	 := newOrderedSet()
	for ,  := range  {
		 := &conflictEntry{orderEntry: orderEntry{
			V:             .V,
			VS:            []string{.V},
			I:             ,
			Barycenter:    .Barycenter,
			Weight:        .Weight,
			HasBarycenter: .HasBarycenter,
		}}
		[.V] = 
		.add(.V)
	}

	for ,  := range .Edges() {
		,  := [.V]
		,  := [.W]
		if  &&  {
			.indegree++
			.out = append(.out, )
		}
	}

	 := make([]*conflictEntry, 0, len())
	for ,  := range .values() {
		 := []
		if .indegree == 0 {
			 = append(, )
		}
	}

	return doResolveConflicts()
}

func doResolveConflicts( []*conflictEntry) []orderEntry {
	 := make([]*conflictEntry, 0)
	for len() > 0 {
		 := [len()-1]
		 = [:len()-1]
		 = append(, )

		for ,  := 0, len(.in)-1;  < ; ,  = +1, -1 {
			.in[], .in[] = .in[], .in[]
		}
		for ,  := range .in {
			if .merged {
				continue
			}
			if !.HasBarycenter || !.HasBarycenter || .Barycenter >= .Barycenter {
				mergeEntries(, )
			}
		}
		for ,  := range .out {
			.in = append(.in, )
			.indegree--
			if .indegree == 0 {
				 = append(, )
			}
		}
	}

	 := make([]orderEntry, 0, len())
	for ,  := range  {
		if .merged {
			continue
		}
		 = append(, orderEntry{
			VS:            append([]string(nil), .VS...),
			I:             .I,
			Barycenter:    .Barycenter,
			Weight:        .Weight,
			HasBarycenter: .HasBarycenter,
		})
	}
	return 
}

func mergeEntries(,  *conflictEntry) {
	 := 0.0
	 := 0.0
	if jsTruthyNumber(.Weight) {
		 += .Barycenter * .Weight
		 += .Weight
	}
	if jsTruthyNumber(.Weight) {
		 += .Barycenter * .Weight
		 += .Weight
	}

	.VS = append(append([]string(nil), .VS...), .VS...)
	.Barycenter =  / 
	.Weight = 
	.HasBarycenter = true
	if .I < .I {
		.I = .I
	}
	.merged = true
}