Sha256: 15ce2116128e972d9c6ee7cc28ec3f6e9b0591ea36bdebe5943149974aade23f
Contents?: true
Size: 1.91 KB
Versions: 71
Compression:
Stored size: 1.91 KB
Contents
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using Generators.Input; using Generators.Output; namespace Generators { public class ExerciseCollection : IEnumerable<Exercise> { private readonly CanonicalDataFile _canonicalDataFile; private readonly Dictionary<string, Type> _exerciseTypesByName; public ExerciseCollection(CanonicalDataFile canonicalDataFile) { _canonicalDataFile = canonicalDataFile; _exerciseTypesByName = Assembly.GetEntryAssembly() .GetTypes() .Where(IsConcreteGenerator) .ToDictionary(type => type.ToExerciseName(), StringComparer.OrdinalIgnoreCase); } public IEnumerator<Exercise> GetEnumerator() => GetExercises().GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); private IEnumerable<Exercise> GetExercises() { foreach (var exerciseName in ConfigFile.GetExerciseNames()) { if (HasNoCanonicalData(exerciseName)) yield return new MissingDataExercise(exerciseName); else if (IsNotImplemented(exerciseName)) yield return new UnimplementedExercise(exerciseName); else yield return CreateExercise(exerciseName); } } private bool HasNoCanonicalData(string exerciseName) => !_canonicalDataFile.Exists(exerciseName); private bool IsNotImplemented(string exerciseName) => !_exerciseTypesByName.ContainsKey(exerciseName.ToExerciseName()); private Exercise CreateExercise(string exerciseName) => (Exercise)Activator.CreateInstance(_exerciseTypesByName[exerciseName.ToExerciseName()]); private static bool IsConcreteGenerator(Type type) => typeof(Exercise).IsAssignableFrom(type); } }
Version data entries
71 entries across 71 versions & 1 rubygems