aboutsummaryrefslogtreecommitdiff
path: root/ops.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-04-08 13:33:01 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-04-08 13:33:01 +0200
commita3a8f67b718768867bf579c79bc2ce30a0bde45b (patch)
tree6d3bd2499bcf1e3ff19d36ac3c96e168009de015 /ops.go
parent4ad8cc3d0c36cb784fea32398afbf0cd0e138165 (diff)
Clean up
Diffstat (limited to 'ops.go')
-rw-r--r--ops.go55
1 files changed, 33 insertions, 22 deletions
diff --git a/ops.go b/ops.go
index 71b62f5..a6c533f 100644
--- a/ops.go
+++ b/ops.go
@@ -2,81 +2,92 @@ package main
import (
"container/list"
+ "fmt"
"log"
)
+type (
+ List struct{ *list.List }
+ Element struct{ *list.Element }
+)
+
var (
- alphabet *list.List
- zero, one *list.Element
+ alphabet List
+ zero, one Element
)
func init() {
- alphabet = list.New()
+ alphabet = List{list.New()}
for i := 0; i <= maxValue; i++ {
alphabet.PushBack(i)
}
- zero = alphabet.Front()
- one = zero.Next()
+ zero = Element{alphabet.Front()}
+ one = Element{zero.Next()}
}
// next returns next char in alphabet
-func next(n *list.Element) *list.Element {
+func (n Element) next() Element {
if nxt := n.Next(); nxt != nil {
- return nxt
+ return Element{nxt}
}
log.Fatal("out of range", n.Value)
- return nil
+ return Element{}
}
// prev returns previous char in alphabet
-func prev(n *list.Element) *list.Element {
+func (n Element) prev() Element {
if prv := n.Prev(); prv != nil {
- return prv
+ return Element{prv}
}
return zero
}
// add defines addition
-func add(m, n *list.Element) *list.Element {
+func add(m, n Element) Element {
if m == zero {
return n
}
- return next(add(prev(m), n))
+ return add(m.prev(), n).next()
}
// times defines mutiplication
-func times(m, n *list.Element) *list.Element {
+func times(m, n Element) Element {
if m == zero {
return zero
}
- return add(times(prev(m), n), n)
+ return add(times(m.prev(), n), n)
}
// pot defines power function
-func pot(m, n *list.Element) *list.Element {
+func pot(m, n Element) Element {
if n == zero {
return one
}
- return times(pot(m, prev(n)), m)
+ return times(pot(m, n.prev()), m)
}
// sub defines substraction
-func sub(m, n *list.Element) *list.Element {
+func sub(m, n Element) Element {
if n == zero {
return m
}
- return prev(sub(m, prev(n)))
+ return sub(m, n.prev()).prev()
}
-// scan lookups element representation
-func scan(n int) *list.Element {
+// scan lookups n-th element representation
+func scan(n int) Element {
if n > alphabet.Len() {
log.Fatal("out of range")
- return nil
+ return Element{}
}
e := alphabet.Front()
for i := 0; i < n; i++ {
e = e.Next()
}
- return e
+ return Element{e}
+}
+
+// String pretty-prints value
+func (n Element) String() string {
+ return fmt.Sprint(n.Value)
}