Advertisement
Guest User

Untitled

a guest
Jun 5th, 2024
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.39 KB | None | 0 0
  1. package examples;
  2.  
  3. public class Main {
  4.     public static void main(String[] args) {
  5.         var r = new StateStart()
  6.                 .transition(new SignalZeroDigit())
  7.                 .transition(new SignalZeroDigit())
  8.                 .transition(new SignalZeroDigit())
  9.                 .transition(new SignalZeroDigit())
  10.                 .transition(new SignalNaturalDigit(1))
  11.                 .transition(new SignalNaturalDigit(2))
  12.                 .transition(new SignalNaturalDigit(3))
  13.                 .transition(new SignalPlus())
  14.                 .transition(new SignalNaturalDigit(1))
  15.                 .transition(new SignalNaturalDigit(2))
  16.                 .transition(new SignalNaturalDigit(3))
  17.                 .transition(new SignalEq())
  18.                 .transition(new SignalNaturalDigit(1))
  19.                 .transition(new SignalNaturalDigit(1))
  20.                 .transition(new SignalNaturalDigit(1))
  21.                 .transition(new SignalNaturalDigit(1))
  22.                 .output()
  23.                 .value();
  24.         System.out.println(r);
  25.     }
  26. }
  27.  
  28. sealed interface FSMState<O extends SignalOutput> {
  29.     FSMState<?> transition(SignalInput input);
  30.  
  31.     O output();
  32. }
  33.  
  34. record StateStart() implements FSMState<SignalException> {
  35.     @Override
  36.     public State1 transition(SignalInput input) {
  37.         return new State1(new SignalNumber(0));
  38.     }
  39.  
  40.     @Override
  41.     public SignalException output() {
  42.         return new SignalException();
  43.     }
  44. }
  45.  
  46. record State1(SignalNumber number) implements FSMState<SignalNumber> {
  47.     public State1 transition(SignalDigit digit) {
  48.         final var nextNumber = number.value() * 10 + digit.digit();
  49.         return new State1(new SignalNumber(nextNumber));
  50.     }
  51.  
  52.     public State2 transition(SignalPlus plus) {
  53.         return new State2(number, new SignalNumber(0));
  54.     }
  55.  
  56.     public StateEnd transition(SignalEq eq) {
  57.         return new StateEnd(number);
  58.     }
  59.  
  60.     @Override
  61.     public FSMState<?> transition(SignalInput input) {
  62.         return switch (input) {
  63.             case SignalDigit digit -> transition(digit);
  64.             case SignalEq eq -> transition(eq);
  65.             case SignalPlus plus -> transition(plus);
  66.         };
  67.     }
  68.  
  69.     @Override
  70.     public SignalNumber output() {
  71.         return number;
  72.     }
  73. }
  74.  
  75. record State2(SignalNumber number1, SignalNumber number2) implements FSMState<SignalException> {
  76.     public State2 transition(SignalDigit digit) {
  77.         final var nextNumber = number2.value() * 10 + digit.digit();
  78.         return new State2(number1, new SignalNumber(nextNumber));
  79.     }
  80.  
  81.     public StateEnd transition(SignalEq eq) {
  82.         final var result = number1.value() + number2.value();
  83.         return new StateEnd(new SignalNumber(result));
  84.     }
  85.  
  86.     @Override
  87.     public FSMState<?> transition(SignalInput input) {
  88.         return switch (input) {
  89.             case SignalDigit digit -> transition(digit);
  90.             case SignalEq eq -> transition(eq);
  91.             case SignalPlus _ -> this;
  92.         };
  93.     }
  94.  
  95.     @Override
  96.     public SignalException output() {
  97.         return new SignalException();
  98.     }
  99. }
  100.  
  101. record StateEnd(SignalNumber number) implements FSMState<SignalNumber> {
  102.  
  103.     @Override
  104.     public StateEnd transition(SignalInput input) {
  105.         return this;
  106.     }
  107.  
  108.     @Override
  109.     public SignalNumber output() {
  110.         return number;
  111.     }
  112. }
  113.  
  114. record SignalEq() implements SignalOperator {
  115. }
  116.  
  117. record SignalPlus() implements SignalOperator {
  118. }
  119.  
  120. sealed interface SignalOperator extends SignalInput {
  121. }
  122.  
  123. sealed interface SignalOutput extends Signal {
  124. }
  125.  
  126. final class SignalException implements SignalOutput {
  127. }
  128.  
  129. record SignalNumber(int value) implements SignalOutput {
  130.  
  131. }
  132.  
  133. sealed interface SignalInput extends Signal {
  134. }
  135.  
  136. sealed abstract class SignalDigit implements SignalInput {
  137.     private final int digit;
  138.  
  139.     public int digit() {
  140.         return digit;
  141.     }
  142.  
  143.     public SignalDigit(int digit) {
  144.         if (digit > 10 || digit < 0) throw new IllegalArgumentException();
  145.         this.digit = digit;
  146.     }
  147. }
  148.  
  149. final class SignalNaturalDigit extends SignalDigit {
  150.     public SignalNaturalDigit(int digit) {
  151.         super(digit);
  152.         if (digit > 10 || digit <= 0) throw new IllegalArgumentException();
  153.     }
  154. }
  155.  
  156. final class SignalZeroDigit extends SignalDigit {
  157.     public SignalZeroDigit() {
  158.         super(0);
  159.     }
  160. }
  161.  
  162. interface Signal {
  163. }
  164.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement