private TrieNode GetOrCreateNextState(TrieNode node, char c)
        {
            TransitionTarget transitionTarget;
            var transition = new TransitionKey(node.NodeId, c);

            if (!transitions.TryGetValue(transition, out transitionTarget))
            {
                var newNode = AddNode(node, c);
                // Creating new outgoing edge and store character corresponding to
                // existing outgoing edge (this way outgoing edges for single vertex form a linked list)
                transitionTarget = new TransitionTarget(newNode.NodeId, node.FirstOutgointChar);
                // Updating reference to top of linked list of
                node.UpdateOutgoingChar(c);
                transitions.Add(transition, transitionTarget);
                return(newNode);
            }
            return(nodes[transitionTarget.NextNodeId]);
        }
    // Create new transition. Checks if valid transition target
    private void CreateTransition(GameObject from, GameObject to)
    {
        // Check if valid transition target
        TransitionTarget transitionTarget = to.GetComponent <TransitionTarget>();

        if (transitionTarget == null)
        {
            Debug.Log("Object " + to.GetHashCode() + " is not a valid transition target");
            return;
        }

        // Create transition
        GameObject transitionObject = Instantiate(arrowPrefab);

        transitionObject.GetComponent <Transition>().SetTransition(from, to);
        transitionObject.transform.parent = arrowRoot.transform;
        transitions.Add(transitionObject.GetComponent <Transition>());
    }