Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 10th, 2012  |  syntax: None  |  size: 4.48 KB  |  hits: 13  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. interface Func<A, B> {
  2.   B apply(final A arg);
  3. }
  4.  
  5. abstract class Dir<A, B> {
  6.   public Dir() {}
  7.   abstract public Func<Func<String, A>, Func<String, B>> format();
  8. }
  9.  
  10. class DLit<A> extends Dir<A, A> {
  11.   private String s;
  12.   public DLit(String s) {
  13.     this.s = s;
  14.   }
  15.   public Func<Func<String, A>, Func<String, A>> format() {
  16.     return new Func<Func<String, A>, Func<String, A>>() {
  17.       public Func<String, A> apply(final Func<String, A> cont) {
  18.         return new Func<String, A>() {
  19.           public A apply(final String out) {
  20.             return cont.apply(out + s);
  21.           }
  22.         };
  23.       }
  24.     };
  25.   }
  26. }
  27.  
  28. class DInt<A> extends Dir<A, Func<Integer, A>> {
  29.   public DInt() {}
  30.   public Func<Func<String, A>, Func<String, Func<Integer, A>>> format() {
  31.     return new Func<Func<String, A>, Func<String, Func<Integer, A>>>() {
  32.       public Func<String, Func<Integer, A>> apply(final Func<String, A> cont) {
  33.         return new Func<String, Func<Integer, A>>() {
  34.           public Func<Integer, A> apply(final String out) {
  35.             return new Func<Integer, A>() {
  36.               public A apply(Integer i) {
  37.                 return cont.apply(out + i.toString());
  38.               }
  39.             };
  40.           }
  41.         };
  42.       }
  43.     };
  44.   }
  45. }
  46.  
  47. class DStr<A> extends Dir<A, Func<String, A>> {
  48.   public DStr() {}
  49.   public Func<Func<String, A>, Func<String, Func<String, A>>> format() {
  50.     return new Func<Func<String, A>, Func<String, Func<String, A>>>() {
  51.       public Func<String, Func<String, A>> apply(final Func<String, A> cont) {
  52.         return new Func<String, Func<String, A>>() {
  53.           public Func<String, A> apply(final String out) {
  54.             return new Func<String, A>() {
  55.               public A apply(String s) {
  56.                 return cont.apply(out + s);
  57.               }
  58.             };
  59.           }
  60.         };
  61.       }
  62.     };
  63.   }
  64. }
  65.  
  66. class DCon<A, B, C, D> extends Dir<C, B> {
  67.   private Dir<A, B> d1;
  68.   private Dir<C, A> d2;
  69.   public DCon(Dir<A, B> d1, Dir<C, A> d2) {
  70.     this.d1 = d1;
  71.     this.d2 = d2;
  72.   }
  73.   public Func<Func<String, C>, Func<String, B>> format() {
  74.     return new Func<Func<String, C>, Func<String, B>>() {
  75.       public Func<String, B> apply(final Func<String, C> cont) {
  76.         return new Func<String, B>() {
  77.           public B apply(final String out) {
  78.             return d1.format().apply(d2.format().apply(cont)).apply(out);
  79.           }
  80.         };
  81.       }
  82.     };
  83.   }
  84. }
  85.  
  86. class SafeFormatter {
  87.   public static <A> A format(Dir<String, A> d) {
  88.     return d.format().apply(new Func<String, String>() {
  89.       public String apply(final String a) {
  90.         return a;
  91.       }
  92.     }).apply("");
  93.   }
  94.  
  95.   public static <A> Dir<A, A> newDLit(String s) {
  96.     return new DLit<A>(s);
  97.   }
  98.  
  99.   public static <A> Dir<A, Func<Integer, A>> newDInt() {
  100.     return new DInt<A>();
  101.   }
  102.  
  103.   public static <A> Dir<A, Func<String, A>> newDStr() {
  104.     return new DStr<A>();
  105.   }
  106.  
  107.   public static <A, B, C, D> Dir<C, B> newDCon(Dir<A, B> d1, Dir<C, A> d2) {
  108.     return new DCon<A, B, C, D>(d1, d2);
  109.   }
  110.  
  111.   public static void main(String[] args) {
  112.    
  113.     //型安全なSystem.out.printf("hello, %s!", "world")を表現している。
  114.     Dir<Func<String, String>, Func<String, String>> d1 = newDLit("hello, ");
  115.     Dir<String, Func<String, String>> d2 = newDStr();
  116.     Dir<String, String> d3 = newDLit("!");
  117.    
  118.     System.out.println(format(newDCon(newDCon(d1, d2), d3)).apply("world"));
  119.     //System.out.println(format(newDCon(newDCon(d1, d2), d3)).apply(123)); //String以外の型はコンパイルエラー
  120.  
  121.    
  122.     //型安全なSystem.out.printf("a: %d b: %d c: %d", 1, 2, 3)を表現している。
  123.     Dir<Func<Integer, Func<Integer, Func<Integer, String>>>,
  124.       Func<Integer, Func<Integer, Func<Integer, String>>>> d4 = newDLit("a: ");
  125.     Dir<Func<Integer, Func<Integer, String>>,
  126.       Func<Integer, Func<Integer, Func<Integer, String>>>> d5 = newDInt();
  127.     Dir<Func<Integer, Func<Integer, String>>,
  128.       Func<Integer, Func<Integer, String>>> d6 = newDLit(" b: ");
  129.     Dir<Func<Integer, String>,
  130.       Func<Integer, Func<Integer, String>>> d7 = newDInt();
  131.     Dir<Func<Integer, String>, Func<Integer, String>> d8 = newDLit(" c: ");
  132.     Dir<String, Func<Integer, String>> d9 = newDInt();
  133.    
  134.     System.out.println(
  135.       format(newDCon(newDCon(newDCon(newDCon(newDCon(d4, d5), d6), d7), d8), d9))
  136.       .apply(1).apply(2).apply(3)
  137.     );
  138.     //System.out.println(
  139.     //  format(newDCon(newDCon(newDCon(newDCon(newDCon(d4, d5), d6), d7), d8), d9))
  140.     //  .apply('a').apply('b').apply('c')
  141.     //); //Integer以外の型はコンパイルエラー
  142.    
  143.   }
  144. }