package mathutil

import 

// DataSize format bytes number friendly. eg: 1024 => 1KB, 1024*1024 => 1MB
//
// Usage:
//
//	file, err := os.Open(path)
//	fl, err := file.Stat()
//	fmtSize := DataSize(fl.Size())
func ( uint64) string {
	switch {
	case  < 1024:
		return fmt.Sprintf("%dB", )
	case  < 1024*1024:
		return fmt.Sprintf("%.2fK", float64()/1024)
	case  < 1024*1024*1024:
		return fmt.Sprintf("%.2fM", float64()/1024/1024)
	default:
		return fmt.Sprintf("%.2fG", float64()/1024/1024/1024)
	}
}

// FormatBytes Format the byte size to be a readable string. eg: 1024 => 1 KB
func ( int) string {
	const  = 1024
	if  <  {
		return fmt.Sprintf("%d B", )
	}

	,  := int64(), 0
	for  :=  / ;  >= ;  /=  {
		 *= 
		++
	}
	return fmt.Sprintf("%.2f %cB", float64()/float64(), "KMGTPE"[])
}

var timeFormats = [][]int{
	{0},
	{1},
	{2, 1},
	{60},
	{120, 60},
	{3600},
	{7200, 3600},
	{86400},
	{172800, 86400}, // second elem is unit.
	{2592000},
	{2592000 * 2, 2592000},
}

var timeMessages = []string{
	"< 1 sec", "1 sec", "secs", "1 min", "mins", "1 hr", "hrs", "1 day", "days", "1 month", "months",
}

// HowLongAgo format a seconds, get how lang ago. eg: 1 day, 1 week
func ( int64) string {
	 := int()
	 := len(timeFormats)

	for ,  := range timeFormats {
		if  >= [0] {
			 :=  + 1
			 := false

			if  <  { // next exists
				 := timeFormats[]
				if  < [0] { // current <= intVal < next
					 = true
				}
			} else if  ==  { // current is last
				 = true
			}

			if  { // match success
				if len() == 1 {
					return timeMessages[]
				}
				return fmt.Sprintf("%d %s", /[1], timeMessages[])
			}
		}
	}

	return "unknown" // He should never happen
}