Class: ALib::OrderedHash

Inherits:
Hash
  • Object
show all
Defined in:
lib/alib.rb,
lib/alib-0.3.1.rb

Overview

AUTHOR

jan molic /mig/at/1984/dot/cz/

DESCRIPTION

Hash with preserved order and some array-like extensions
Public domain.

THANKS

Andrew Johnson for his suggestions and fixes of Hash[],
merge, to_a, inspect and shift

Direct Known Subclasses

AutoOrderedHash

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*a, &b) ⇒ OrderedHash

end



1314
1315
1316
1317
1318
1319
# File 'lib/alib.rb', line 1314

def initialize(*a, &b)
#--{{{
  super
  @order = []
#--}}}
end

Instance Attribute Details

#orderObject

–{{{



1290
1291
1292
# File 'lib/alib.rb', line 1290

def order
  @order
end

Class Method Details

.[](*args) ⇒ Object

–{{{



1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
# File 'lib/alib.rb', line 1294

def [] *args
#--{{{
    hsh = OrderedHash.new
    if Hash === args[0]
        hsh.replace args[0]
    elsif (args.size % 2) != 0
        raise ArgumentError, "odd number of elements for Hash"
    else
        hsh[args.shift] = args.shift while args.size > 0
    end
    hsh
#--}}}
end

Instance Method Details

#==(hsh2) ⇒ Object



1333
1334
1335
1336
1337
1338
# File 'lib/alib.rb', line 1333

def == hsh2
#--{{{
    return false if @order != hsh2.order
    super hsh2
#--}}}
end

#classObject

–}}}



1486
1487
1488
1489
1490
# File 'lib/alib.rb', line 1486

def class
#--{{{
  Hash
#--}}}
end

#clearObject

–}}}



1339
1340
1341
1342
1343
1344
# File 'lib/alib.rb', line 1339

def clear
#--{{{
    @order = []
    super
#--}}}
end

#delete(key) ⇒ Object

–}}}



1345
1346
1347
1348
1349
1350
# File 'lib/alib.rb', line 1345

def delete key
#--{{{
    @order.delete key
    super
#--}}}
end

#delete_ifObject



1370
1371
1372
1373
1374
1375
1376
1377
# File 'lib/alib.rb', line 1370

def delete_if
#--{{{
    @order.clone.each { |k| 
        delete k if yield
    }
    self
#--}}}
end

#eachObject Also known as: each_pair

–}}}



1363
1364
1365
1366
1367
1368
# File 'lib/alib.rb', line 1363

def each
#--{{{
    @order.each { |k| yield k,self[k] }
    self
#--}}}
end

#each_keyObject

–}}}



1351
1352
1353
1354
1355
1356
# File 'lib/alib.rb', line 1351

def each_key
#--{{{
    @order.each { |k| yield k }
    self
#--}}}
end

#each_valueObject

–}}}



1357
1358
1359
1360
1361
1362
# File 'lib/alib.rb', line 1357

def each_value
#--{{{
    @order.each { |k| yield self[k] }
    self
#--}}}
end

#inspectObject

–}}}



1460
1461
1462
1463
1464
1465
1466
# File 'lib/alib.rb', line 1460

def inspect
#--{{{
    ary = []
    each {|k,v| ary << k.inspect + "=>" + v.inspect}
    '{' + ary.join(", ") + '}'
#--}}}
end

#invertObject

–}}}



1390
1391
1392
1393
1394
1395
1396
# File 'lib/alib.rb', line 1390

def invert
#--{{{
    hsh2 = Hash.new    
    @order.each { |k| hsh2[self[k]] = k }
    hsh2
#--}}}
end

#keysObject

–}}}



1385
1386
1387
1388
1389
# File 'lib/alib.rb', line 1385

def keys
#--{{{
    @order
#--}}}
end

#merge(hsh2) ⇒ Object



1474
1475
1476
1477
1478
# File 'lib/alib.rb', line 1474

def merge hsh2
#--{{{
    self.dup update(hsh2)
#--}}}
end

#orig_storeObject

–}}}



1325
1326
1327
1328
1329
1330
# File 'lib/alib.rb', line 1325

def store a,b
#--{{{
    @order.push a unless has_key? a
    super a,b
#--}}}
end

#popObject

–}}}



1442
1443
1444
1445
1446
1447
# File 'lib/alib.rb', line 1442

def pop
#--{{{
    key = @order.last
    key ? [key,delete(key)] : nil
#--}}}
end

#push(k, v) ⇒ Object

–}}}



1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
# File 'lib/alib.rb', line 1431

def push k,v
#--{{{
    unless self.include? k
        @order.push k
        orig_store(k,v)
        true
    else
        false
    end
#--}}}
end

#reject(&block) ⇒ Object

–}}}



1397
1398
1399
1400
1401
# File 'lib/alib.rb', line 1397

def reject &block
#--{{{
    self.dup.delete_if &block
#--}}}
end

#reject!(&block) ⇒ Object

–}}}



1402
1403
1404
1405
1406
1407
# File 'lib/alib.rb', line 1402

def reject! &block
#--{{{
    hsh2 = reject &block
    self == hsh2 ? nil : hsh2
#--}}}
end

#replace(hsh2) ⇒ Object

–}}}



1408
1409
1410
1411
1412
1413
# File 'lib/alib.rb', line 1408

def replace hsh2
#--{{{
    @order = hsh2.keys 
    super hsh2
#--}}}
end

#selectObject

–}}}



1479
1480
1481
1482
1483
1484
1485
# File 'lib/alib.rb', line 1479

def select
#--{{{
    ary = []
    each { |k,v| ary << [k,v] if yield k,v }
    ary
#--}}}
end

#shiftObject

–}}}



1414
1415
1416
1417
1418
1419
# File 'lib/alib.rb', line 1414

def shift
#--{{{
    key = @order.first
    key ? [key,delete(key)] : super
#--}}}
end

#store(a, b) ⇒ Object Also known as: []=



1326
1327
1328
1329
1330
1331
# File 'lib/alib.rb', line 1326

def store a,b
#--{{{
    @order.push a unless has_key? a
    super a,b
#--}}}
end

#store_only(a, b) ⇒ Object

–}}}



1320
1321
1322
1323
1324
# File 'lib/alib.rb', line 1320

def store_only a,b
#--{{{
    store a,b
#--}}}
end

#to_aObject

–}}}



1448
1449
1450
1451
1452
1453
1454
# File 'lib/alib.rb', line 1448

def to_a
#--{{{
    ary = []
    each { |k,v| ary << [k,v] }
    ary
#--}}}
end

#to_sObject

–}}}



1455
1456
1457
1458
1459
# File 'lib/alib.rb', line 1455

def to_s
#--{{{
    self.to_a.to_s
#--}}}
end

#unshift(k, v) ⇒ Object

–}}}



1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
# File 'lib/alib.rb', line 1420

def unshift k,v
#--{{{
    unless self.include? k
        @order.unshift k
        orig_store(k,v)
        true
    else
        false
    end
#--}}}
end

#update(hsh2) ⇒ Object Also known as: merge!

–}}}



1467
1468
1469
1470
1471
1472
# File 'lib/alib.rb', line 1467

def update hsh2
#--{{{
    hsh2.each { |k,v| self[k] = v }
    self
#--}}}
end

#valuesObject

–}}}



1378
1379
1380
1381
1382
1383
1384
# File 'lib/alib.rb', line 1378

def values
#--{{{
    ary = []
    @order.each { |k| ary.push self[k] }
    ary
#--}}}
end