-
Notifications
You must be signed in to change notification settings - Fork 0
/
example.wlk
151 lines (117 loc) · 2.97 KB
/
example.wlk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
object mundo{
const personas = []
method transcurrirUnMes(){
calendario.pasarMes()
personas.forEach{persona => persona.cobrarSalario()}
}
method personaConMasCosas() = personas.max({persona => persona.cantidadCosas()})
}
object calendario {
var property mes = 1
method pasarMes() {
mes = mes + 1
}
}
class Persona{
const efectivo = new PagoInmediato()
const formasPago = [efectivo]
const cosas = []
const cuotas = []
var formaPreferida
var property salario
var montoParaPagarCuotas
// compras
method modificarForma(){
formaPreferida = formasPago.anyOne()
}
method comprar(cosa){
if(self.puedeComprar(cosa)){
self.pagar(cosa)
cosas.add(cosa)
}
}
method puedeComprar(cosa) = formaPreferida.puedePagar(cosa)
method pagar(cosa){
formaPreferida.pagar(cosa,self)
}
method agregarCuota(cuota){
cuotas.add(cuota)
}
// sueldo
method cobrarSalario(){
montoParaPagarCuotas = salario
self.pagarCuotas()
efectivo.aumentar(montoParaPagarCuotas)
}
method pagarCuotas(){
self.cuotasVencidas().forEach({cuota => self.pagarCuota(cuota)})
}
method cuotasVencidas() = cuotas.filter({cuota => cuota.estaVencida()})
method pagarCuota(cuota){
if (montoParaPagarCuotas > cuota.importe() ){
montoParaPagarCuotas -= cuota.importe()
cuota.pagar()
}
}
method totalDeuda() = self.cuotasVencidas().sum{cuota => cuota.importe()}
method cantidadCosas() = cosas.size()
}
class Cosa{
var property precio
method precioFinanciado() = precio * (1 + bancoCentral.tasaInteres())
}
class FormaPago {
method puedePagar(cosa) = cosa.precio() <= self.disponible()
method disponible()
}
class PagoInmediato inherits FormaPago{ // Para debito y efectivo
var property disponible = 0
method aumentar(importe) {
disponible = disponible + importe
}
method pagar(cosa,persona){
self.aumentar( -cosa.precio() )
}
}
class PagoCredito inherits FormaPago {
const banco
var cantidadCuotas
override method disponible() = banco.maximoPermitido()
method pagar(cosa,persona){
cantidadCuotas.times{ numero =>
persona.agregarCuota(
new Cuota(mes = calendario.mes() + numero, importe = cosa.precioFinanciado())
)
}
}
}
class Cuota{
const mes
const property importe
var property pagada = false
method pagar(){
pagada = true
}
method vencida() = mes <= calendario.mes() && not pagada
}
object bancoCentral{
var property tasaInteres = 0.1
}
class Banco {
var property montoMaximo
}
// Segunda parte
class CompradorCompulsivo inherits Persona{
override method puedeComprar(cosa) = formasPago.any({formaPago => formaPago.puedePagar(cosa)})
override method pagar(cosa){
formasPago.find{formaPago => formaPago.puedePagar(cosa)}.pagar(cosa,self)
}
}
class PagadorCompulsivo inherits Persona{
override method pagarCuotas(){
super()
montoParaPagarCuotas += efectivo.disponible()
efectivo.disponible(0)
super()
}
}