prct06-TDD 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/Changelog.md +275 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +93 -0
  8. data/Guardfile +83 -0
  9. data/README.md +39 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/docs/Alimento.html +1039 -0
  14. data/docs/Changelog_md.html +280 -0
  15. data/docs/Dieta.html +272 -0
  16. data/docs/Gema.html +110 -0
  17. data/docs/Gema/Error.html +103 -0
  18. data/docs/Gemfile.html +100 -0
  19. data/docs/Gemfile_lock.html +179 -0
  20. data/docs/Guardfile.html +171 -0
  21. data/docs/ListaDobleEnlazada.html +542 -0
  22. data/docs/Object.html +117 -0
  23. data/docs/Plato.html +567 -0
  24. data/docs/Plato/CompareMode.html +117 -0
  25. data/docs/PlatoEficienciaEnergetica.html +316 -0
  26. data/docs/README_md.html +143 -0
  27. data/docs/Rakefile.html +102 -0
  28. data/docs/bin/setup.html +102 -0
  29. data/docs/created.rid +23 -0
  30. data/docs/css/fonts.css +167 -0
  31. data/docs/css/rdoc.css +590 -0
  32. data/docs/fonts/Lato-Light.ttf +0 -0
  33. data/docs/fonts/Lato-LightItalic.ttf +0 -0
  34. data/docs/fonts/Lato-Regular.ttf +0 -0
  35. data/docs/fonts/Lato-RegularItalic.ttf +0 -0
  36. data/docs/fonts/SourceCodePro-Bold.ttf +0 -0
  37. data/docs/fonts/SourceCodePro-Regular.ttf +0 -0
  38. data/docs/images/add.png +0 -0
  39. data/docs/images/arrow_up.png +0 -0
  40. data/docs/images/brick.png +0 -0
  41. data/docs/images/brick_link.png +0 -0
  42. data/docs/images/bug.png +0 -0
  43. data/docs/images/bullet_black.png +0 -0
  44. data/docs/images/bullet_toggle_minus.png +0 -0
  45. data/docs/images/bullet_toggle_plus.png +0 -0
  46. data/docs/images/date.png +0 -0
  47. data/docs/images/delete.png +0 -0
  48. data/docs/images/find.png +0 -0
  49. data/docs/images/loadingAnimation.gif +0 -0
  50. data/docs/images/macFFBgHack.png +0 -0
  51. data/docs/images/package.png +0 -0
  52. data/docs/images/page_green.png +0 -0
  53. data/docs/images/page_white_text.png +0 -0
  54. data/docs/images/page_white_width.png +0 -0
  55. data/docs/images/plugin.png +0 -0
  56. data/docs/images/ruby.png +0 -0
  57. data/docs/images/tag_blue.png +0 -0
  58. data/docs/images/tag_green.png +0 -0
  59. data/docs/images/transparent.png +0 -0
  60. data/docs/images/wrench.png +0 -0
  61. data/docs/images/wrench_orange.png +0 -0
  62. data/docs/images/zoom.png +0 -0
  63. data/docs/index.html +123 -0
  64. data/docs/js/darkfish.js +161 -0
  65. data/docs/js/jquery.js +4 -0
  66. data/docs/js/navigation.js +141 -0
  67. data/docs/js/navigation.js.gz +0 -0
  68. data/docs/js/search.js +109 -0
  69. data/docs/js/search_index.js +1 -0
  70. data/docs/js/search_index.js.gz +0 -0
  71. data/docs/js/searcher.js +229 -0
  72. data/docs/js/searcher.js.gz +0 -0
  73. data/docs/prct06-TDD_gemspec.html +134 -0
  74. data/docs/table_of_contents.html +381 -0
  75. data/lib/Alimento.rb +205 -0
  76. data/lib/Dieta.rb +28 -0
  77. data/lib/Menu.rb +61 -0
  78. data/lib/Plato.rb +138 -0
  79. data/lib/Plato.rb.save +110 -0
  80. data/lib/PlatoEficienciaEnergetica.rb +32 -0
  81. data/lib/gema.rb +12 -0
  82. data/lib/gema/ListaDobleEnlazada.rb +103 -0
  83. data/lib/gema/version.rb +3 -0
  84. data/prct06-TDD.gemspec +37 -0
  85. metadata +214 -0
