Example #1
0
        public ChainItem GetOrAdd(string value)
        {
            ChainItem item;

            if (!_items.TryGetValue(value, out item))
            {
                item           = new ChainItem(value);
                _items [value] = item;
            }
            return(item);
        }
Example #2
0
        public void LearnFrom(IEnumerable <string> lines, ISplitter splitter)
        {
            _items.Clear();
            _separator     = splitter.Separator;
            _endOfSequence = splitter.EndOfSequence;

            foreach (var l in lines)
            {
                bool      atStart = true;
                ChainItem current = null;
                foreach (string item in splitter.Split(l))
                {
                    if (item == splitter.EndOfSequence)
                    {
                        if (current != null)
                        {
                            current.CanFinish = true;
                        }
                        atStart = true;
                        continue;
                    }

                    var next = GetOrAdd(item);

                    if (!atStart)
                    {
                        current.Register(next.Value);
                    }
                    else
                    {
                        if (char.IsUpper(next.Value[0]))
                        {
                            next.CanStart = true;
                        }

                        atStart = false;
                    }

                    current = next;
                }
            }

            Normalize();
        }
Example #3
0
        public string Generate(int maxLength, IRandomSource random)
        {
            ChainItem current = null;
            var       result  = new StringBuilder();
            int       count   = 0;

            while (count < maxLength)
            {
                if (current == null)
                {
                    current = _items.Values.Where(i => i.CanStart).OrderBy(_ => Builders.Build <int>(random)).First();
                    result.Append(current.Value);
                    count++;
                    continue;
                }

                if (current.CanFinish && Builders.Build <byte>(random) % 10 < 3)
                {
                    result.Append(_endOfSequence + _separator);
                    current = null;
                    continue;
                }

                var next = current.PickNext(random);
                if (next == null)
                {
                    result.Append(_endOfSequence + _separator);
                    current = null;
                    continue;
                }

                current = _items [next];
                result.Append(_separator + current.Value);
                count++;
            }

            return(result.ToString());
        }
Example #4
0
 public ChainItem GetOrAdd(string value)
 {
     ChainItem item;
     if (!_items.TryGetValue (value, out item)) {
         item = new ChainItem (value);
         _items [value] = item;
     }
     return item;
 }