Advertisement
Guest User

Untitled

a guest
Feb 18th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.56 KB | None | 0 0
  1. import tester.*;
  2.  
  3. // Represents functions of signature A -> R, for some argument type A and
  4. // result type R
  5. interface IFunc<A, R> {
  6.   R apply(A input);
  7. }
  8.  
  9. interface IFunc2<A1, A2, R> {
  10.   R apply(A1 arg1, A2 arg2);
  11. }
  12.  
  13. class Sum implements IFunc2<Integer, Integer, Integer> {
  14.  
  15.   @Override
  16.   public Integer apply(Integer arg1, Integer arg2) {
  17.     return arg1 + arg2;
  18.   }
  19.  
  20. }
  21.  
  22. // generic list
  23. interface IList<T> {
  24.   // map over a list, and produce a new list with a (possibly different)
  25.   // element type
  26.   <U> IList<U> map(IFunc<T, U> f);
  27.  
  28.   <U> U foldr(IFunc2<T, U, U> f, U base);
  29.  
  30.   IList<T> add(T t);
  31.  
  32. }
  33.  
  34. // empty generic list
  35. class MtList<T> implements IList<T> {
  36.   public <U> IList<U> map(IFunc<T, U> f) {
  37.     return new MtList<U>();
  38.   }
  39.  
  40.   public IList<T> add(T t) {
  41.     return new ConsList<T>(t, this);
  42.   }
  43.  
  44.   @Override
  45.   public <U> U foldr(IFunc2<T, U, U> f, U base) {
  46.     return base;
  47.   }
  48.  
  49. }
  50.  
  51. // non-empty generic list
  52. class ConsList<T> implements IList<T> {
  53.   T first;
  54.   IList<T> rest;
  55.  
  56.   ConsList(T first, IList<T> rest) {
  57.     this.first = first;
  58.     this.rest = rest;
  59.   }
  60.  
  61.   public <U> IList<U> map(IFunc<T, U> f) {
  62.     return new ConsList<U>(f.apply(this.first), this.rest.map(f));
  63.   }
  64.  
  65.   public IList<T> add(T t) {
  66.     return new ConsList<T>(this.first, this.rest.add(t));
  67.   }
  68.  
  69.   @Override
  70.   public <U> U foldr(IFunc2<T, U, U> f, U base) {
  71.     return f.apply(this.first, this.rest.foldr(f, base));
  72.   }
  73.  
  74. }
  75.  
  76. //a json value
  77. interface JSON {
  78.   <T> T accept(JSONVisitor<T> visitor);
  79.  
  80. }
  81.  
  82. //no value
  83. class JSONBlank implements JSON {
  84.  
  85.   public <T> T accept(JSONVisitor<T> visitor) {
  86.     return visitor.visitBlank(this);
  87.   }
  88.  
  89. }
  90.  
  91. //a number
  92. class JSONNumber implements JSON {
  93.   int number;
  94.  
  95.   JSONNumber(int number) {
  96.     this.number = number;
  97.   }
  98.  
  99.   public <T> T accept(JSONVisitor<T> visitor) {
  100.     return visitor.visitNumber(this);
  101.   }
  102. }
  103.  
  104. //a boolean
  105. class JSONBool implements JSON {
  106.   boolean bool;
  107.  
  108.   JSONBool(boolean bool) {
  109.     this.bool = bool;
  110.   }
  111.  
  112.   public <T> T accept(JSONVisitor<T> visitor) {
  113.     return visitor.visitBool(this);
  114.   }
  115.  
  116. }
  117.  
  118. //a string
  119. class JSONString implements JSON {
  120.   String str;
  121.  
  122.   JSONString(String str) {
  123.     this.str = str;
  124.   }
  125.  
  126.   public <T> T accept(JSONVisitor<T> visitor) {
  127.     return visitor.visitString(this);
  128.   }
  129.  
  130. }
  131.  
  132. //a list of JSON values
  133. class JSONList implements JSON {
  134.   IList<JSON> values;
  135.  
  136.   JSONList(IList<JSON> values) {
  137.     this.values = values;
  138.   }
  139.  
  140.   public <T> T accept(JSONVisitor<T> visitor) {
  141.     return visitor.visitList(this);
  142.   }
  143.  
  144. }
  145.  
  146. interface JSONVisitor<T> extends IFunc<JSON, T> {
  147.   T visitBlank(JSONBlank blank);
  148.  
  149.   T visitNumber(JSONNumber number);
  150.  
  151.   T visitBool(JSONBool bool);
  152.  
  153.   T visitString(JSONString string);
  154.  
  155.   T visitList(JSONList list);
  156. }
  157.  
  158. class JSONToNumberVisitor implements JSONVisitor<Integer> {
  159.  
  160.   @Override
  161.   public Integer apply(JSON input) {
  162.     return input.accept(this);
  163.   }
  164.  
  165.   @Override
  166.   public Integer visitBlank(JSONBlank blank) {
  167.     return 0;
  168.   }
  169.  
  170.   @Override
  171.   public Integer visitNumber(JSONNumber number) {
  172.     return number.number;
  173.   }
  174.  
  175.   @Override
  176.   public Integer visitBool(JSONBool bool) {
  177.     return bool.bool ? 1 : 0;
  178.   }
  179.  
  180.   @Override
  181.   public Integer visitString(JSONString string) {
  182.     return string.str.length();
  183.   }
  184.  
  185.   public Integer visitList(JSONList list) {
  186.     IFunc2<Integer, Integer, Integer> sum = new Sum();
  187.     return list.values.map(this).foldr(sum, 0);
  188.   }
  189.  
  190. }
  191.  
  192. class examplesJSON {
  193.   JSON blank = new JSONBlank();
  194.   JSON number1 = new JSONNumber(1);
  195.   JSON number15 = new JSONNumber(15);
  196.   JSON boolTrue = new JSONBool(true);
  197.   JSON boolFalse = new JSONBool(false);
  198.   JSON string5 = new JSONString("abcde");
  199.   JSON string3 = new JSONString("abc");
  200.  
  201.   IList<JSON> mtJsonList = new MtList<JSON>();
  202.  
  203.   IList<JSON> littleList = mtJsonList.add(string5).add(number1).add(blank).add(boolFalse);
  204.   JSON list = new JSONList(littleList);
  205.  
  206.   IList<JSON> jsonList = mtJsonList.add(blank).add(number1).add(number15).add(boolTrue)
  207.       .add(boolFalse).add(string3).add(string5).add(list);
  208.  
  209.  
  210.  
  211.   IList<Integer> answer = new MtList<Integer>().add(0).add(1).add(15).add(1).add(0).add(3).add(5).add(6);
  212.   IList<Integer> numList = new MtList<Integer>().add(0).add(1).add(2).add(3);
  213.  
  214.  
  215.   IFunc2<Integer, Integer, Integer> sum = new Sum();
  216.  
  217.   JSONVisitor<Integer> visitor = new JSONToNumberVisitor();
  218.  
  219.   void testVisitor(Tester t) {
  220.     t.checkExpect(jsonList.map(visitor), answer);
  221.     t.checkExpect(numList.foldr(sum, 0), 6);
  222.    
  223.   }
  224.  
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement