ruby_list_comprehension 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ruby_list_comprehension.rb +44 -25
  3. metadata +9 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 285f60718ee15989662d414d565271cc4896a6483d7e4f29ce012865c6c47765
4
- data.tar.gz: 7877b0a0841e4adf341958b6d4813813e0e81fe3b85d518542cef81892764bc3
3
+ metadata.gz: 92a6a05f9854d7424aa30297fddcdcf38a41d8907158ce1ea307e0b67e9c5a46
4
+ data.tar.gz: ef703fa9300a220a78d384809edd66b6084446f5ce63d438f90ee6e437528bfa
5
5
  SHA512:
6
- metadata.gz: 1b77cea73e37cc0bafcae40386e4533a2bc1336ba63c5c17e724640b05ed0b719c621f6c24c2dfecd306898d47c17d3255a783836c977aa7e58adce9f0a317a4
7
- data.tar.gz: 863ad420a05d1d0fb894912d4da0b593927d03274734ecff3ac45935e32a8859cd6f0d66d3f0f2f757b7406b25385246c42862ed1d625d4ccfc450eae8aec759
6
+ metadata.gz: 958de729eb7b43f1c9c143bb21a7b70050c6ebf547ccce53db30046f9425e87603fb321a198e553f1da182cb28557e7039fb0db5e6bebd7c1a80fa2587828571
7
+ data.tar.gz: da4861c121ba2782023036b2c4c232ee5258273b6ba7d9e29b6a6e3d2f5c41e60480b27e7e97886527aa82eef62ccd64a71267fbb24f507ce67d15b9a0fcfa68
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
- require 'benchmark'
2
+
3
3
  class ListComprehension
4
4
  attr_accessor :cache, :caching
5
- attr_reader :c, :version
5
+ attr_reader :c, :version, :op
6
6
 
7
7
  def [](*args)
8
8
  c[*args]
@@ -10,70 +10,89 @@ class ListComprehension
10
10
 
11
11
  def initialize
12
12
  @cache = {}
13
+ @op = nil
13
14
  @caching = true
14
15
  @version = RUBY_VERSION
