shenanigans 1.0.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 (60) hide show
  1. data/Gemfile +5 -0
  2. data/LICENSE +7 -0
  3. data/README.rdoc +57 -0
  4. data/doc/Array.html +240 -0
  5. data/doc/Kernel.html +283 -0
  6. data/doc/Object.html +179 -0
  7. data/doc/README_rdoc.html +174 -0
  8. data/doc/created.rid +12 -0
  9. data/doc/images/add.png +0 -0
  10. data/doc/images/brick.png +0 -0
  11. data/doc/images/brick_link.png +0 -0
  12. data/doc/images/bug.png +0 -0
  13. data/doc/images/bullet_black.png +0 -0
  14. data/doc/images/bullet_toggle_minus.png +0 -0
  15. data/doc/images/bullet_toggle_plus.png +0 -0
  16. data/doc/images/date.png +0 -0
  17. data/doc/images/delete.png +0 -0
  18. data/doc/images/find.png +0 -0
  19. data/doc/images/loadingAnimation.gif +0 -0
  20. data/doc/images/macFFBgHack.png +0 -0
  21. data/doc/images/package.png +0 -0
  22. data/doc/images/page_green.png +0 -0
  23. data/doc/images/page_white_text.png +0 -0
  24. data/doc/images/page_white_width.png +0 -0
  25. data/doc/images/plugin.png +0 -0
  26. data/doc/images/ruby.png +0 -0
  27. data/doc/images/tag_blue.png +0 -0
  28. data/doc/images/tag_green.png +0 -0
  29. data/doc/images/transparent.png +0 -0
  30. data/doc/images/wrench.png +0 -0
  31. data/doc/images/wrench_orange.png +0 -0
  32. data/doc/images/zoom.png +0 -0
  33. data/doc/index.html +173 -0
  34. data/doc/js/darkfish.js +153 -0
  35. data/doc/js/jquery.js +18 -0
  36. data/doc/js/navigation.js +142 -0
  37. data/doc/js/search.js +94 -0
  38. data/doc/js/search_index.js +1 -0
  39. data/doc/js/searcher.js +228 -0
  40. data/doc/rdoc.css +543 -0
  41. data/doc/table_of_contents.html +82 -0
  42. data/lib/shenanigans/README.mdown +57 -0
  43. data/lib/shenanigans/array/random_subarray.rb +16 -0
  44. data/lib/shenanigans/array/zip_with.rb +27 -0
  45. data/lib/shenanigans/array.rb +2 -0
  46. data/lib/shenanigans/kernel/fn.rb +16 -0
  47. data/lib/shenanigans/kernel/prompt.rb +23 -0
  48. data/lib/shenanigans/kernel/with.rb +12 -0
  49. data/lib/shenanigans/kernel.rb +3 -0
  50. data/lib/shenanigans/object/identity.rb +9 -0
  51. data/lib/shenanigans/object.rb +1 -0
  52. data/lib/shenanigans/shenanigans-0.0.1.gem +0 -0
  53. data/lib/shenanigans.rb +3 -0
  54. data/test/array/test_random_subarray.rb +10 -0
  55. data/test/array/test_zip_with.rb +14 -0
  56. data/test/kernel/test_fn.rb +14 -0
  57. data/test/kernel/test_prompt.rb +27 -0
  58. data/test/kernel/test_with.rb +12 -0
  59. data/test/object/test_identity.rb +9 -0
  60. metadata +103 -0