data/lib/Dieta.rb ADDED
@@ -0,0 +1,28 @@
1
+ require 'gema'
2
+
3
+ class Dieta < ListaDobleEnlazada
4
+
5
+ @@alimentos = Alimento.constructHashFromFile(%W{Carne\sde\svaca 21.1 0.0 3.1 50.0 164.0 Carne\sde\scordero 18.0 0.0 17.0 20.0 185.0 Camarones\s(piscifactoría) 17.6 1.5 0.6 18.0 2.0 Chocolate 5.3 47.0 30.0 2.3 3.4 Salmón\s(piscifactoría) 19.9 0.0 13.6 6.0 3.7 Cerdo 21.5 0.0 6.3 7.6 11.0 Pollo 20.6 0.0 5.6 5.7 7.1 Queso 25.0 1.3 33.0 11.0 41.0 Cerveza 0.5 3.6 0.0 0.24 0.22 Leche\sde\svaca 3.3 4.8 3.2 3.2 8.9 Huevos 13.0 1.1 11.0 4.2 5.7 Café 0.1 0.0 0.0 0.4 0.3 Tofu 8.0 1.9 4.8 2.0 2.2 Lentejas 23.5 52.0 1.4 0.4 3.4 Nuez 20.0 21.0 54.0 0.3 7.9})
6
+ def Dieta.alimentos
7
+ return @@alimentos
8
+ end
9
+
10
+
11
+ def emisiones
12
+ result = 0
13
+ self.each(){|value| result+= value.gei }
14
+ return result
15
+ end
16
+
17
+ def terreno
18
+ result = 0
19
+ self.each(){|value| result+= value.terreno }
20
+ return result
21
+
22
+ end
23
+
24
+ def calculoEmisiones(dias)
25
+ return emisiones()*dias
26
+ end
27
+
28
+ end
data/lib/Menu.rb ADDED
@@ -0,0 +1,61 @@
1
+ require 'gema'
2
+
3
+ class Menu < ListaDobleEnlazada
4
+
5
+ attr_accessor :precio
6
+ attr_reader :nombre, :descripcion
7
+
8
+ def initialize(nombre, &block)
9
+ @nombre = nombre
10
+ @descripcion = ""
11
+ @precio = 0.0
12
+
13
+ super()
14
+
15
+ if block_given?
16
+ if block.arity == 1
17
+ yield self
18
+ else
19
+ instance_eval(&block)
20
+ end
21
+ end
22
+ end
23
+
24
+ #Función de llamada para DSL
25
+ #Formato:
26
+ # {
27
+ # :descripcion => <"Descripcion del plato">,
28
+ # :precio => <"Precio total del plato">
29
+ # :alimento => [
30
+ # { :descripcion => <"Nombre alimento">, :proteinas => X, :carbohidratos => Y, :lipidos => Z, :gei => A, :terreno => B, :gramos => C}
31
+ # { :descripcion => <"Nombre alimento">, :proteinas => X, :carbohidratos => Y, :lipidos => Z, :gei => A, :terreno => B, :gramos => C }
32
+ # .
33
+ # .
34
+ # .
35
+ # ]
36
+ # }
37
+ def componente( options = {} )
38
+ descripcion = options[:descripcion]
39
+ plato = Plato.new( descripcion )
40
+ plato.precio = options[:precio] ? options[:precio] : 0
41
+ options[:alimento].each{ |alimento| plato.alimento(alimento) } if options[:alimento]
42
+ self.insert(plato)
43
+ end
44
+
45
+ def descripcion(desc)
46
+ @descripcion = desc
47
+ end
48
+
49
+ def precio(precio)
50
+ @precio = precio
51
+ end
52
+
53
+ def to_s
54
+ result = "Menu '#{nombre} -> "
55
+ self.each{|plato| result += "#{plato}(#{plato.precio} €)\n, " }
56
+ result = result[0...-2]
57
+ result += ". Precio total = #{@precio} €"
58
+ return result
59
+ end
60
+ end
61
+
data/lib/Plato.rb ADDED
@@ -0,0 +1,138 @@
1
+ require 'gema'
2
+
3
+ #Esta clase describe una lista de instancias de la clase Alimento
4
+ class Plato < ListaDobleEnlazada
5
+
6
+ #Enum útil para controlar el comportamiento del metodo '<=>' (necesario para el modulo 'Comparable').
7
+ module CompareMode
8
+ ByVCT = 1 #Comparará platos según su Valor Calorico Total
9
+ ByHuellaNutricional = 2 #Comparará platos según su Huella Nutricional
10
+ end
11
+ #Flag de clase Plato que guarda el modo en el que las comparaciones entre instancias de la clase Plato se han de ejecutar
12
+ @@compareMode = CompareMode::ByVCT
13
+ #Define el modo de la comparación entre 2 instancias de la clase Plato
14
+ # @param [Integer(Enum CompareMode)] mode
15
+ def Plato.setCompareMode(mode)
16
+ @@compareMode = mode
17
+ end
18
+
19
+ include Comparable
20
+ attr_reader :peso, :totalProteinas, :porcentajeProteinas, :totalCarbohidratos, :porcentajeCarbohidratos, :totalLipidos, :porcentajeLipidos, :totalVCT
21
+ attr_accessor :nombre, :precio
22
+
23
+ #Devuelve la media de las huellasNutricionales de todos los alimentos del plato
24
+ def huellaNutricional()
25
+ return @huellaNutricional/self.size()
26
+ end
27
+
28
+ def initialize(nombre, &block)
29
+ super()
30
+ #Nombre del plato
31
+ @nombre = nombre
32
+ #Peso (en kg) del plato
33
+ @peso = 0
34
+ #Proteinas (en g) del plato
35
+ @totalProteinas = 0
36
+ #Porcentaje de proteinas respecto al total(carbohidratos + proteinas + lipidos)
37
+ @porcentajeProteinas = 0
38
+ #Carbohidratos (en g) del plato
39
+ @totalCarbohidratos = 0
40
+ #Carbohidratos de proteinas respecto al total(carbohidratos + proteinas + lipidos)
41
+ @porcentajeCarbohidratos = 0
42
+ #Lípidos (en g) del plato
43
+ @totalLipidos = 0
44
+ #Porcentaje de lipidos respecto al total(carbohidratos + proteinas + lipidos)
45
+ @porcentajeLipidos = 0
46
+ #El valor calorico (en kcal) total del plato (de la suma del valor calorico de todos los alimentos del plato)
47
+ @totalVCT = 0
48
+ #Impacto del plato en relación a las kcal y los kgCO2 que emiten los alimentos del plato.
49
+ @huellaNutricional = 0
50
+
51
+ @precio = 0.0
52
+
53
+ if block_given?
54
+ if block.arity == 1
55
+ yield self
56
+ else
57
+ instance_eval(&block)
58
+ end
59
+ end
60
+ end
61
+
62
+ #Funcion adhoc para soporte DSL
63
+ #Formato:
64
+ # { :descripcion => <"Nombre alimento">, :proteinas => X, :carbohidratos => Y, :lipidos => Z, :gei => A, :terreno => B, :gramos => C }
65
+ def alimento(options = {} )
66
+ nombre = options[:descripcion] ? "#{options[:descripcion]}" : 'Sin nombre'
67
+ proteinas = options[:proteinas] ? options[:proteinas] : 0.1
68
+ carbohidratos = options[:carbohidratos] ? options[:carbohidratos] : 0.1
69
+ lipidos = options[:lipidos] ? options[:lipidos] : 0.1
70
+ gei = options[:gei] ? options[:gei] : 0.1
71
+ terreno = options[:terreno] ? options[:terreno] : 0.1
72
+ cantidad = options[:gramos] ? options[:gramos].to_f/1000.0 : 1
73
+
74
+ result = Alimento.new(nombre,proteinas,carbohidratos,lipidos,gei,terreno,cantidad)
75
+ self.insert(result)
76
+ end
77
+
78
+ #Define el comportamiento de la clase Plato en el momento en el que un nuevo alimento es insertado
79
+ #Sobreescribe el metodo 'inserted(value)' definido en la clase padre 'ListaDobleEnlazada' y es
80
+ # llamado inertamente cada vez que se llama al metodo 'insert' en clase padre 'ListaDobleEnlazada'
81
+ # @param [Alimento] value El alimento que acaba de ser insertado
82
+ def inserted(value)
83
+ #method(:insert).super_method.call(value) #Llama al metodo insert de padre
84
+
85
+ alimento = value
86
+ if( value.instance_of? Node) then alimento = value.value end
87
+ @peso += alimento.cantidad*100 #Representado en g
88
+ @totalProteinas += alimento.proteinas
89
+ @totalCarbohidratos += alimento.carbohidratos
90
+ @totalLipidos += alimento.lipidos
91
+ @totalVCT += alimento.valorEnergetico
92
+ totalNutrientes = @totalProteinas + @totalCarbohidratos + @totalLipidos
93
+ @porcentajeProteinas = @totalProteinas / totalNutrientes * 100
94
+ @porcentajeCarbohidratos = @totalCarbohidratos / totalNutrientes * 100
95
+ @porcentajeLipidos = @totalLipidos / totalNutrientes * 100
96
+ @huellaNutricional += alimento.huellaNutricional
97
+
98
+ end
99
+
100
+ #Define el comportamiento de la clase Plato en el momento en el que un alimento es eliminado de su lista inserta
101
+ #Sobreescribe el metodo 'extracted(nodo)' definido en la clase padre 'ListaDobleEnlazada' y es
102
+ # llamado internamente cada vez que se llama al metodo 'delete' en clase padre 'ListaDobleEnlazada'
103
+ # @param [Alimento] nodo El alimento que acaba de ser eliminado de la lista
104
+ def extracted(nodo)
105
+ alimento = nodo
106
+ if( value.instance_of? Node) then alimento = value.value end
107
+ @peso -= alimento.cantidad*100 #Representado en g
108
+ @totalProteinas -= alimento.proteinas
109
+ @totalCarbohidratos -= alimento.carbohidratos
110
+ @totalLipidos -= alimento.lipidos
111
+ @totalVCT -= alimento.valorEnergetico
112
+ totalNutrientes = @totalProteinas + @totalCarbohidratos + @totalLipidos
113
+ @porcentajeProteinas = @totalProteinas / totalNutrientes * 100
114
+ @porcentajeCarbohidratos = @totalCarbohidratos / totalNutrientes * 100
115
+ @porcentajeLipidos = @totalLipidos / totalNutrientes * 100
116
+ @huellaNutricional -= alimento.huellaNutricional
117
+ end
118
+
119
+ #Devuelve el objeto Plato formateado en un string endentible para un ser humano
120
+ def to_s
121
+
122
+ result = "#{self.nombre} : "
123
+ self.each{|alimento| result += "#{alimento.nombre}(#{alimento.cantidad*1000} g), " } if self.size > 0
124
+ result = result[0...-2]
125
+ result += ". #{@porcentajeProteinas.round(2)}% Proteinas, #{@porcentajeCarbohidratos.round(2)}% Carbohidratos, #{@porcentajeLipidos.round(2)}% Lipidos, #{@totalVCT.round(2)} kcal"
126
+ return result
127
+ end
128
+
129
+ #Implementación del metodo 'Comparable::<=>' para implementación con clase Plato
130
+ def <=>(other)
131
+ return nil unless other.instance_of? Plato
132
+ if(@@compareMode == CompareMode::ByVCT) then
133
+ @totalVCT <=> other.totalVCT
134
+ else
135
+ self.huellaNutricional <=> other.huellaNutricional
136
+ end
137
+ end
138
+ end
data/lib/Plato.rb.save ADDED
@@ -0,0 +1,110 @@
1
+ require 'gema'
2
+
3
+ #Esta clase describe una lista de instancias de la clase Alimento
4
+ class Plato < ListaDobleEnlazada
5
+
6
+ #Enum útil para controlar el comportamiento del metodo '<=>' (necesario para el modulo 'Comparable').
7
+ module CompareMode
8
+ ByVCT = 1 #Comparará platos según su Valor Calorico Total
9
+ ByHuellaNutricional = 2 #Comparará platos según su Huella Nutricional
10
+ end
11
+ #Flag de clase Plato que guarda el modo en el que las comparaciones entre instancias de la clase Plato se han de ejecutar
12
+ @@compareMode = CompareMode::ByVCT
13
+ #Define el modo de la comparación entre 2 instancias de la clase Plato
14
+ # @param [Integer(Enum CompareMode)] mode
15
+ def Plato.setCompareMode(mode)
16
+ @@compareMode = mode
17
+ end
18
+
19
+ include Comparable
20
+ attr_reader :nombre
21
+ :peso, :totalProteinas, :porcentajeProteinas, :totalCarbohidratos, :porcentajeCarbohidratos, :totalLipidos, :porcentajeLipidos, :totalVCT
22
+ #Nombre del plato, Peso (en kg) del plato,
23
+ #Devuelve la media de las huellasNutricionales de todos los alimentos del plato
24
+ def huellaNutricional()
25
+ return @huellaNutricional/self.size()
26
+ end
27
+
28
+ def initialize(nombre)
29
+ super()
30
+
31
+ @nombre = nombre
32
+ @peso = 0
33
+ #Proteinas (en g) del plato
34
+ @totalProteinas = 0
35
+ #Porcentaje de proteinas respecto al total(carbohidratos + proteinas + lipidos)
36
+ @porcentajeProteinas = 0
37
+ #Carbohidratos (en g) del plato
38
+ @totalCarbohidratos = 0
39
+ #Carbohidratos de proteinas respecto al total(carbohidratos + proteinas + lipidos)
40
+ @porcentajeCarbohidratos = 0
41
+ #Lípidos (en g) del plato
42
+ @totalLipidos = 0
43
+ #Porcentaje de lipidos respecto al total(carbohidratos + proteinas + lipidos)
44
+ @porcentajeLipidos = 0
45
+ #El valor calorico (en kcal) total del plato (de la suma del valor calorico de todos los alimentos del plato)
46
+ @totalVCT = 0
47
+ #Impacto del plato en relación a las kcal y los kgCO2 que emiten los alimentos del plato.
48
+ @huellaNutricional = 0
49
+ end
50
+
51
+ #Define el comportamiento de la clase Plato en el momento en el que un nuevo alimento es insertado
52
+ #Sobreescribe el metodo 'inserted(value)' definido en la clase padre 'ListaDobleEnlazada' y es
53
+ # llamado inertamente cada vez que se llama al metodo 'insert' en clase padre 'ListaDobleEnlazada'
54
+ # @param [Alimento] value El alimento que acaba de ser insertado
55
+ def inserted(value)
56
+ #method(:insert).super_method.call(value) #Llama al metodo insert de padre
57
+
58
+ alimento = value
59
+ if( value.instance_of? Node) then alimento = value.value end
60
+ @peso += alimento.cantidad*100 #Representado en g
61
+ @totalProteinas += alimento.proteinas
62
+ @totalCarbohidratos += alimento.carbohidratos
63
+ @totalLipidos += alimento.lipidos
64
+ @totalVCT += alimento.valorEnergetico
65
+ totalNutrientes = @totalProteinas + @totalCarbohidratos + @totalLipidos
66
+ @porcentajeProteinas = @totalProteinas / totalNutrientes * 100
67
+ @porcentajeCarbohidratos = @totalCarbohidratos / totalNutrientes * 100
68
+ @porcentajeLipidos = @totalLipidos / totalNutrientes * 100
69
+ @huellaNutricional += alimento.huellaNutricional
70
+
71
+ end
72
+
73
+ #Define el comportamiento de la clase Plato en el momento en el que un alimento es eliminado de su lista inserta
74
+ #Sobreescribe el metodo 'extracted(nodo)' definido en la clase padre 'ListaDobleEnlazada' y es
75
+ # llamado internamente cada vez que se llama al metodo 'delete' en clase padre 'ListaDobleEnlazada'
76
+ # @param [Alimento] nodo El alimento que acaba de ser eliminado de la lista
77
+ def extracted(nodo)
78
+ alimento = nodo
79
+ if( value.instance_of? Node) then alimento = value.value end
80
+ @peso -= alimento.cantidad*100 #Representado en g
81
+ @totalProteinas -= alimento.proteinas
82
+ @totalCarbohidratos -= alimento.carbohidratos
83
+ @totalLipidos -= alimento.lipidos
84
+ @totalVCT -= alimento.valorEnergetico
85
+ totalNutrientes = @totalProteinas + @totalCarbohidratos + @totalLipidos
86
+ @porcentajeProteinas = @totalProteinas / totalNutrientes * 100
87
+ @porcentajeCarbohidratos = @totalCarbohidratos / totalNutrientes * 100
88
+ @porcentajeLipidos = @totalLipidos / totalNutrientes * 100
89
+ @huellaNutricional -= alimento.huellaNutricional
90
+ end
91
+
92
+ #Devuelve el objeto Plato formateado en un string endentible para un ser humano
93
+ def to_s
94
+ result = ""
95
+ self.each{|alimento| result += "#{alimento.nombre}(#{alimento.cantidad*100} g), " }
96
+ result = result[0...-2]
97
+ result += ". #{@porcentajeProteinas.round(2)}% Proteinas, #{@porcentajeCarbohidratos.round(2)}% Carbohidratos, #{@porcentajeLipidos.round(2)}% Lipidos, #{@totalVCT.round(2)} kcal"
98
+ return result
99
+ end
100
+
101
+ #Implementación del metodo 'Comparable::<=>' para implementación con clase Plato
102
+ def <=>(other)
103
+ return nil unless other.instance_of? Plato
104
+ if(@@compareMode == CompareMode::ByVCT) then
105
+ @totalVCT <=> other.totalVCT
106
+ else
107
+ self.huellaNutricional <=> other.huellaNutricional
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,32 @@
1
+ require 'gema'
2
+
3
+ class PlatoEficienciaEnergetica < Plato
4
+
5
+ attr_reader :totalEmisiones, :totalTerreno
6
+
7
+ def initialize(nombre)
8
+ super(nombre)
9
+ @totalEmisiones = 0
10
+ @totalTerreno = 0
11
+ end
12
+
13
+ def inserted(value)
14
+ method(:inserted).super_method.call(value) #Llama al metodo insert de padre
15
+ alimento = value
16
+ if(value.instance_of? Node) then alimento = value.value end
17
+ @totalEmisiones += alimento.gei
18
+ @totalTerreno += alimento.terreno
19
+ end
20
+
21
+ def extracted(value)
22
+ method(:extracted).super_method.call(value) #Llama al metodo insert de padre
23
+ alimento = value
24
+ if(value.instance_of? Node) then alimento = value.value end
25
+ @totalEmisiones -= alimento.gei
26
+ @totalTerreno -= alimento.terreno
27
+ end
28
+
29
+ def to_s
30
+ return method(:to_s).super_method.call + " . #{@totalEmisiones} kgCO2, #{@totalTerreno} m^2"
31
+ end
32
+ end
data/lib/gema.rb ADDED
@@ -0,0 +1,12 @@
1
+ require "gema/version"
2
+ require "gema/ListaDobleEnlazada"
3
+ require "Alimento"
4
+ require 'Plato'
5
+ require 'PlatoEficienciaEnergetica'
6
+ require 'Dieta'
7
+ require 'Menu'
8
+
9
+ module Gema
10
+ class Error < StandardError; end
11
+ # Your code goes here...
12
+ end
@@ -0,0 +1,103 @@
1
+ #module Gema
2
+ Node = Struct.new(:value, :next, :prev)
3
+
4
+ class ListaDobleEnlazada
5
+ include Enumerable
6
+ attr_reader :size, :head, :tail
7
+
8
+ def initialize()
9
+ @size = 0
10
+ @head = nil
11
+ @tail = nil
12
+ end
13
+
14
+ #Metodo usado para insertar una lista de elementos en el objeto listaDobleEnlazada
15
+ # @param [List] nodos Lista de elementos a insertar
16
+ def insertList(*nodos)
17
+ nodos.each do |nodo|
18
+ self.insert(nodo)
19
+ end
20
+ end
21
+
22
+ #Inserta un elemento en la lista del objeto listaDobleEnlazada
23
+ # @param [Object] nodo Elemento a insertar
24
+ def insert(nodo)
25
+ @size = @size + 1
26
+ if !(nodo.instance_of? Node) then
27
+ nodo = Node.new(nodo,nil,nil)
28
+ end
29
+ if (@head == nil) then
30
+ @head = nodo
31
+ end
32
+ if(@tail == nil) then
33
+ @tail = nodo
34
+ else
35
+ @tail.next = nodo
36
+ nodo.prev = @tail
37
+ @tail = nodo
38
+ end
39
+ inserted(nodo)
40
+ end
41
+
42
+ #PlaceHolder de metodo-evento para ser sobreescrito en clases hijas
43
+ #Este metodo se llama cada vez que un elemento es insertado con exito
44
+ # @param [Object] nodo Elemento insertado
45
+ def inserted(nodo)
46
+ end
47
+
48
+ #Retorna la cola de la lista del objeto ListaDobleEnlazada y la elimina de esta.
49
+ def extract_tail()
50
+ nodo = @tail
51
+ @tail = @tail.prev
52
+ @tail.next = nil
53
+ extracted(nodo)
54
+ return nodo
55
+ end
56
+
57
+ #Retorna la cabeza de la lista del objeto ListaDobleEnlazada y la elimina de esta.
58
+ def extract_head()
59
+ nodo = @head
60
+ @head = @head.next
61
+ @head.prev = nil
62
+ extracted(nodo)
63
+ return nodo
64
+ end
65
+
66
+ #Placeholder de metodo-evento para ser sobreescrito en clases hijas
67
+ #Este metodo se llama cada vez que un elemento es extraido con exito
68
+ # param [Object] nodo Elemento extraido
69
+ def extracted(nodo)
70
+ end
71
+
72
+ def to_s()
73
+ result = ""
74
+ self.each{|value| result += "-> " + value.to_s() + " <" }
75
+ result += '-'
76
+ return result
77
+ end
78
+
79
+ #Metodo de 'Enumerable' implementado para que sea capaz de trabajar con objetos de tipo LsitaDobleEnlazada
80
+ # @param [Clausure] Bloque_Aridad1 Recibe un bloque que espera como argumento cada elemento de la lista
81
+ def each
82
+ nodo = @head
83
+ loop do
84
+ yield nodo.value
85
+ nodo = nodo.next
86
+ break if(nodo == nil)
87
+ end
88
+ end
89
+
90
+ #Retorna el valor situado en la posición <index> del objeto tipo ListaDobleEnlazada
91
+ # @param [Integer] index Indice de la posición del elemento que queremos recoger
92
+ def [](index)
93
+ result = nil
94
+ count = 0
95
+ return self.each_with_index do |value,index_r|
96
+ if(index_r == index) then
97
+ return value
98
+ end
99
+ end
100
+ end
101
+ end
102
+ #end
103
+