Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.29 KB | None | 0 0
  1. /**
  2. * A string guaranteed to have a length within the range [L,H)
  3. */
  4. export type WithinRangeString<L extends number, H extends number> = string &
  5. IWithinRangeStringTag<L, H>;
  6.  
  7. function validateWithinRangeString<L extends number, H extends number>(
  8. arg: string,
  9. l: L,
  10. h: H
  11. ): Option<ReadonlyArray<string>> {
  12. interface IWithinRangeStringObj {
  13. readonly arg: string;
  14. readonly length: number;
  15. }
  16. const validationRules: IValidationRules<IWithinRangeStringObj> = {
  17. arg: [[isString, "not string"]],
  18. length: [[gt(l), "too short"], [lt(h), "too long"]]
  19. };
  20. const validation = validateAll([
  21. { arg, length: arg.length },
  22. validationRules
  23. ]);
  24. if (hasErrors(validation)) {
  25. return option(getErrorStrings(validation));
  26. } else {
  27. return none;
  28. }
  29. }
  30.  
  31. export function isWithinRangeString<L extends number, H extends number>(
  32. arg: string,
  33. l: L,
  34. h: H
  35. ): arg is WithinRangeString<L, H> {
  36. return validateWithinRangeString(arg, l, h).match({
  37. none: always(true),
  38. some: always(false)
  39. });
  40. }
  41.  
  42. export function toWithinRangeString<L extends number, H extends number>(
  43. arg: string,
  44. l: L,
  45. h: H
  46. ): Either<ReadonlyArray<string>, WithinRangeString<L, H>> {
  47. return isWithinRangeString(arg, l, h)
  48. ? right(arg)
  49. : left(validateWithinRangeString(arg, l, h).getOrElse([]));
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement