Add st-handle.h
[panda.git] / st / Fraction.st
blobccd61d275db8c9ec7b9e79f13acb39786a265848
2 Copyright (c) 2008 Vincent Geddes
3 Copyright (c) 2007-2008 Luca Bruno
5 Permission is hereby granted, free of charge, to any person obtaining a copy
6 of this software and associated documentation files (the 'Software'), to deal
7 in the Software without restriction, including without limitation the rights
8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 copies of the Software, and to permit persons to whom the Software is
10 furnished to do so, subject to the following conditions:
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
15 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
21 DEALINGS IN THE SOFTWARE.
24 "instance creation"
26 Fraction classMethod!
27 numerator: numerator denominator: denominator    
28         ^ self basicNew numerator: numerator denominator: denominator!
31 "accessing"
32 Fraction method!
33 numerator
34         ^ numerator!
36 Fraction method!
37 denominator
38         ^ denominator!
40 "arithmetic"
42 Fraction method!
43 reduce
44     | gcd |
46     numerator = 0
47                 ifTrue: [ ^ 0 ].
49     gcd := numerator gcd: denominator.
51     numerator := numerator // gcd.
52     denominator := denominator // gcd.
54     denominator = 1
55                 ifTrue: [ ^ numerator ].
56     numerator = denominator
57                 ifTrue: [ ^ 1 ].
58     ^ self!
60 Fraction method!
61 + aNumber
62     aNumber generality > self generality
63         ifTrue: [ ^ (aNumber coerce: self) + aNumber ].
65     ^ aNumber isFraction
66         ifTrue: [
67             (Fraction
68                  numerator: (numerator * aNumber denominator) + (denominator * aNumber numerator)
69                  denominator: denominator * aNumber denominator) reduce ]
70         ifFalse: [
71             (Fraction
72                  numerator: numerator + (denominator * aNumber)
73                  denominator: denominator) reduce ]!
75 Fraction method!
76 - aNumber
77     aNumber generality > self generality
78         ifTrue: [ ^ (aNumber coerce: self) - aNumber ].
80     ^ aNumber isFraction
81         ifTrue: [
82             (Fraction
83                  numerator: (numerator * aNumber denominator) - (denominator * aNumber numerator)
84                  denominator: denominator * aNumber denominator) reduce ]
85         ifFalse: [
86             (Fraction
87                  numerator: numerator - (denominator * aNumber)
88                  denominator: denominator) reduce ]!
90 Fraction method!
91 * aNumber
92     aNumber generality > self generality
93         ifTrue: [ ^(aNumber coerce: self) - aNumber ].
95     ^ aNumber isFraction
96         ifTrue: [
97             (Fraction
98                  numerator: numerator * aNumber numerator
99                  denominator: denominator * aNumber denominator) reduce ]
100         ifFalse: [
101             (Fraction
102                  numerator: numerator * aNumber
103                  denominator: denominator) reduce ]!
105 Fraction method!
106 / aNumber
107     ^ self * aNumber reciprocal!
109 Fraction method!
110 reciprocal
111     ^ Fraction numerator: denominator denominator: numerator!
113 Fraction method!
114 < aNumber
115     ^ (self compare: aNumber) < 0!
117 Fraction method!
118 > aNumber
119     ^ (self compare: aNumber) > 0!
121 Fraction method!
122 <= aNumber
123     ^ (self compare: aNumber) <= 0!
125 Fraction method!
126 >= aNumber
127     ^ (self compare: aNumber) >= 0!
129 Fraction method!
130 = aNumber
131     ^ (self compare: aNumber) = 0!
133 Fraction method!
134 ~= aNumber
135     ^ (self compare: aNumber) ~= 0!
138 "comparing"
140 Fraction method!
141 compare: aNumber
142     | a b |
143     aNumber generality > self generality
144                 ifTrue: [ ^ (aNumber coerce: self) compare: aNumber ].
146     ^ aNumber isFraction
147                 ifTrue: [ | d |
148                         d := denominator * aNumber denominator.
149                         a := d * self numerator.
150                         b := d * aNumber numerator.
151                         a compare: b ]
152                 ifFalse: [ numerator compare: denominator * aNumber ]!
154 Fraction method!
155 hash
156         ^ numerator bitXor: denominator!
158 "testing"
160 Fraction method!
161 isFraction
162         ^ true!
165 "coercing"
167 Fraction method!
168 asFraction
169         ^ self!
171 Fraction method!
172 asFloat
173     ^ numerator asFloat / denominator asFloat!
175 Fraction method!
176 generality    
177                 ^ 40!
179 Fraction method!
180 coerce: aNumber    
181         ^ Fraction numerator: aNumber asInteger
182                            denominator: 1!
185 "truncation"
187 Fraction method!
188 truncated
189         ^ numerator // denominator!
191 "printing"
193 Fraction method!
194 printOn: aStream base: anInteger
195         aStream nextPut: $(.
196         aStream nextPutAll: (numerator printStringBase: anInteger).
197         aStream nextPut: $/.
198         aStream nextPutAll: (denominator printStringBase: anInteger).
199         aStream nextPut: $)!
201 "private"
203 Fraction method!
204 numerator: numeratorInteger denominator: denominatorInteger    
205         numerator := numeratorInteger.
206         denominator := denominatorInteger!