added a simple LinkedList
This commit is contained in:
@ -588,3 +588,141 @@ extend Apex
|
||||
^Association new key: self value: object
|
||||
}
|
||||
}
|
||||
|
||||
## -------------------------------------------------------------------------------
|
||||
|
||||
class Link(Object)
|
||||
{
|
||||
dcl prev next value.
|
||||
|
||||
method(#class) new: value
|
||||
{
|
||||
| x |
|
||||
x := self new.
|
||||
x value: value.
|
||||
^x
|
||||
}
|
||||
|
||||
method prev { ^self.prev }
|
||||
method next { ^self.next }
|
||||
method value { ^self.value }
|
||||
method prev: link { self.prev := link }
|
||||
method next: link { self.next := link }
|
||||
method value: value { self.value := value }
|
||||
}
|
||||
|
||||
class LinkedList(Collection)
|
||||
{
|
||||
dcl first last tally.
|
||||
|
||||
method initialize
|
||||
{
|
||||
self.tally := 0.
|
||||
}
|
||||
|
||||
method size
|
||||
{
|
||||
^self.tally
|
||||
}
|
||||
|
||||
method first
|
||||
{
|
||||
^self.first
|
||||
}
|
||||
|
||||
method last
|
||||
{
|
||||
^self.last
|
||||
}
|
||||
|
||||
method insertLink: link at: pos
|
||||
{
|
||||
if (pos isNil)
|
||||
{
|
||||
(* add link at the back *)
|
||||
if (self.tally == 0)
|
||||
{
|
||||
self.first := link.
|
||||
self.last := link.
|
||||
link prev: nil.
|
||||
}
|
||||
else
|
||||
{
|
||||
link prev: self.last.
|
||||
self.last next: link.
|
||||
self.last := link.
|
||||
}.
|
||||
link next: nil.
|
||||
}
|
||||
else
|
||||
{
|
||||
(* insert the link before pos *)
|
||||
link next: pos.
|
||||
link prev: pos prev.
|
||||
if (pos prev notNil) { pos prev next: link }
|
||||
else { self.first := link }.
|
||||
pos prev: link
|
||||
}.
|
||||
|
||||
self.tally := self.tally + 1.
|
||||
^link
|
||||
}
|
||||
|
||||
method insert: value at: pos
|
||||
{
|
||||
^self insertLink: (Link new: value) at: pos
|
||||
}
|
||||
|
||||
method addFirst: value
|
||||
{
|
||||
^self insert: value at: self.first
|
||||
}
|
||||
|
||||
method addLast: value
|
||||
{
|
||||
^self insert: value at: nil
|
||||
}
|
||||
|
||||
method addFirstLink: link
|
||||
{
|
||||
^self insertLink: link at: self.first
|
||||
}
|
||||
|
||||
method addLastLink: link
|
||||
{
|
||||
^self insertLink: link at: nil
|
||||
}
|
||||
|
||||
method removeLink: link
|
||||
{
|
||||
if (link next notNil) { link next prev: link prev }
|
||||
else { self.last := link prev }.
|
||||
|
||||
if (link prev notNil) { link prev next: link next }
|
||||
else { self.first := link next }.
|
||||
|
||||
self.tally := self.tally - 1.
|
||||
}
|
||||
|
||||
method removeFirst
|
||||
{
|
||||
^self removeLink: self.first
|
||||
}
|
||||
|
||||
method removeLast
|
||||
{
|
||||
^self removeLink: self.last
|
||||
}
|
||||
|
||||
method do: block
|
||||
{
|
||||
| link next |
|
||||
link := self.first.
|
||||
while (link notNil)
|
||||
{
|
||||
next := link next.
|
||||
block value: link value.
|
||||
link := next.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -187,65 +187,105 @@ class Number(Magnitude)
|
||||
self primitiveFailed.
|
||||
}
|
||||
|
||||
method to: end by: step do: aBlock
|
||||
method to: end by: step do: block
|
||||
{
|
||||
| i |
|
||||
i := self.
|
||||
(*
|
||||
(step > 0)
|
||||
ifTrue: [
|
||||
[ i <= end ] whileTrue: [
|
||||
aBlock value: i.
|
||||
block value: i.
|
||||
i := i + step.
|
||||
].
|
||||
]
|
||||
ifFalse: [
|
||||
[ i >= end ] whileTrue: [
|
||||
aBlock value: i.
|
||||
block value: i.
|
||||
i := i - step.
|
||||
].
|
||||
].
|
||||
*)
|
||||
if (step > 0)
|
||||
{
|
||||
while (i <= end)
|
||||
{
|
||||
block value: i.
|
||||
i := i + step.
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( i => end)
|
||||
{
|
||||
block value: i.
|
||||
i := i - step.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
method to: end do: aBlock
|
||||
method to: end do: block
|
||||
{
|
||||
^self to: end by: 1 do: aBlock.
|
||||
^self to: end by: 1 do: block.
|
||||
}
|
||||
|
||||
method priorTo: end by: step do: aBlock
|
||||
method priorTo: end by: step do: block
|
||||
{
|
||||
| i |
|
||||
i := self.
|
||||
(*
|
||||
(step > 0)
|
||||
ifTrue: [
|
||||
[ i < end ] whileTrue: [
|
||||
aBlock value: i.
|
||||
block value: i.
|
||||
i := i + step.
|
||||
].
|
||||
]
|
||||
ifFalse: [
|
||||
[ i > end ] whileTrue: [
|
||||
aBlock value: i.
|
||||
block value: i.
|
||||
i := i - step.
|
||||
].
|
||||
].
|
||||
*)
|
||||
if (step > 0)
|
||||
{
|
||||
while (i < end)
|
||||
{
|
||||
block value: i.
|
||||
i := i + step.
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( i > end)
|
||||
{
|
||||
block value: i.
|
||||
i := i - step.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
method priorTo: end do: aBlock
|
||||
method priorTo: end do: block
|
||||
{
|
||||
^self priorTo: end by: 1 do: aBlock.
|
||||
^self priorTo: end by: 1 do: block.
|
||||
}
|
||||
|
||||
method abs
|
||||
{
|
||||
self < 0 ifTrue: [^self negated].
|
||||
^self.
|
||||
(*self < 0 ifTrue: [^self negated].
|
||||
^self.*)
|
||||
^if (self < 0) { self negated } else { self }
|
||||
}
|
||||
|
||||
method sign
|
||||
{
|
||||
self < 0 ifTrue: [^-1].
|
||||
(* self < 0 ifTrue: [^-1].
|
||||
self > 0 ifTrue: [^1].
|
||||
^0.
|
||||
^0.*)
|
||||
^if (self < 0) { -1 }
|
||||
elsif (self > 0) { 1 }
|
||||
else { 0 }
|
||||
}
|
||||
}
|
||||
|
||||
@ -281,26 +321,12 @@ class(#liword) LargeInteger(Integer)
|
||||
|
||||
class(#liword) LargePositiveInteger(LargeInteger)
|
||||
{
|
||||
method abs
|
||||
{
|
||||
^self.
|
||||
}
|
||||
|
||||
method sign
|
||||
{
|
||||
^1.
|
||||
}
|
||||
method abs { ^self }
|
||||
method sign { ^1 }
|
||||
}
|
||||
|
||||
class(#liword) LargeNegativeInteger(LargeInteger)
|
||||
{
|
||||
method abs
|
||||
{
|
||||
^self negated.
|
||||
}
|
||||
|
||||
method sign
|
||||
{
|
||||
^-1.
|
||||
}
|
||||
method abs { ^self negated }
|
||||
method sign { ^-1 }
|
||||
}
|
||||
|
Reference in New Issue
Block a user