func (c *lineImp) AddNewerByTypeID(typeID dot.TypeID, newDot dot.Newer) error {
	c.mutex.Lock()
	defer c.mutex.Unlock()
	if _, ok := c.newerTypes[typeID]; ok {
		return dot.SError.Existed.AddNewError(typeID.String())
	}
	c.newerTypes[typeID] = newDot
	return nil
}
AddNewerByTypeID add new for type
package line
import (
	"fmt"
	"github.com/pkg/errors"
	"log"
	"reflect"
	"strings"
	"sync"
	"go.uber.org/zap"
	"github.com/scryinfo/dot/dot"
	"github.com/scryinfo/dot/dots/sconfig"
	"github.com/scryinfo/dot/dots/slog"
	"github.com/scryinfo/scryg/sutils/skit"
)
var (
	_ dot.Lifer    = (*lineImp)(nil)
	_ dot.Line     = (*lineImp)(nil)
	_ dot.Injecter = (*lineImp)(nil)
)
type lineImp struct {
	logger     dot.SLogger
	sConfig    dot.SConfig  
	config     dot.Config   
	metas      *Metas       
	lives      *Lives       
	types      map[reflect.Type]dot.Dot
	newerLives map[dot.LiveID]dot.Newer
	newerTypes map[dot.TypeID]dot.Newer
	parent dot.Injecter
	mutex  sync.Mutex
	lineBuilder *dot.Builder
	dotEvent dotEventerImp
}
func newLine(builder *dot.Builder) *lineImp {
	a := &lineImp{metas: NewMetas(),
		lives: NewLives(), types: make(map[reflect.Type]dot.Dot),
		newerLives:  make(map[dot.LiveID]dot.Newer),
		newerTypes:  make(map[dot.TypeID]dot.Newer),
		lineBuilder: builder,
	}
	a.dotEvent.Init()
	if dot.GetDefaultLine() == nil {
		dot.SetDefaultLine(a)
	}
	return a
}
func (c *lineImp) ID() string {
	return c.lineBuilder.LineLiveID
}
func (c *lineImp) AddNewerByLiveID(liveID dot.LiveID, newDot dot.Newer) error {
	c.mutex.Lock()
	defer c.mutex.Unlock()
	if _, ok := c.newerLives[liveID]; ok {
		return dot.SError.Existed.AddNewError(liveID.String())
	}
	c.newerLives[liveID] = newDot
	return nil
}