The Cobra Programming Language
How To
PrintHelloWorld
WriteBasicSyntax
UseProperties
MakeAnIfElseLadder
MakeABranchStatement
DeclareInits
MakeAClassHierarchy
UseNilAndNilableTypes
UseDynamicTyping
DeclareVariableNumberOfArgs
ReadAndWriteFiles
CheckInheritanceAndImplementation
ImplementIEnumerable1
ImplementIEnumerable2
IterateThroughRecursiveDataWithYield
MakeACollectionClass
AccessMySQL
"""
ImplementIEnumerable2.cobra

This version implements a generic file cabinet: You can give it any type of
object to hold.


See also: ImplementIEnumerable1.cobra
"""


class FileCabinet<of T>
    implements IEnumerable<of T>

    var _records = List<of T>()

    get records from var

    get nextSerialNum as int
        return _records.count + 1

    def getEnumerator as IEnumerator<of T>
        return _records.getEnumerator()

    def getEnumerator as System.Collections.IEnumerator
        implements System.Collections.IEnumerable
        return .getEnumerator()


class Record

    var _serialNum as int
    var _name as String

    def init(serialNum as int, name as String)
        _serialNum = serialNum
        _name = name

    pro serialNum from var

    pro name from var

    def toString as String  is override
        return '[.getType.name]([_serialNum], [_name])'


class Program

    def main is shared
        # build a cabinet:
        cabinet = FileCabinet<of Record>()
        cabinet.records.add(Record(cabinet.nextSerialNum, 'Red'))
        cabinet.records.add(Record(cabinet.nextSerialNum, 'Green'))
        cabinet.records.add(Record(cabinet.nextSerialNum, 'Blue'))

        # because cabinet is an IEnumerable, it can be for'ed:
        for r2 in cabinet
            print r2

        # and passed to a List initializer:
        records = List<of Record>(cabinet)
        for r3 in records
            assert r3.serialNum > 0