/// <summary>
 /// Check if a combination of keys have been clicked (i.e. has been 
 /// pressed for exactly 1 frame).
 /// </summary>
 /// <param name="key"></param>
 /// <returns></returns>
 public bool IsClicked(KeyCombination keys)
 {
     return keys.Keys.All(IsClicked);
 }
 /// <summary>
 /// Check if a combination of keys have been unpressed for at least the given number of frames.
 /// </summary>
 /// <param name="key"></param>
 /// <param name="frames"></param>
 /// <returns></returns>
 public bool IsUnheldForAtleast(KeyCombination keys, int frames)
 {
     return keys.Keys.All(k => IsUnheldForAtleast(k, frames));
 }
 /// <summary>
 /// Check if a combination of keys have been released (i.e. has been unpressed for exactly 1 frame).
 /// </summary>
 /// <param name="key"></param>
 /// <returns></returns>
 public bool IsReleased(KeyCombination keys)
 {
     return keys.Keys.All(IsReleased);
 }
 /// <summary>
 /// Check if a combination of keys have been unpressed for any number of frames.
 /// </summary>
 /// <param name="key"></param>
 /// <returns></returns>
 public bool IsUnheld(KeyCombination keys)
 {
     return keys.Keys.All(IsUnheld);
 }
 /// <summary>
 /// Check if a combination of keys have been pressed for exactly the given number of frames.
 /// </summary>
 /// <param name="key"></param>
 /// <param name="frames"></param>
 /// <returns></returns>
 public bool IsHeldFor(KeyCombination keys, int frames)
 {
     return keys.Keys.All(k => IsHeldFor(k, frames));
 }