data/doc/rdoc.css ADDED
@@ -0,0 +1,543 @@
1
+ /*
2
+ * "Darkfish" Rdoc CSS
3
+ * $Id: rdoc.css 54 2009-01-27 01:09:48Z deveiant $
4
+ *
5
+ * Author: Michael Granger <ged@FaerieMUD.org>
6
+ *
7
+ */
8
+
9
+ /* Base Green is: #6C8C22 */
10
+
11
+ * { padding: 0; margin: 0; }
12
+
13
+ body {
14
+ background: #efefef;
15
+ font: 14px "Helvetica Neue", Helvetica, Tahoma, sans-serif;
16
+ margin-left: 40px;
17
+ }
18
+ body.file-popup {
19
+ font-size: 90%;
20
+ margin-left: 0;
21
+ }
22
+
23
+ h1 {
24
+ font-size: 300%;
25
+ text-shadow: rgba(135,145,135,0.65) 2px 2px 3px;
26
+ color: #6C8C22;
27
+ }
28
+ h2,h3,h4 { margin-top: 1.5em; }
29
+
30
+ :link,
31
+ :visited {
32
+ color: #6C8C22;
33
+ text-decoration: none;
34
+ }
35
+ :link:hover,
36
+ :visited:hover {
37
+ border-bottom: 1px dotted #6C8C22;
38
+ }
39
+
40
+ pre {
41
+ background: #ddd;
42
+ padding: 0.5em 0;
43
+ }
44
+
45
+ /* @group Generic Classes */
46
+
47
+ .initially-hidden {
48
+ display: none;
49
+ }
50
+
51
+ #search-field {
52
+ width: 98%;
53
+ background: #eee;
54
+ border: none;
55
+ height: 1.5em;
56
+ -webkit-border-radius: 4px;
57
+ }
58
+ #search-field:focus {
59
+ background: #f1edba;
60
+ }
61
+ #search-field:-moz-placeholder,
62
+ #search-field::-webkit-input-placeholder {
63
+ font-weight: bold;
64
+ color: #666;
65
+ }
66
+
67
+ .missing-docs {
68
+ font-size: 120%;
69
+ background: white url(images/wrench_orange.png) no-repeat 4px center;
70
+ color: #ccc;
71
+ line-height: 2em;
72
+ border: 1px solid #d00;
73
+ opacity: 1;
74
+ padding-left: 20px;
75
+ text-indent: 24px;
76
+ letter-spacing: 3px;
77
+ font-weight: bold;
78
+ -webkit-border-radius: 5px;
79
+ -moz-border-radius: 5px;
80
+ }
81
+
82
+ .target-section {
83
+ border: 2px solid #dcce90;
84
+ border-left-width: 8px;
85
+ padding: 0 1em;
86
+ background: #fff3c2;
87
+ }
88
+
89
+ /* @end */
90
+
91
+ /* @group Index Page, Standalone file pages */
92
+ .indexpage ul {
93
+ line-height: 160%;
94
+ list-style: none;
95
+ }
96
+ .indexpage ul :link,
97
+ .indexpage ul :visited {
98
+ font-size: 16px;
99
+ }
100
+
101
+ .indexpage li {
102
+ padding-left: 20px;
103
+ }
104
+
105
+ .indexpage ul > li {
106
+ background: url(images/bullet_black.png) no-repeat left 4px;
107
+ }
108
+ .indexpage li.method {
109
+ background: url(images/plugin.png) no-repeat left 4px;
110
+ }
111
+ .indexpage li.module {
112
+ background: url(images/package.png) no-repeat left 4px;
113
+ }
114
+ .indexpage li.class {
115
+ background: url(images/ruby.png) no-repeat left 4px;
116
+ }
117
+ .indexpage li.file {
118
+ background: url(images/page_white_text.png) no-repeat left 4px;
119
+ }
120
+ .indexpage li li {
121
+ background: url(images/tag_blue.png) no-repeat left 4px;
122
+ }
123
+ .indexpage li .toc-toggle {
124
+ width: 16px;
125
+ height: 16px;
126
+ background: url(images/add.png) no-repeat;
127
+ }
128
+
129
+ .indexpage li .toc-toggle.open {
130
+ background: url(images/delete.png) no-repeat;
131
+ }
132
+
133
+ /* @end */
134
+
135
+ /* @group Top-Level Structure */
136
+
137
+ #metadata {
138
+ float: left;
139
+ width: 260px;
140
+ }
141
+
142
+ #documentation {
143
+ margin: 2em 1em 5em 300px;
144
+ min-width: 340px;
145
+ }
146
+
147
+ #validator-badges {
148
+ clear: both;
149
+ margin: 1em 1em 2em;
150
+ font-size: smaller;
151
+ }
152
+
153
+ /* @end */
154
+
155
+ /* @group Metadata Section */
156
+ #metadata .section {
157
+ background-color: #dedede;
158
+ -moz-border-radius: 5px;
159
+ -webkit-border-radius: 5px;
160
+ border: 1px solid #aaa;
161
+ margin: 0 8px 8px;
162
+ font-size: 90%;
163
+ overflow: hidden;
164
+ }
165
+ #metadata h3.section-header {
166
+ margin: 0;
167
+ padding: 2px 8px;
168
+ background: #ccc;
169
+ color: #666;
170
+ -moz-border-radius-topleft: 4px;
171
+ -moz-border-radius-topright: 4px;
172
+ -webkit-border-top-left-radius: 4px;
173
+ -webkit-border-top-right-radius: 4px;
174
+ border-bottom: 1px solid #aaa;
175
+ }
176
+ #metadata #home-section h3.section-header {
177
+ border-bottom: 0;
178
+ }
179
+
180
+ #metadata ul,
181
+ #metadata dl,
182
+ #metadata p {
183
+ padding: 8px;
184
+ list-style: none;
185
+ }
186
+
187
+ #file-metadata {
188
+ margin-top: 2em;
189
+ }
190
+
191
+ #file-metadata ul {
192
+ padding-left: 28px;
193
+ list-style-image: url(images/page_green.png);
194
+ }
195
+
196
+ dl.svninfo {
197
+ color: #666;
198
+ margin: 0;
199
+ }
200
+ dl.svninfo dt {
201
+ font-weight: bold;
202
+ }
203
+
204
+ ul.link-list li {
205
+ white-space: nowrap;
206
+ }
207
+ ul.link-list .type {
208
+ font-size: 8px;
209
+ text-transform: uppercase;
210
+ color: white;
211
+ background: #969696;
212
+ padding: 2px 4px;
213
+ -webkit-border-radius: 5px;
214
+ }
215
+
216
+ /* @end */
217
+
218
+ /* @group Class Metadata Section */
219
+ #class-metadata {
220
+ margin-top: 2em;
221
+ }
222
+ /* @end */
223
+
224
+ /* @group Project Metadata Section */
225
+ #project-metadata {
226
+ margin-top: 2em;
227
+ }
228
+
229
+ #project-metadata .section {
230
+ border: 1px solid #aaa;
231
+ }
232
+ #project-metadata h3.section-header {
233
+ border-bottom: 1px solid #aaa;
234
+ position: relative;
235
+ }
236
+
237
+ #project-metadata form {
238
+ color: #777;
239
+ background: #ccc;
240
+ }
241
+
242
+ /* @end */
243
+
244
+ /* @group Documentation Section */
245
+ .description {
246
+ font-size: 100%;
247
+ color: #333;
248
+ }
249
+
250
+ .description p {
251
+ margin: 1em 0.4em;
252
+ }
253
+
254
+ .description li p {
255
+ margin: 0;
256
+ }
257
+
258
+ .description ol,
259
+ .description ul {
260
+ margin-left: 1.5em;
261
+ }
262
+ .description ol li,
263
+ .description ul li {
264
+ line-height: 1.4em;
265
+ }
266
+
267
+ .note-list {
268
+ margin: 8px 0;
269
+ }
270
+
271
+ .label-list {
272
+ margin: 8px 1.5em;
273
+ border: 1px solid #ccc;
274
+ }
275
+ .description .label-list {
276
+ font-size: 14px;
277
+ }
278
+
279
+ .note-list dt {
280
+ font-weight: bold;
281
+ }
282
+ .note-list dd {
283
+ padding: 0 12px;
284
+ }
285
+
286
+ .label-list dt {
287
+ padding: 2px 4px;
288
+ font-weight: bold;
289
+ background: #ddd;
290
+ }
291
+ .label-list dd {
292
+ padding: 2px 12px;
293
+ }
294
+ .label-list dd + dt,
295
+ .note-list dd + dt {
296
+ margin-top: 0.7em;
297
+ }
298
+
299
+ #documentation .section {
300
+ font-size: 90%;
301
+ }
302
+
303
+ #documentation h2.section-header {
304
+ margin-top: 1em;
305
+ padding: 0.25em 0.5em;
306
+ background: #ccc;
307
+ color: #333;
308
+ font-size: 175%;
309
+ border: 1px solid #bbb;
310
+ -moz-border-radius: 3px;
311
+ -webkit-border-radius: 3px;
312
+ }
313
+
314
+ .documentation-section-title {
315
+ position: relative;
316
+ }
317
+ .documentation-section-title .section-click-top {
318
+ position: absolute;
319
+ top: 6px;
320
+ right: 12px;
321
+ font-size: 10px;
322
+ color: #9b9877;
323
+ visibility: hidden;
324
+ padding-right: 0.5px;
325
+ }
326
+
327
+ .documentation-section-title:hover .section-click-top {
328
+ visibility: visible;
329
+ }
330
+
331
+ #documentation h3.section-header {
332
+ margin-top: 1em;
333
+ padding: 0.25em 0.5em;
334
+ background-color: #dedede;
335
+ color: #333;
336
+ font-size: 150%;
337
+ border: 1px solid #bbb;
338
+ -moz-border-radius: 3px;
339
+ -webkit-border-radius: 3px;
340
+ }
341
+
342
+ #constants-list > dl,
343
+ #attributes-list > dl {
344
+ margin: 1em 0 2em;
345
+ border: 0;
346
+ }
347
+ #constants-list > dl dt,
348
+ #attributes-list > dl dt {
349
+ padding-left: 0;
350
+ font-weight: bold;
351
+ font-family: Monaco, "Andale Mono";
352
+ background: inherit;
353
+ }
354
+ #constants-list > dl dt a,
355
+ #attributes-list > dl dt a {
356
+ color: inherit;
357
+ }
358
+ #constants-list > dl dd,
359
+ #attributes-list > dl dd {
360
+ margin: 0 0 1em 0;
361
+ padding: 0;
362
+ color: #666;
363
+ }
364
+
365
+ .documentation-section h2 {
366
+ position: relative;
367
+ }
368
+
369
+ .documentation-section h2 a {
370
+ position: absolute;
371
+ top: 8px;
372
+ right: 10px;
373
+ font-size: 12px;
374
+ color: #9b9877;
375
+ visibility: hidden;
376
+ }
377
+
378
+ .documentation-section h2:hover a {
379
+ visibility: visible;
380
+ }
381
+
382
+ /* @group Method Details */
383
+
384
+ #documentation .method-source-code {
385
+ display: none;
386
+ }
387
+
388
+ #documentation .method-detail {
389
+ margin: 0.5em 0;
390
+ padding: 0.5em 0;
391
+ cursor: pointer;
392
+ }
393
+ #documentation .method-detail:hover {
394
+ background-color: #f1edba;
395
+ }
396
+ #documentation .method-heading {
397
+ position: relative;
398
+ padding: 2px 4px 0 20px;
399
+ font-size: 125%;
400
+ font-weight: bold;
401
+ color: #333;
402
+ background: url(images/brick.png) no-repeat left bottom;
403
+ }
404
+ #documentation .method-heading :link,
405
+ #documentation .method-heading :visited {
406
+ color: inherit;
407
+ }
408
+ #documentation .method-click-advice {
409
+ position: absolute;
410
+ top: 2px;
411
+ right: 5px;
412
+ font-size: 10px;
413
+ color: #9b9877;
414
+ visibility: hidden;
415
+ padding-right: 20px;
416
+ line-height: 20px;
417
+ background: url(images/zoom.png) no-repeat right top;
418
+ }
419
+ #documentation .method-heading:hover .method-click-advice {
420
+ visibility: visible;
421
+ }
422
+
423
+ #documentation .method-alias .method-heading {
424
+ color: #666;
425
+ background: url(images/brick_link.png) no-repeat left bottom;
426
+ }
427
+
428
+ #documentation .method-description,
429
+ #documentation .aliases {
430
+ margin: 0 20px;
431
+ color: #666;
432
+ }
433
+
434
+ #documentation .method-description p,
435
+ #documentation .aliases p {
436
+ line-height: 1.2em;
437
+ }
438
+
439
+ #documentation .aliases {
440
+ padding-top: 4px;
441
+ font-style: italic;
442
+ cursor: default;
443
+ }
444
+ #documentation .method-description p {
445
+ margin-bottom: 0.5em;
446
+ }
447
+ #documentation .method-description ul {
448
+ margin-left: 1.5em;
449
+ }
450
+ pre {
451
+ margin: 0.5em 0;
452
+ }
453
+
454
+ #documentation .attribute-method-heading {
455
+ background: url(images/tag_green.png) no-repeat left bottom;
456
+ }
457
+ #documentation #attribute-method-details .method-detail:hover {
458
+ background-color: transparent;
459
+ cursor: default;
460
+ }
461
+ #documentation .attribute-access-type {
462
+ font-size: 60%;
463
+ text-transform: uppercase;
464
+ vertical-align: super;
465
+ padding: 0 2px;
466
+ }
467
+ /* @end */
468
+
469
+ /* @end */
470
+
471
+ /* @group Source Code */
472
+
473
+ pre {
474
+ overflow: auto;
475
+ background: #262626;
476
+ color: white;
477
+ border: 1px dashed #999;
478
+ padding: 0.5em;
479
+ }
480
+
481
+ .description pre {
482
+ margin: 0 0.4em;
483
+ }
484
+
485
+ .ruby-constant { color: #7fffd4; background: transparent; }
486
+ .ruby-keyword { color: #00ffff; background: transparent; }
487
+ .ruby-ivar { color: #eedd82; background: transparent; }
488
+ .ruby-operator { color: #00ffee; background: transparent; }
489
+ .ruby-identifier { color: #ffdead; background: transparent; }
490
+ .ruby-node { color: #ffa07a; background: transparent; }
491
+ .ruby-comment { color: #dc0000; font-weight: bold; background: transparent; }
492
+ .ruby-regexp { color: #ffa07a; background: transparent; }
493
+ .ruby-value { color: #7fffd4; background: transparent; }
494
+
495
+ /* @end */
496
+
497
+
498
+ /* @group search results */
499
+ #search-results h1 {
500
+ font-size: 1em;
501
+ font-weight: normal;
502
+ text-shadow: none;
503
+ }
504
+
505
+ #search-results .current {
506
+ background: #ccc;
507
+ border-bottom: 1px solid transparent;
508
+ }
509
+
510
+ #search-results li {
511
+ list-style: none;
512
+ border-bottom: 1px solid #aaa;
513
+ -moz-border-radius: 4px;
514
+ -webkit-border-radius: 4px;
515
+ border-radius: 4px;
516
+ margin-bottom: 0.5em;
517
+ }
518
+
519
+ #search-results li:last-child {
520
+ border-bottom: none;
521
+ margin-bottom: 0;
522
+ }
523
+
524
+ #search-results li p {
525
+ padding: 0;
526
+ margin: 0.5em;
527
+ }
528
+
529
+ #search-results .search-namespace {
530
+ font-weight: bold;
531
+ }
532
+
533
+ #search-results li em {
534
+ background: yellow;
535
+ font-style: normal;
536
+ }
537
+
538
+ #search-results pre {
539
+ margin: 0.5em;
540
+ }
541
+
542
+ /* @end */
543
+
@@ -0,0 +1,82 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
6
+
7
+ <title>Table of Contents - Shenanigans</title>
8
+
9
+ <link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
10
+
11
+ <script type="text/javascript">
12
+ var rdoc_rel_prefix = "./";
13
+ </script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
16
+ <script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
17
+ <script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
18
+ <script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
19
+ <script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
20
+ <script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
21
+
22
+
23
+ <body class="indexpage">
24
+ <h1>Table of Contents - Shenanigans</h1>
25
+
26
+ <h2>Pages</h2>
27
+ <ul>
28
+ <li class="file">
29
+ <a href="README_rdoc.html">README</a>
30
+
31
+ <img class="toc-toggle" src="images/transparent.png" alt="" title="toggle headings">
32
+ <ul class="initially-hidden">
33
+ <li><a href="README_rdoc.html#label-Shenanigans">Shenanigans</a>
34
+ <li><a href="README_rdoc.html#label-Introduction">Introduction</a>
35
+ <li><a href="README_rdoc.html#label-Installation">Installation</a>
36
+ <li><a href="README_rdoc.html#label-Usage">Usage</a>
37
+ <li><a href="README_rdoc.html#label-Contribute">Contribute</a>
38
+ <li><a href="README_rdoc.html#label-Authors">Authors</a>
39
+ <li><a href="README_rdoc.html#label-License">License</a>
40
+ </ul>
41
+ </li>
42
+
43
+ </ul>
44
+
45
+ <h2 id="classes">Classes/Modules</h2>
46
+ <ul>
47
+ <li class="class">
48
+ <a href="Array.html">Array</a>
49
+ </li>
50
+ <li class="module">
51
+ <a href="Kernel.html">Kernel</a>
52
+ </li>
53
+ <li class="class">
54
+ <a href="Object.html">Object</a>
55
+ </li>
56
+
57
+ </ul>
58
+
59
+ <h2 id="methods">Methods</h2>
60
+ <ul>
61
+
62
+ <li class="method"><a href="Kernel.html#method-i-fn">#fn &mdash; Kernel</a>
63
+
64
+ <li class="method"><a href="Object.html#method-i-identity">#identity &mdash; Object</a>
65
+
66
+ <li class="method"><a href="Kernel.html#method-i-prompt">#prompt &mdash; Kernel</a>
67
+
68
+ <li class="method"><a href="Array.html#method-i-random_subarray">#random_subarray &mdash; Array</a>
69
+
70
+ <li class="method"><a href="Kernel.html#method-i-with">#with &mdash; Kernel</a>
71
+
72
+ <li class="method"><a href="Array.html#method-i-zip_with">#zip_with &mdash; Array</a>
73
+
74
+ </ul>
75
+
76
+
77
+ <footer id="validator-badges">
78
+ <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
79
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
80
+ <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
81
+ </footer>
82
+
@@ -0,0 +1,57 @@
1
+ [![Build Status](https://secure.travis-ci.org/citizen428/shenanigans.png)](http://travis-ci.org/citizen428/shenanigans)
2
+
3
+ Shenanigans
4
+ =====
5
+
6
+ shenanigan (plural shenanigans)
7
+
8
+ 1. Trickery, games; skulduggery. To "call", "claim" or "declare" shenanigans is to rhetorically label something as officially deceitful, improper, or otherwise incorrect.
9
+
10
+ _"The advertisement said it would cost $50 but they charged me $75 at the register. I declare **shenanigans.**"_
11
+
12
+ The speaker passes off the statement as having some sort of implied official effect, but in reality, it is simply a complaint.
13
+
14
+ 2. A deceitful confidence trick, or mischief causing discomfort or annoyance.
15
+
16
+ _You should learn to spot their shenanigans and avoid being fooled._
17
+
18
+ 3. Mischievous play, especially by children.
19
+
20
+ Source: [Wiktionary](http://en.wiktionary.org/wiki/shenanigan#English)
21
+
22
+ Introduction
23
+ ----
24
+
25
+ [Ruby Facets](https://github.com/rubyworks/facets) is the premiere collection of general purpose method extensions and standard additions for the Ruby programming language. This is not Ruby Facets however, but a random collection of methods I wrote for myself that I find interesting and/or useful. That said, some of them actually are in Facets, although sometimes under different names or slightly changed.
26
+
27
+ Installation
28
+ ----
29
+
30
+ Shenanigans is available through [RubyGems](http://rubygems.org/):
31
+
32
+ $ gem install shenanigans
33
+
34
+ Usage
35
+ ----
36
+
37
+ You can add a single method with `require 'shenanigans/<class|module>/<method>'`, e.g.:
38
+
39
+ require 'shenanigans/array/zip_with'
40
+
41
+ If you want to add all the extensions for a single class or module, use `require 'shenanigans/<class|module>'`:
42
+
43
+ require 'shenanigans/kernel'
44
+
45
+ And if you really feel like it, you can also require everything thus:
46
+
47
+ require 'shenanigans'
48
+
49
+ Contribute
50
+ ----
51
+
52
+ If you have a cool method you'd like to see included here, you should really reconsider and try to contribute it to Facets instead! This is mainly a dumping ground for my own pet methods and unless it becomes popular for a strange reason, people are not likely to use this library.
53
+
54
+ License
55
+ ----
56
+
57
+ This project is under the MIT license. You can see the full license text [online](http://www.opensource.org/licenses/mit-license.php/) or in the provided `LICENSE` file.
@@ -0,0 +1,16 @@
1
+ class Array
2
+ # Generates random subarrays. Uses random numbers and
3
+ # bit-fiddling to assure performant uniform distributions
4
+ # even for large arrays.
5
+ # a = *1..5
6
+ # a.random_subarray(3)
7
+ # #=> [[1, 3, 5], [2, 4], [1, 3, 4, 5]]
8
+
9
+ def random_subarray(n=1)
10
+ raise ArgumentError, "negative argument" if n < 0
11
+ (1..n).map do
12
+ r = rand(2**self.size)
13
+ self.select.with_index { |_, i| r[i] == 1 }
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,27 @@
1
+ class Array
2
+
3
+ # Zip <tt>self</tt> with <tt>other</tt>, combining the elements
4
+ # with the provided block or symbol.
5
+ # The resulting array will be as long as the shorter of
6
+ # the two arrays.
7
+ # [1,2,3].zip_with([6,5,4], :+)
8
+ # #=> [7, 7, 7]
9
+ # %w(a b).zip_with(%w(c d), :+)
10
+ # #=> ["ac", "bd"]
11
+ #
12
+ # For more complex combinations, a block can be provided:
13
+ #
14
+ # [1,2,3].zw([6,5,4]) { |a,b| 3*a+2*b }
15
+ # #=> [15, 16, 17]
16
+ def zip_with(other, op=nil)
17
+ return [] if self.empty? || other.empty?
18
+ clipped = self[0..other.length-1]
19
+ zipped = clipped.zip(other)
20
+
21
+ if op
22
+ zipped.map { |a, b| a.send(op, b) }
23
+ else
24
+ zipped.map { |a, b| yield(a, b) }
25
+ end
26
+ end
27
+ end