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.




program AnonCompose;
 
{$APPTYPE CONSOLE}
 
type
  TFunc = reference to function(Value: Integer): Integer;
  // Alternative: TFunc = TFunc<Integer,Integer>;
 
function Compose(F, G: TFunc): TFunc;
begin
  Result:= function(Value: Integer): Integer
  begin
    Result:= F(G(Value));
  end
end;
 
var
  Func1, Func2, Func3: TFunc;
 
begin
  Func1:=
    function(Value: Integer): Integer
    begin
      Result:= Value * 2;
    end;
 
  Func2:=
    function(Value: Integer): Integer
    begin
      Result:= Value * 3;
    end;
 
  Func3:= Compose(Func1, Func2);
 
  Writeln(Func3(6));    // 36 = 6 * 3 * 2
  Readln;
end.