package definition
Emoji is a data structure that holds a single emoji.
Name is a name of this emoji.
ShortNames is a shorter representation of this emoji.
Unicode is an unicode representation of this emoji.
NewEmoji returns a new Emoji.
func ( string,  []rune,  ...string) Emoji {
	if len() == 0 {
		panic("Emoji must have at leat 1 short name.")
	}
	if  == nil || len() == 0 {
		 = []rune{0xFFFD}
	}
	return Emoji{
		Name:       ,
		ShortNames: ,
		Unicode:    ,
	}
}
IsUnicode returns true if this emoji is defined in unicode, otherwise false.
func ( *Emoji) () bool {
	return !(len(.Unicode) == 1 && .Unicode[0] == 0xFFFD)
}
Emojis is a collection of emojis.
Get returns (*Emoji, true) if found mapping associated with given short name, otherwise (nil, false).
	Get(shortName string) (*Emoji, bool)
Add adds new emojis to this collection.
	Add(Emojis)
Clone clones this collection.
	Clone() Emojis
}

type emojis struct {
	list     []Emoji
	m        map[string]*Emoji
	children []Emojis
}
NewEmojis returns a new Emojis.
func ( ...Emoji) Emojis {
	 := &emojis{
		list:     ,
		m:        map[string]*Emoji{},
		children: []Emojis{},
	}
	for ,  := range  {
		 := &.list[]
		for ,  := range .ShortNames {
			.m[] = 
		}
	}
	return 
}

func ( *emojis) ( Emojis) {
	.children = append(.children, )
}

func ( *emojis) () Emojis {
	 := &emojis{
		list:     .list,
		m:        .m,
		children: make([]Emojis, len(.children)),
	}
	copy(.children, .children)
	return 
}

func ( *emojis) ( string) (*Emoji, bool) {
	,  := .m[]
	if  {
		return , 
	}

	for ,  := range .children {
		,  := .Get()
		if  {
			return , 
		}
	}
	return nil, false
}
EmojisOption sets options for Emojis.
type EmojisOption func(Emojis)
WithEmojis is an EmojisOption that adds emojis to the Emojis.
func ( ...Emoji) EmojisOption {
	return func( Emojis) {
		.Add(NewEmojis(...))
	}