static Action <FeatherWriter, System.Collections.IEnumerable> LookupDefaultAdapter(Type elementType, ColumnType toType)
        {
            var key = new AdapterKey {
                FromType = elementType, ToType = toType
            };

            lock (UntypedEnumerableAdapters)
            {
                Action <FeatherWriter, System.Collections.IEnumerable> ret;
                if (UntypedEnumerableAdapters.TryGetValue(key, out ret))
                {
                    return(ret);
                }

                var widener = DataWidener.GetWidener(elementType);

                var typedAdapter = LookupEnumerableAdapter(elementType, toType);

                UntypedEnumerableAdapters[key] = ret =
                    (writer, data) =>
                {
                    var widend = widener(data);
                    typedAdapter(writer, widend);
                };

                return(ret);
            }
        }
        static Action <FeatherWriter, System.Collections.IEnumerable> LookupEnumerableAdapter(Type elementType, ColumnType toType)
        {
            var key = new AdapterKey {
                FromType = elementType, ToType = toType
            };

            // making an assumption that actually using the adapter
            //   dominates creating it, making this lock acceptable
            lock (EnumerableAdapters)
            {
                Action <FeatherWriter, System.Collections.IEnumerable> ret;
                if (EnumerableAdapters.TryGetValue(key, out ret))
                {
                    return(ret);
                }

                EnumerableAdapters[key] = ret = EnumerableAdapter.Create(elementType, toType);

                return(ret);
            }
        }