Task

Create a function, compose,   whose two arguments   f   and   g,   are both functions with one argument.



The result of compose is to be a function of one argument, (lets call the argument   x),   which works like applying function    f    to the result of applying function    g    to    x.



Example

 compose(f, g) (x) = f(g(x))



Reference: Function composition

Hint: In some languages, implementing compose correctly requires creating a closure.




 
bundle Default {
  class Test {
    @f : static : (Int) ~ Int;
    @g : static : (Int) ~ Int;
 
    function : Main(args : String[]) ~ Nil {
      compose := Composer(F(Int) ~ Int, G(Int) ~ Int);
      compose(13)->PrintLine();
    }
 
    function : F(a : Int) ~ Int {
      return a + 14;
    }
 
    function : G(a : Int) ~ Int {
      return a + 15;
    }
 
    function : Compose(x : Int) ~ Int {
      return @f(@g(x));
    }
 
    function : Composer(f : (Int) ~ Int, g : (Int) ~ Int) ~ (Int) ~ Int {
      @f := f;
      @g := g;
      return Compose(Int) ~ Int;
    }
  }
}
 