private void AddAssembly(KeyValuePair <Assembly, TopNamespaceTracker> assembly)
 {
     _references.Add(assembly);
     ThreadPool.QueueUserWorkItem(state => {
         // start initializing assemblies on background thread for quick response.
         foreach (string key in assembly.Value.GetMemberNames())
         {
             var value = PythonAssemblyOps.GetBoundMember(_codeContext, assembly.Key, key);
         }
     });
 }
        /// <summary>
        /// Gets a top-level list of all the available modules as a list of MemberResults.
        /// </summary>
        /// <returns></returns>
        public MemberResult[] GetModules()
        {
            var d = new Dictionary <string, HashSet <Namespace> >();

            foreach (var keyValue in Modules)
            {
                var modName   = keyValue.Key;
                var moduleRef = keyValue.Value;

                HashSet <Namespace> l;
                if (!d.TryGetValue(modName, out l))
                {
                    d[modName] = l = new HashSet <Namespace>();
                }
                if (moduleRef != null && moduleRef.Module != null)
                {
                    // The REPL shows up here with value=None
                    l.Add(moduleRef.Module);
                }
            }

            foreach (var r in _references)
            {
                foreach (string key in r.Value.GetMemberNames())
                {
                    var value = PythonAssemblyOps.GetBoundMember(_codeContext, r.Key, key);
                    HashSet <Namespace> l2;
                    if (!d.TryGetValue(key, out l2))
                    {
                        d[key] = l2 = new HashSet <Namespace>();
                    }
                    l2.Add(GetNamespaceFromObjects(value));
                }
            }

            var result = new MemberResult[d.Count];
            int pos    = 0;

            foreach (var kvp in d)
            {
                result[pos++] = new MemberResult(kvp.Key, kvp.Value);
            }
            return(result);
        }