getter_utils.gno

package pool

import (
	"time"

	bptree "gno.land/p/nt/bptree/v0"
)

func cloneStringSlice(src []string) []string {
	if src == nil {
		return nil
	}

	cloned := make([]string, len(src))
	copy(cloned, src)
	return cloned
}

func cloneInt32Slice(src []int32) []int32 {
	if src == nil {
		return nil
	}

	cloned := make([]int32, len(src))
	copy(cloned, src)
	return cloned
}

func cloneFeeAmountTickSpacings(src map[uint32]int32) map[uint32]int32 {
	if src == nil {
		return nil
	}

	cloned := make(map[uint32]int32, len(src))
	for fee, spacing := range src {
		cloned[fee] = spacing
	}

	return cloned
}

func clonePositionInfo(src PositionInfo) PositionInfo {
	return PositionInfo{
		liquidity:                src.liquidity,
		feeGrowthInside0LastX128: src.feeGrowthInside0LastX128,
		feeGrowthInside1LastX128: src.feeGrowthInside1LastX128,
		tokensOwed0:              src.tokensOwed0,
		tokensOwed1:              src.tokensOwed1,
	}
}

func cloneObservationState(src *ObservationState) *ObservationState {
	if src == nil {
		return nil
	}

	observations := make(map[uint16]*Observation)
	for index, observation := range src.observations {
		observations[index] = observation.Clone()
	}

	return &ObservationState{
		observations:    observations,
		index:           src.index,
		cardinality:     src.cardinality,
		cardinalityNext: src.cardinalityNext,
	}
}

func clonePool(src *Pool) *Pool {
	if src == nil {
		return nil
	}

	return &Pool{
		token0Path:  src.token0Path,
		token1Path:  src.token1Path,
		fee:         src.fee,
		tickSpacing: src.tickSpacing,
		slot0: Slot0{
			sqrtPriceX96: src.slot0.sqrtPriceX96.Clone(),
			tick:         src.slot0.tick,
			feeProtocol:  src.slot0.feeProtocol,
			unlocked:     src.slot0.unlocked,
		},
		balances:             src.balances,
		protocolFees:         src.protocolFees,
		feeGrowthGlobal0X128: src.feeGrowthGlobal0X128.Clone(),
		feeGrowthGlobal1X128: src.feeGrowthGlobal1X128.Clone(),
		liquidity:            src.liquidity.Clone(),
		ticks:                bptree.NewBPTreeN(32),
		tickBitmaps:          make(map[int16]string),
		positions:            bptree.NewBPTreeN(16),
		observationState:     NewObservationState(time.Now().Unix()),
	}
}

func clonePoolTicks(src *bptree.BPTree) *bptree.BPTree {
	if src == nil {
		return bptree.NewBPTreeN(32)
	}

	cloned := bptree.NewBPTreeN(32)

	src.Iterate("", "", func(key string, value any) bool {
		cloned.Set(key, value)
		return false
	})

	return cloned
}

func clonePoolTickBitmaps(src map[int16]string) map[int16]string {
	if src == nil {
		return make(map[int16]string)
	}

	cloned := make(map[int16]string, len(src))
	for wordPos, bitmap := range src {
		cloned[wordPos] = bitmap
	}

	return cloned
}

func cloneStringInt64Map(src map[string]int64) map[string]int64 {
	if src == nil {
		return nil
	}

	cloned := make(map[string]int64, len(src))
	for k, v := range src {
		cloned[k] = v
	}

	return cloned
}

func NewDefaultPositionInfo() PositionInfo {
	return PositionInfo{
		liquidity:                "0",
		feeGrowthInside0LastX128: "0",
		feeGrowthInside1LastX128: "0",
		tokensOwed0:              0,
		tokensOwed1:              0,
	}
}