KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > jga > fn > UnaryFunctor


1 // ============================================================================
2
// $Id: UnaryFunctor.java,v 1.16 2006/11/30 05:03:42 davidahall Exp $
3
// Copyright (c) 2002-2005 David A. Hall
4
// ============================================================================
5
// The contents of this file are subject to the Common Development and
6
// Distribution License (CDDL), Version 1.0 (the License); you may not use this
7
// file except in compliance with the License. You should have received a copy
8
// of the the License along with this file: if not, a copy of the License is
9
// available from Sun Microsystems, Inc.
10
//
11
// http://www.sun.com/cddl/cddl.html
12
//
13
// From time to time, the license steward (initially Sun Microsystems, Inc.) may
14
// publish revised and/or new versions of the License. You may not use,
15
// distribute, or otherwise make this file available under subsequent versions
16
// of the License.
17
//
18
// Alternatively, the contents of this file may be used under the terms of the
19
// GNU Lesser General Public License Version 2.1 or later (the "LGPL"), in which
20
// case the provisions of the LGPL are applicable instead of those above. If you
21
// wish to allow use of your version of this file only under the terms of the
22
// LGPL, and not to allow others to use your version of this file under the
23
// terms of the CDDL, indicate your decision by deleting the provisions above
24
// and replace them with the notice and other provisions required by the LGPL.
25
// If you do not delete the provisions above, a recipient may use your version
26
// of this file under the terms of either the CDDL or the LGPL.
27
//
28
// This library is distributed in the hope that it will be useful,
29
// but WITHOUT ANY WARRANTY; without even the implied warranty of
30
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
31
// ============================================================================
32

33 package net.sf.jga.fn;
34
35 import java.io.Serializable JavaDoc;
36 import net.sf.jga.fn.adaptor.Bind;
37 import net.sf.jga.fn.adaptor.ChainBinary;
38 import net.sf.jga.fn.adaptor.ChainUnary;
39 import net.sf.jga.fn.adaptor.Generate;
40 import net.sf.jga.fn.adaptor.Identity;
41
42 /**
43  * A Function Object that takes one argument and returns a result. The
44  * argument is of type <code>T</code>, and the result is of type <code>R</code>.
45  * <p>
46  * Copyright &copy; 2002-2005 David A. Hall
47  *
48  * @author <a HREF="mailto:davidahall@users.sourceforge.net">David A. Hall</a>
49  **/

50
51 abstract public class UnaryFunctor<T, R> extends Functor<R> implements Serializable JavaDoc, Visitable {
52     /**
53      * Executes the function and returns the result.
54      */

55     abstract public R fn(T arg);
56
57     /**
58      * FactoryMethod that creates a UnaryFunctor that passes its argument to
59      * the given functor, and uses the result as the argument to this
60      * function. Given argument <b>x</b>, the new functor will return
61      * <code>fn<sub>this</sub>(f(x)))</code>
62      */

63     public <F> UnaryFunctor<F,R> compose(UnaryFunctor<F,T> f) {
64         return new ChainUnary<F,T,R>(this,f);
65     }
66
67     /**
68      * FactoryMethod that creates a BinaryFunctor that passes its arguments to
69      * the given functor, and uses the result as the argument to this
70      * function. Given arguments <b>x</b> and <b>y</b>, the new functor will
71      * return <code>fn<sub>this</sub>(f(x,y)))</code>
72      */

73     public <F1,F2> BinaryFunctor<F1,F2,R> compose(BinaryFunctor<F1,F2,T> f) {
74         return new ChainBinary<F1,F2,T,R>(this, f);
75     }
76
77     /**
78      * FactoryMethod that creates a Generator to create the argument to this
79      * function. The new functor will return
80      * <code>fn<sub>this</sub>(gen())</code>.
81      */

82
83     public Generator<R> generate(Generator<T> gen) {
84         return new Generate<T,R>(this, gen);
85     }
86     
87     /**
88      * FactoryMethod that binds the argument arguments to this function to a specific
89      * value. The new functor will return
90      * <code>fn<sub>this</sub>(val)</code>.
91      */

92
93     public Generator<R> bind(T val) {
94         return new Bind<T,R>(val, this);
95     }
96     
97     // -----------------
98
// Functor interface
99
// -----------------
100

101     /**
102      * Executes the function and returns the result.
103      */

104     public R eval(Object JavaDoc... args) {
105         // @SuppressWarnings
106
// This generates an unchecked cast warning: we're crossing the line from
107
// unsafe rawform code to typesafe generic code. This interface is known
108
// to be unsafe, and documented to the user as such.
109
return fn((T) args[0]);
110     }
111
112     // -------------------
113
// Visitable interface
114
// -------------------
115

116     /**
117      * No-op implementation of Visitable interface.
118      */

119     public void accept(Visitor v) {}
120 }
121
122
Popular Tags