Skip to content

Commit

Permalink
several more methods for Hashobject
Browse files Browse the repository at this point in the history
  • Loading branch information
Stevan Little committed Feb 23, 2013
1 parent 16dd7f2 commit 176b662
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 23 deletions.
40 changes: 26 additions & 14 deletions src/main/scala/org/moe/runtime/builtins/HashClass.scala
Expand Up @@ -31,43 +31,55 @@ object HashClass {
new MoeMethod(
"postcircumfix:<{}>",
{ (self, args) =>
val key = args(0).unboxToString.get
val hash = self.unboxToMap.get
hash.get(key).getOrElse(r.NativeObjects.getUndef)
val hash = self.asInstanceOf[MoeHashObject]
if (args.length == 1) {
hash.at_key(r, args(0).asInstanceOf[MoeStrObject])
}
else {
hash.slice(r, args.map(_.asInstanceOf[MoeStrObject]))
}
}
)
)

hashClass.addMethod(
new MoeMethod(
"at_key", // ($key)
(self, args) => self.asInstanceOf[MoeHashObject].at_key(args(0).asInstanceOf[MoeStrObject])
(self, args) => self.asInstanceOf[MoeHashObject].at_key(r, args(0).asInstanceOf[MoeStrObject])
)
)

hashClass.addMethod(
new MoeMethod(
"bind_key", // ($key, $value)
(self, args) => self.asInstanceOf[MoeHashObject].bind_key(args(0).asInstanceOf[MoeStrObject], args(1))
(self, args) => self.asInstanceOf[MoeHashObject].bind_key(r, args(0).asInstanceOf[MoeStrObject], args(1))
)
)

hashClass.addMethod(new MoeMethod("keys", (self, _) => self.asInstanceOf[MoeHashObject].keys))

hashClass.addMethod(new MoeMethod("values", (self, _) => self.asInstanceOf[MoeHashObject].values))
hashClass.addMethod(
new MoeMethod(
"exists", // ($key)
(self, args) => self.asInstanceOf[MoeHashObject].exists(r, args(0).asInstanceOf[MoeStrObject])
)
)

hashClass.addMethod(new MoeMethod("kv", (self, _) => self.asInstanceOf[MoeHashObject].kv))
hashClass.addMethod(
new MoeMethod(
"slice", // ($key)
(self, args) => self.asInstanceOf[MoeHashObject].slice(r, args.map(_.asInstanceOf[MoeStrObject]))
)
)

hashClass.addMethod(new MoeMethod("pairs", (self, _) => self.asInstanceOf[MoeHashObject].pairs))
hashClass.addMethod(new MoeMethod("clear", (self, _) => self.asInstanceOf[MoeHashObject].clear(r)))
hashClass.addMethod(new MoeMethod("keys", (self, _) => self.asInstanceOf[MoeHashObject].keys(r)))
hashClass.addMethod(new MoeMethod("values", (self, _) => self.asInstanceOf[MoeHashObject].values(r)))
hashClass.addMethod(new MoeMethod("kv", (self, _) => self.asInstanceOf[MoeHashObject].kv(r)))
hashClass.addMethod(new MoeMethod("pairs", (self, _) => self.asInstanceOf[MoeHashObject].pairs(r)))

/**
* List of Methods to support:
* - each ($callback)
* - delete ($key | @keys)
* - exists ($key)
* - slice (@keys)
* - clear
* - delete ($key | @keys)
*
* See the following for details:
* - https://metacpan.org/release/autobox-Core
Expand Down
35 changes: 26 additions & 9 deletions src/main/scala/org/moe/runtime/nativeobjects/MoeHashObject.scala
Expand Up @@ -15,27 +15,44 @@ class MoeHashObject(

// Runtime methods

def at_key(k: MoeStrObject): MoeObject = {
hash.get(k.unboxToString.get).getOrElse(new MoeUndefObject())
def at_key(r: MoeRuntime, k: MoeStrObject): MoeObject = {
hash.get(k.unboxToString.get).getOrElse(r.NativeObjects.getUndef)
}

def bind_key(k: MoeStrObject, v: MoeObject): MoeObject = {
def bind_key(r: MoeRuntime, k: MoeStrObject, v: MoeObject): MoeObject = {
hash.put(k.unboxToString.get, v)
v
}

def keys: MoeObject = new MoeArrayObject(hash.keys.map(s => new MoeStrObject(s)).toList)
def exists(r: MoeRuntime, k: MoeStrObject): MoeBoolObject = {
if (hash.contains(k.unboxToString.get)) r.NativeObjects.getTrue else r.NativeObjects.getFalse
}

def slice(r: MoeRuntime, keys: List[MoeStrObject]) = r.NativeObjects.getArray(keys.map(at_key(r, _)))

def values: MoeObject = new MoeArrayObject(hash.values.map(x => x).toList)
def clear(r: MoeRuntime) = {
hash.clear()
r.NativeObjects.getUndef
}

def keys(r: MoeRuntime) = r.NativeObjects.getArray(
hash.keys.map(s => r.NativeObjects.getStr(s)).toList
)

def kv: MoeObject = new MoeArrayObject(
def values(r: MoeRuntime) = r.NativeObjects.getArray(hash.values.map(x => x).toList)

def pairs(r: MoeRuntime) = r.NativeObjects.getArray(
hash.toList.map(p => r.NativeObjects.getPair(p))
)

def kv(r: MoeRuntime) = r.NativeObjects.getArray(
hash.toList.map(
p => new MoeArrayObject(List(new MoeStrObject(p._1), p._2))
p => r.NativeObjects.getArray(
List(r.NativeObjects.getStr(p._1), p._2)
)
)
)

def pairs: MoeObject = new MoeArrayObject(hash.toList.map(p => new MoePairObject(p)))

// MoeObject overrides

override def isFalse: Boolean = getNativeValue.size == 0
Expand Down

0 comments on commit 176b662

Please sign in to comment.