import cat_factory // can access top-level methods in cat_factory.grace
import vector
type Cat = {
getName->String
color->String
changeNameTo(_:String)->String
speak->Void
asString->String}
type Cheetah = Cat & {
speed->Number
race(_:Cat)->Cat}
type Iterator = {
hasNext->Boolean
get->T
next->T}
type Vector = {
size->Number
isEmpty->Boolean
clear->Void
contains(_:T)->Boolean
addFirst(_:T)->Void
addLast(_:T)->Void
firstElement->T
lastElement->T
removeFirst->T
removeLast->T
removeValue(_:T)->T
indexOf(_:T)->Number
at(_:Number)->T
setValue(_:T)at(_:Number)->T
add(_:T)at(_:Number)->Void
removeFromIndex(_:Number)->T
iterator->Iterator
asString->String
forEachDo(_:Block)->Void
map(_:Block)->Vector
ensureCapacity(_:Number)->Void
capacity->Number
copyInto(_)->Void
indexOf(_:T)startingFrom(_:Number)->Number
setSize(_:Number)->Void
trimToSize->Void}
// searches for cat named name in list and returns matching cat
// if it exists
method find (name:String) in (list:Vector)->Dynamic{
for(1..list.size) do {i->
if(list.at(i).getName == name) then{
return list.at(i)}
}
}
// a vector that accepts objects of type Cat
var myCats:Vector := vector.withSize 10
def myFirstCat = cat_factory.catOfColor "calico" named "Ivan"
def mySecondCat = cat_factory.catOfColor "black"
def myThirdCat = cat_factory.cat
myThirdCat.changeNameTo "Missy"
myCats.addFirst(myFirstCat)
myCats.addLast(myThirdCat)
myCats.add(mySecondCat)at(2)
myCats.at(2).changeNameTo "Macavity"
myCats.addLast(cat_factory.cheetah)
myCats.addLast(cat_factory.cheetahNamed "Alex")
myCats.addLast(cat_factory.cheetahNamed "Sebastian" withSpeed 74.5)
// makes each cat in the vector use speak method
myCats.forEachDo{thisCat->thisCat.speak}
print "\n"
def champion = cat_factory.cheetahNamed "Champion" withSpeed 73
// prints result of races between each cat in the vector and Champion
myCats.forEachDo{thisCat->
var s:String := "Champion vs {thisCat.getName}: "
s := s ++ "{champion.race(thisCat).getName} won"
print(s)}
print "\n"
// if Kitty is a cheetah, will change name to Edith
// if Kitty is a cat but not a cheetah, will change name to Ellen
// if there's no cat named Kitty in the vector, will print message
match(find "Kitty" in(myCats))
case{found:Cheetah-> found.changeNameTo "Edith"}
case{found:Cat-> found.changeNameTo "Ellen"}
case{other-> print "You don't own a cat named Kitty"}
// prints out each cat in the vector
var catIter:Iterator := myCats.iterator
print "My cats are: "
while{catIter.hasNext} do {print(catIter.next)}