static Parsed <Thickness <Points> > TryParseThickness(string str) { var parts = str.Split(","); switch (parts.Length) { case 1: return(parts[0].TryParsePoints() .Select(all => new Thickness <Points>(all))); case 2: return(Parsed.Create( stringValue: str, value: Optional.Combine( parts[0].TryParsePoints().Value, parts[1].TryParsePoints().Value, (h, v) => new Thickness <Points>(h, v)))); case 4: return(Parsed.Create( stringValue: str, value: Optional.Combine( parts[0].TryParsePoints().Value, parts[1].TryParsePoints().Value, parts[2].TryParsePoints().Value, parts[3].TryParsePoints().Value, (l, t, r, b) => new Thickness <Points>(l, t, r, b)))); default: return(Parsed.Failure <Thickness <Points> >(str)); } }
public static Func <string, Parsed <Size <T> > > CreateSizeParser <T>(Func <string, Parsed <T> > tryParseLength) { return(value => { var parts = value.Split(","); if (parts.Length == 1) { return tryParseLength(parts[0]).Select(Size.Create); } if (parts.Length == 2) { return Parsed.Create(value, tryParseLength(parts[0]).Value.SelectMany(x => tryParseLength(parts[1]).Value.Select(y => Size.Create(x, y)))); } return Parsed.Failure <Size <T> >(value); }); }