001    
002    package org.codehaus.groovy.runtime;
003    
004    
005    import groovy.lang.Closure;
006     
007    /**
008     * Represents wrapper around a Closure to support currying
009     * 
010     * @author Jochen Theodorou
011     */
012    public class CurriedClosure extends Closure {
013    
014        private Object[] curriedParams;
015        
016        public CurriedClosure(Closure uncurriedClosure, Object[] arguments) {
017            super(uncurriedClosure);
018            curriedParams = arguments;
019            maximumNumberOfParameters = uncurriedClosure.getMaximumNumberOfParameters()-arguments.length;
020        }
021    
022        public Object[] getUncurriedArguments(Object[] arguments) {
023            final Object newCurriedParams[] = new Object[curriedParams.length + arguments.length];
024            System.arraycopy(curriedParams, 0, newCurriedParams, 0, curriedParams.length);
025            System.arraycopy(arguments, 0, newCurriedParams, curriedParams.length, arguments.length);
026            return newCurriedParams;        
027        }
028    
029    }