/*
 * @author Ranides Atterwim <ranides@gmail.com>
 * @copyright Ranides Atterwim
 * @license WTFPL
 * @url http://ranides.net/projects/assira
 */
package net.ranides.assira.reflection.mockup;

import net.ranides.assira.generic.TypeToken;
import net.ranides.assira.reflection.IClass;

/**
 *
 * @author Ranides Atterwim <ranides@gmail.com>
 */
public interface MTFunction<T> {
    
    IClass<MTFunction<MTRecord>> GENERIC = new TypeToken<MTFunction<MTRecord>>(){};
    
    IClass<MTFunction> RAW = new TypeToken<MTFunction>(){};
    
    int calculate(T action, int a, int b);
    
    class MTRecord {
        
        private final int seed;

        public MTRecord(int seed) {
            this.seed = seed;
        }
        
        public int sum(int a, int b) {
            return seed+a+b;
        }
        
        public int mul(int a, int b) {
            return seed+a*b;
        }
        
    };
    
    interface Generator {
        
        MTRecord build(int value);
        
    }
    
    interface Lame {
        
        int run(Long a, int b, int c);
        
    }
    
    interface LameLong {
        
        int run(long a, int b, int c);
        
    }
}