15
- @c = ->x {
16
- raise 'please use "x" as block parameter name for now' if x[3..5] != ' x '
17
- # save a pristine copy of call for caching
18
- y = x[0..-1]
19
- # check for cached results
16
+ @c = lambda { |x| # check for cached results
17
+
20
18
  return @cache[x] if @caching && @cache[x]
21
- # check for empty call
22
- return [] if x.empty? || x == "" || x.nil?
23
- # required length of keywords and spaces is 10
19
+ # p "cached: #{@cache[arr].to_s}" if @cache[arr]
20
+
21
+ y = x[0..-1] # copy of original call
22
+ z = y[0..-1] # copy of original call
23
+ return [] if x.empty? || x == '' || x.nil? || eval(z[3]) == '[]'
24
24
  raise 'syntax error in list comprehension' if x.length < 10
25
+
26
+ raise 'please use "x" as block parameter name for now' if x[3..5] != ' x '
27
+
25
28
  arr = x.split
26
- # check for semicolon instead of do, for now I replace back to do for simplicity :()
29
+
30
+ # check for semicolon instead of do, for now I replace to do
27
31
  if arr[3][-1] == ';' || arr[4][0] == ';' || arr[5][0] == ';' && !arr.include?('do')
28
32
  arr = x.to_s.sub(';', ' do ').split
29
33
  end
30
34
 
31
- # pre-eval to check for invalid syntax, hash as iterable, etc.
35
+ # pre-eval to check for invalid syntax
32
36
  begin
33
37
  res = instance_eval(x)
34
38
  return [] if res.nil?
35
- raise 'iterable can only be range, set, or array, not hash objects' if res.is_a? Hash
36
39
  rescue SyntaxError => se
37
- raise 'incorrect syntax for list comprehension' + se.to_s
40
+ raise 'incorrect syntax for list comprehension' + "\n" + se.to_s
38
41
  end
39
- # raise 'iterable can only be range, set, or array, not hash objects' if eval(x).is_a? Hash
40
-
41
42
 
43
+ # check for hash to parse csv's
42
44
  iterable = arr[3]
45
+ mdata = y[3...y.rindex('do')].match(/{.+[=>:].+}/)
46
+
47
+ if !mdata.nil?
48
+ if instance_eval(mdata[0]).is_a? Hash
49
+ iterable = mdata[0]
50
+ end
51
+ end
52
+
43
53
  if_condition = arr.include?('if') ? arr[arr.index('if') + 1...-1] : ['true']
44
54
  map_condition = arr[arr.index('do') + 1...(arr.index('if') || arr.index('end'))]
45
- if (map_condition == [arr[1]]) && (if_condition == ['true'] || if_condition == true)
46
- # p "no method needed"
47
- res = instance_eval(arr[3])
55
+
56
+ if (map_condition == [arr[1]]) && (if_condition == ['true'])
57
+ @op = "each"
58
+ res = instance_eval(iterable)
48
59
  return res.is_a?(Array) ? res : [res]
49
60
  end
50
- self.class.send(:define_method,'lc') do |arr|
51
- if map_condition == [arr[1]]
52
- # p 'filter'
61
+
62
+ # define a method to handle the transformation to list_comp
63
+ self.class.send(:define_method, 'lc') do |arr|
64
+ if map_condition.include?(arr[1])
65
+ @op = 'filter'
53
66
  return instance_eval(iterable).filter do |x|
54
67
  instance_eval(if_condition.join(' '))
55
68
  end
56
69
  end
57
70
 
58
- if if_condition == ['true'] || if_condition == true
59
- # p 'map'
71
+ if if_condition.include?('true' || 'x') || if_condition
72
+ @op = 'map'
60
73
  return instance_eval(iterable).map do |x|
61
74
  instance_eval(map_condition.join(' '))
62
75
  end
63
76
  end
77
+
64
78
  # check Ruby Version stored in @version
65
79
  if @version >= '2.7.0'
80
+ @op = 'filter_map'
66
81
  return instance_eval(iterable).filter_map do |x|
67
82
  instance_eval(map_condition.join(' ')) if instance_eval(if_condition.join(' '))
68
83
  end
69
84
  else
85
+ @op = 'map&compact'
86
+ # p 'map&compact'
70
87
  return instance_eval(iterable).map do |x|
71
88
  instance_eval(map_condition.join(' ')) if instance_eval(if_condition.join(' '))
72
89
  end.compact!
73
90
  end
74
91
  end
75
92
  list_comp = lc(arr)
76
- list_comp = list_comp.is_a?(Array) ? list_comp : [list_comp]
93
+ unless list_comp.is_a?(Array) || list_comp.is_a?(Hash)
94
+ list_comp = [list_comp]
95
+ end
77
96
  @cache[arr] = list_comp if @caching
78
97
  list_comp == [nil] ? [] : list_comp
79
98
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_list_comprehension
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Michael
@@ -20,7 +20,14 @@ files:
20
20
  homepage: https://github.com/SammoMichael/Ruby_List_Comprehension
21
21
  licenses:
22
22
  - MIT
23
- metadata: {}
23
+ metadata:
24
+ bug_tracker_uri: https://github.com/SammoMichael/Ruby_List_Comprehension/issues
25
+ changelog_uri: https://github.com/SammoMichael/Ruby_List_Comprehension/commits/master
26
+ documentation_uri: https://github.com/SammoMichael/Ruby_List_Comprehension/blob/master/README.md
27
+ homepage_uri: https://github.com/SammoMichael/Ruby_List_Comprehension
28
+ mailing_list_uri: https://groups.example.com/bestgemever
29
+ source_code_uri: https://github.com/SammoMichael/Ruby_List_Comprehension/blob/master/lib/ruby_list_comprehension.rb
30
+ wiki_uri: https://github.com/SammoMichael/Ruby_List_Comprehension/wiki
24
31
  post_install_message:
25
32
  rdoc_options: []
26
33
  require_paths: