/packet/packet.go
package packet

import "bytex64.net/code/bitsmash/ac"

type Packet interface {
    Length() int
    ByteLength() int
    Encode(ac.CodecManager)
    Pixels() []uint8
    String() string
}

type PacketRun struct {
    Length int
    Bytes int
    Depth int
    Head Packet
}

type ByPacketEfficiency []PacketRun

func (a ByPacketEfficiency) Len() int {
    return len(a)
}

func (a ByPacketEfficiency) Swap(i, j int) {
    a[i], a[j] = a[j], a[i]
}

func (a ByPacketEfficiency) Less(i, j int) bool {
    e1 := float64(a[i].Length) / float64(a[i].Bytes)
    e2 := float64(a[j].Length) / float64(a[j].Bytes)
    if e1 == e2 {
        if a[i].Depth == a[j].Depth {
            return a[j].Head.Length() < a[i].Head.Length()
        } else {
            return a[i].Depth < a[j].Depth
        }
    } else {
        return e1 > e2
    }
}