package collection

import (
	. "gitea.zaclys.com/bvaudour/gob/option"
)

type chain[T any] struct {
	value T
	next  *chain[T]
}

func prevChain[T any](value T, next *chain[T]) *chain[T] {
	return &chain[T]{
		value: value,
		next:  next,
	}
}

func nextChain[T any](value T, prev Option[*chain[T]]) *chain[T] {
	c := &chain[T]{
		value: value,
	}

	if p, ok := prev.Get(); ok {
		p.next = c
	}

	return c
}

type dualChain[T any] struct {
	value T
	prev  *dualChain[T]
	next  *dualChain[T]
}

func newDual[T any](e T) *dualChain[T] {
	return &dualChain[T]{
		value: e,
	}
}

func link[T any](o1, o2 Option[*dualChain[T]]) {
	if c1, ok := o1.Get(); ok {
		if c2, ok := o2.Get(); ok {
			c1.next = c2
			c2.prev = c1
		} else {
			c1.next = nil
		}
	} else if c2, ok := o2.Get(); ok {
		c2.prev = nil
	}
}
