public object VisitList(Func <Type, object> recurse, Type listType, Type elementType)
        {
            if (!exhaustiveLists)
            {
                return(GeneratorHelper.ApplyToList(recurse, elementType, maxSize));
            }

            var length = Arbitrary <byte>();

            // start with empty list
            var emptyMethod = emptyListMethod.MakeGenericMethod(elementType);
            var ifMethod    = ifConditionMethod.MakeGenericMethod(listType);

            var list = emptyMethod.Invoke(null, CommonUtilities.EmptyArray);

            for (int i = maxSize; i > 0; i--)
            {
                var guard      = length == Constant((byte)i);
                var trueBranch = GeneratorHelper.ApplyToList(recurse, elementType, i);
                list = ifMethod.Invoke(null, new object[] { guard, trueBranch, list });
            }

            return(list);
        }
 public object VisitTuple(Func <Type, object> recurse, Type tupleType, Type innerTypeLeft, Type innerTypeRight)
 {
     return(GeneratorHelper.ApplyToTuple(recurse, innerTypeLeft, innerTypeRight));
 }
 public object VisitObject(Func <Type, object> recurse, Type objectType, SortedDictionary <string, Type> fields)
 {
     return(GeneratorHelper.ApplyToObject(recurse, objectType, fields));
 }