public CardState With(
     PropertyUpdate <bool> showAtomicNumber = null,
     PropertyUpdate <bool> showSymbol       = null,
     PropertyUpdate <bool> showName         = null)
 =>
 new CardState(
     showAtomicNumberbool: showAtomicNumber.GetUpdatedValue(ShowAtomicNumber),
     showSymbol: showSymbol.GetUpdatedValue(ShowSymbol),
     showName: showName.GetUpdatedValue(ShowName));
 public ElementState With(
     PropertyUpdate <byte> atomicNumber = null,
     PropertyUpdate <CardState> front   = null,
     PropertyUpdate <CardState> back    = null,
     PropertyUpdate <bool> concealed    = null)
 =>
 new ElementState(
     atomicNumber.GetUpdatedValue(AtomicNumber),
     front: front.GetUpdatedValue(Front),
     back: back.GetUpdatedValue(Back),
     concealed: concealed.GetUpdatedValue(Concealed));
 public ElementsMatchGameState With(
     PropertyUpdate <MatchType> matchType                  = null,
     PropertyUpdate <byte?> expectedElement                = null,
     PropertyUpdate <string> expectedElementDisplayText    = null,
     PropertyUpdate <bool> showElementGroup                = null,
     PropertyUpdate <bool> highlighElementsInExpectedGroup = null,
     PropertyUpdate <int> totalMatched         = null,
     PropertyUpdate <int> totalMismatched      = null,
     PropertyUpdate <byte[]> availableElements = null,
     PropertyUpdate <ReadOnlyDictionary <byte, ElementState> > elementStates = null)
 =>
 new ElementsMatchGameState(
     matchType: matchType.GetUpdatedValue(MatchType),
     expectedElement: expectedElement.GetUpdatedValue(ExpectedElement),
     expectedElementDisplayText: expectedElementDisplayText.GetUpdatedValue(ExpectedElementDisplayText),
     showElementGroup: showElementGroup.GetUpdatedValue(ShowElementGroup),
     highlighElementsInExpectedGroup: highlighElementsInExpectedGroup.GetUpdatedValue(HighlighElementsInExpectedGroup),
     totalMatched: totalMatched.GetUpdatedValue(TotalMatched),
     totalMismatched: totalMismatched.GetUpdatedValue(TotalMismatched),
     availableElements: availableElements.GetUpdatedValue(AvailableElements),
     elementStates: elementStates.GetUpdatedValue(ElementStates));