code: func NewNode(key string, data interface{}) *Node {
  	n := &Node{
  		Key: key,
  	}
  
  	n.mtx.Lock()
  	n.Children = map[string]*Node{}
  	n.mtx.Unlock()
  
  	if data == nil {
  		return n
  	}
  
  	switch val := reflect.ValueOf(data); val.Kind() {
  	case reflect.Map:
  		for _, k := range val.MapKeys() {
  			v := val.MapIndex(k)
  			key := fmt.Sprintf("%s", k.Interface())
  
  			child := NewNode(key, v.Interface())
  			child.Parent = n
  			n.Children[key] = child
  		}
  
  	case reflect.Array, reflect.Slice:
  		n.sliceKids = true
  
  		for i := 0; i < val.Len(); i++ {
  			v := val.Index(i)
  			key := strconv.FormatInt(int64(i), 10)
  
  			child := NewNode(key, v.Interface())
  			child.Parent = n
  			n.Children[key] = child
  		}
  
  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  		fallthrough
  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  		fallthrough
  	case reflect.Float32, reflect.Float64:
  		fallthrough
  	case reflect.String, reflect.Bool, reflect.Interface:
  		n.Value = val.Interface()
  	default:
  		fmt.Printf("Unsupported type %s(%#v)If you see this log please report an issue on https://github.com/zabawaba99/firego", data, data)
  	}
  
  	return n
  }
docs: // NewNode converts the given data into a node.