View raw

1 " 2 I represent an exercise performed by a user. 3 " 4 Class { 5 #name : 'MFTExercise', 6 #superclass : 'MFTObject', 7 #instVars : [ 8 'englishName', 9 'frenchName', 10 'activatedMuscleGroups', 11 'equipment' 12 ], 13 #category : 'MyFitnessTracker-Core-Base', 14 #package : 'MyFitnessTracker-Core', 15 #tag : 'Base' 16 } 17 18 { #category : 'chest' } 19 MFTExercise class >> barbellBenchPress [ 20 21 ^ self newWithEnglishName 22 equipment: MFTEquipment barbell; 23 activates: MFTMuscleGroup chest 24 ] 25 26 { #category : 'compound' } 27 MFTExercise class >> barbellSquat [ 28 29 ^ self newWithEnglishName 30 activates: MFTMuscleGroup leg; 31 equipment: MFTEquipment barbell 32 ] 33 34 { #category : 'back' } 35 MFTExercise class >> bentOverBarbellRows [ 36 37 ^ self new 38 englishName: 'bent-over barbell rows'; 39 equipment: MFTEquipment barbell 40 ] 41 42 { #category : 'bicep' } 43 MFTExercise class >> bicepCurl [ 44 45 ^ self newWithEnglishName activates: MFTMuscleGroup arm 46 ] 47 48 { #category : 'back' } 49 MFTExercise class >> cableCross [ 50 51 ^ self newWithEnglishName activates: MFTMuscleGroup chest 52 ] 53 54 { #category : 'back' } 55 MFTExercise class >> cableRow [ 56 57 ^ self newWithEnglishName activates: MFTMuscleGroup back 58 ] 59 60 { #category : 'calves' } 61 MFTExercise class >> calfRaise [ 62 63 ^ self newWithEnglishName activates: MFTMuscleGroup calf 64 ] 65 66 { #category : 'back' } 67 MFTExercise class >> closeGripPalmsUpPulldown [ 68 69 ^ self new 70 englishName: 'close-grip palms-up pulldown'; 71 activates: MFTMuscleGroup back; 72 equipment: MFTEquipment cable 73 ] 74 75 { #category : 'compound' } 76 MFTExercise class >> deadlift [ 77 78 ^ self newWithEnglishName activates: MFTMuscleGroup back 79 ] 80 81 { #category : 'compound' } 82 MFTExercise class >> dip [ 83 84 ^ self newWithEnglishName 85 activates: MFTMuscleGroup chest; 86 activates: MFTMuscleGroup arm 87 ] 88 89 { #category : 'chest' } 90 MFTExercise class >> dumbbellBenchPress [ 91 92 ^ self newWithEnglishName 93 equipment: MFTEquipment dumbbell; 94 activates: MFTMuscleGroup chest 95 ] 96 97 { #category : 'chest' } 98 MFTExercise class >> dumbbellFly [ 99 100 ^ self newWithEnglishName 101 activates: MFTMuscleGroup chest; 102 equipment: MFTEquipment dumbbell 103 ] 104 105 { #category : 'compound' } 106 MFTExercise class >> gobletSquat [ 107 108 ^ self newWithEnglishName equipment: MFTEquipment dumbbell 109 ] 110 111 { #category : 'bicep' } 112 MFTExercise class >> hammerCurl [ 113 114 ^ self newWithEnglishName activates: MFTMuscleGroup arm 115 ] 116 117 { #category : 'back' } 118 MFTExercise class >> hyperextension [ 119 120 ^ self newWithEnglishName equipment: MFTEquipment dumbbell 121 ] 122 123 { #category : 'chest' } 124 MFTExercise class >> inclinePress [ 125 126 ^ self newWithEnglishName activates: MFTMuscleGroup chest 127 ] 128 129 { #category : 'back' } 130 MFTExercise class >> latPulldown [ 131 132 ^ self newWithEnglishName 133 activates: MFTMuscleGroup back; 134 equipment: MFTEquipment cable 135 ] 136 137 { #category : 'back' } 138 MFTExercise class >> latPullover [ 139 140 ^ self newWithEnglishName equipment: MFTEquipment dumbbell 141 ] 142 143 { #category : 'shoulder' } 144 MFTExercise class >> lateralRaise [ 145 146 ^ self newWithEnglishName activates: MFTMuscleGroup shoulder 147 ] 148 149 { #category : 'leg' } 150 MFTExercise class >> legExtension [ 151 152 ^ self newWithEnglishName 153 activates: MFTMuscleGroup leg; 154 equipment: MFTEquipment legExtensionMachine 155 ] 156 157 { #category : 'back' } 158 MFTExercise class >> legPress [ 159 160 ^ self newWithEnglishName 161 activates: MFTMuscleGroup leg; 162 equipment: MFTEquipment legPressMachine 163 ] 164 165 { #category : 'tricep' } 166 MFTExercise class >> lyingFrenchPress [ 167 168 ^ self newWithEnglishName 169 activates: MFTMuscleGroup arm; 170 equipment: MFTEquipment ezBar 171 ] 172 173 { #category : 'as yet unclassified' } 174 MFTExercise class >> newWithEnglishName [ 175 "I return a MFTExercise instance for which englishName is set to the calling method selector, as a space-separated string." 176 177 | exerciseNameFromSender | 178 exerciseNameFromSender := (thisContext sender selector splitCamelCase 179 collect: #asLowercase) joinUsing: 180 Character space. 181 ^ self new englishName: exerciseNameFromSender 182 ] 183 184 { #category : 'leg' } 185 MFTExercise class >> pecDeck [ 186 187 ^ self newWithEnglishName 188 activates: MFTMuscleGroup chest; 189 equipment: MFTEquipment pecDeck 190 ] 191 192 { #category : 'traps' } 193 MFTExercise class >> rearDeltFly [ 194 195 ^ self newWithEnglishName 196 activates: MFTMuscleGroup shoulder; 197 equipment: MFTEquipment pecDeck 198 ] 199 200 { #category : 'leg' } 201 MFTExercise class >> seatedLegCurl [ 202 203 ^ self newWithEnglishName 204 activates: MFTMuscleGroup leg; 205 equipment: MFTEquipment seatedLegCurlMachine 206 ] 207 208 { #category : 'shoulder' } 209 MFTExercise class >> shoulderPressDumbell [ 210 211 ^ self new 212 englishName: 'shoulder press (dumbell)'; 213 activates: MFTMuscleGroup shoulder; 214 equipment: MFTEquipment dumbbell 215 ] 216 217 { #category : 'traps' } 218 MFTExercise class >> shrug [ 219 220 ^ self newWithEnglishName 221 activates: MFTMuscleGroup back; 222 equipment: MFTEquipment dumbbell 223 ] 224 225 { #category : 'core' } 226 MFTExercise class >> sitUp [ 227 228 ^ self new 229 englishName: 'sit-up'; 230 activates: MFTMuscleGroup abdominal 231 ] 232 233 { #category : 'tricep' } 234 MFTExercise class >> tricepExtension [ 235 236 ^ self newWithEnglishName 237 activates: MFTMuscleGroup arm; 238 equipment: MFTEquipment cable 239 ] 240 241 { #category : 'chest' } 242 MFTExercise class >> tricepPressdown [ 243 244 ^ self newWithEnglishName 245 activates: MFTMuscleGroup arm; 246 equipment: MFTEquipment cable 247 ] 248 249 { #category : 'comparing' } 250 MFTExercise >> = anObject [ 251 "Answer whether the receiver and anObject represent the same object." 252 253 self == anObject ifTrue: [ ^ true ]. 254 self class = anObject class ifFalse: [ ^ false ]. 255 ^ equipment = anObject equipment and: [ 256 englishName = anObject englishName ] 257 ] 258 259 { #category : 'accessing' } 260 MFTExercise >> activates: aMFTMuscleGroup [ 261 262 activatedMuscleGroups at: aMFTMuscleGroup put: 100 263 ] 264 265 { #category : 'accessing' } 266 MFTExercise >> activates: aMFTMuscleGroup percent: aPercentage [ 267 268 activatedMuscleGroups at: aMFTMuscleGroup put: aPercentage 269 ] 270 271 { #category : 'accessing' } 272 MFTExercise >> canonicalName [ 273 274 ^ englishName 275 ] 276 277 { #category : 'accessing' } 278 MFTExercise >> englishName [ 279 280 ^ englishName 281 ] 282 283 { #category : 'accessing' } 284 MFTExercise >> englishName: aString [ 285 286 englishName := aString 287 ] 288 289 { #category : 'accessing' } 290 MFTExercise >> equipment [ 291 292 ^ equipment 293 ] 294 295 { #category : 'accessing' } 296 MFTExercise >> equipment: aMFTEquipment [ 297 298 equipment := aMFTEquipment 299 ] 300 301 { #category : 'accessing' } 302 MFTExercise >> frenchName [ 303 304 ^ frenchName 305 ] 306 307 { #category : 'accessing' } 308 MFTExercise >> frenchName: aString [ 309 310 frenchName := aString 311 ] 312 313 { #category : 'comparing' } 314 MFTExercise >> hash [ 315 "Answer an integer value that is related to the identity of the receiver." 316 317 ^ equipment hash bitXor: englishName hash 318 ] 319 320 { #category : 'initialization' } 321 MFTExercise >> initialize [ 322 323 super initialize. 324 englishName := String new. 325 frenchName := String new. 326 activatedMuscleGroups := Dictionary new 327 ] 328 329 { #category : 'accessing' } 330 MFTExercise >> mainActivatedMuscleGroups [ 331 332 | values maxValue | 333 values := activatedMuscleGroups values ifEmpty: [ ^ nil ]. 334 maxValue := values max. 335 ^ activatedMuscleGroups keys select: [ :group | 336 (activatedMuscleGroups at: group) = maxValue ] 337 ] 338