You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: shanten_improve.go
    path of file: ./repos/mahjong-helper/util
    
    the code of the file until where you have to start completion: package util

import (
	"fmt"
	"github.com/EndlessCheng/mahjong-helper/util/model"
	"math"
	"sort"
)

// map[改良牌]进张（选择进张数最大的）
type Improves map[int]Waits

// 3k+1 张手牌的分析结果
type Hand13AnalysisResult struct {
	// 原手牌
	Tiles34 []int

	// 剩余牌
	LeftTiles34 []int

	// 是否已鸣牌（非门清状态）
	// 用于判断是否无役等
	IsNaki bool

	// 向听数
	Shanten int

	// 进张
	// 考虑了剩余枚数
	// 若某个进张牌 4 枚都可见，则该进张的 value 值为 0
	Waits Waits

	// 默听时的进张
	DamaWaits Waits

	// TODO: 鸣牌进张：他家打出这张牌，可以鸣牌，且能让向听数前进
	//MeldWaits Waits

	// map[进张牌]向听前进后的(最大)进张数
	NextShantenWaitsCountM
    
func calculateIsolatedTileValue(tile int, playerInfo *model.PlayerInfo) tileValue {
	value := tileValue(100)

	// 是否为宝牌
	for _, doraTile := range playerInfo.DoraTiles {
		if tile == doraTile {
			value += doraValue
			//} else if doraTile < 27 {
			//	if tile/3 != doraTile/3 {
			//		continue
			//	}
			//	t9 := tile % 9
			//	dt9 := doraTile % 9
			//	if t9+1 == dt9 || t9-1 == dt9 {
			//		value += doraFirstNeighbourValue
			//	} else if t9+2 == dt9 || t9-2 == dt9 {
			//		value += doraSecondNeighbourValue
			//	}
		}
	}

	if tile >= 27 {
		if tile == playerInfo.SelfWindTile || tile == playerInfo.RoundWindTile || tile >= 31 {
			// 役牌
			value += honoredValue
			if playerInfo.SelfWindTile == playerInfo.RoundWindTile && tile == playerInfo.SelfWindTile {
				value += honoredValue // 连风
			} else if tile == playerInfo.SelfWindTile {
				value++ // 自风 +1
			} else if tile == playerInfo.RoundWindTile {
				value-- // 场风 -1
			}
			if tile == 31 {
				value -= 0.1
			}
			if tile == 32 {
				value -= 0.2
			}
		} else {
			// 客风
			for i := 1; i <= 3; i++ {
				otakazeTile := playerInfo.SelfWindTile + i
				if otakazeTile > 30 {
					otakazeTile -= 4
				}
				if tile == otakazeTile {
					// 下家 -3  对家 -2  上家 -1
					value -= tileValue(4 - i)
					break
				}
			}
		}
		left := playerInfo.LeftTiles34[tile]
		if left == 2 {
			value *= 0.9
		} else if left == 1 {
			value *= 0.2
		} else if left == 0 {
			value = 0
		}
	}

	return value
}