aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Hinder <ian.hinder@aei.mpg.de>2013-09-13 11:42:52 +0200
committerIan Hinder <ian.hinder@aei.mpg.de>2013-09-13 11:42:52 +0200
commit9347b58f09437c0c9e0ff86249f693c85a1212dd (patch)
treeb7b23650cb14a08ae4b003638c5f9dd337beda59
parent03496443003f6d1f9645b6dfe1d0baccb0fbd6b9 (diff)
Add new Object package
Currently performs no error checking, but this can be added later. The plan is to also add a schema for each class.
-rw-r--r--Tests/Object.mt71
-rw-r--r--Tools/CodeGen/Object.m67
2 files changed, 138 insertions, 0 deletions
diff --git a/Tests/Object.mt b/Tests/Object.mt
new file mode 100644
index 0000000..3345fb2
--- /dev/null
+++ b/Tests/Object.mt
@@ -0,0 +1,71 @@
+
+(* Mathematica Test File *)
+
+
+(****************************************************************)
+(* NewObject *)
+(****************************************************************)
+
+Test[
+ NewObject[Obj, {}]
+ ,
+ Obj[]
+ ,
+ TestID->"NewObject-Empty"
+]
+
+Test[
+ NewObject[Obj, {"Key" -> 1}]
+ ,
+ Obj["Key" -> 1]
+ ,
+ TestID->"NewObject-OneKey"
+]
+
+Test[
+ NewObject[Obj, {"Key1" -> 1, "Key2" -> 2}]
+ ,
+ Obj["Key1" -> 1, "Key2" -> 2]
+ ,
+ TestID->"NewObject-TwoKeys"
+]
+
+Test[
+ SetObjectField[NewObject[Obj, {"Key1" -> 1, "Key2" -> 2}], "Key1", 3]
+ ,
+ Obj["Key1" -> 3, "Key2" -> 2]
+ ,
+ TestID->"SetObjectField-Existing"
+]
+
+Test[
+ SetObjectField[NewObject[Obj, {"Key1" -> 1, "Key2" -> 2}], "Key3", 3]
+ ,
+ Obj["Key1" -> 1, "Key2" -> 2, "Key3" -> 3]
+ ,
+ TestID->"SetObjectField-New"
+]
+
+Test[
+ GetObjectField[NewObject[Obj, {"Key1" -> 1, "Key2" -> 2}], "Key1"]
+ ,
+ 1
+ ,
+ TestID->"GetObjectField-Exists"
+]
+
+Test[
+ AppendObjectField[NewObject[Obj, {"Key1" -> {}, "Key2" -> 2}], "Key1", 1]
+ ,
+ Obj["Key1" -> {1}, "Key2" -> 2]
+ ,
+ TestID->"AppendObjectField-Exists"
+]
+
+Test[
+ JoinObjectField[NewObject[Obj, {"Key1" -> {}, "Key2" -> 2}], "Key1", {1}]
+ ,
+ Obj["Key1" -> {1}, "Key2" -> 2]
+ ,
+ TestID->"JoinObjectField-Exists"
+]
diff --git a/Tools/CodeGen/Object.m b/Tools/CodeGen/Object.m
new file mode 100644
index 0000000..957af54
--- /dev/null
+++ b/Tools/CodeGen/Object.m
@@ -0,0 +1,67 @@
+
+(* Copyright 2013 Ian Hinder
+
+ This file is part of Kranc.
+
+ Kranc is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ Kranc is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Kranc; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*)
+
+BeginPackage["Object`", {"Errors`", "Helpers`", "Kranc`"}];
+
+NewObject;
+SetObjectField;
+GetObjectField;
+AppendObjectField;
+JoinObjectField;
+
+Begin["`Private`"];
+
+(* Low-level functions *)
+
+DefFn[
+ NewObject[class_Symbol, initList_List] :=
+ Apply[class, initList]];
+
+DefFn[
+ keys[obj_] :=
+ Sort[Map[First, obj]]];
+
+DefFn[
+ hasValueQ[obj_, field_] :=
+ MemberQ[keys[obj], field]];
+
+DefFn[
+ SetObjectField[obj_, field_String, value_] :=
+ If[Length[Cases[obj, HoldPattern[field -> _]]] > 0,
+ Replace[obj, (field -> _) :> field -> value, {1}],
+ Append[obj, field -> value]]];
+
+DefFn[
+ GetObjectField[obj_, field_String] :=
+ Cases[obj, (field -> value_) :> value][[1]]];
+
+(* High level functions *)
+
+DefFn[
+ AppendObjectField[obj_, field_String, value_] :=
+ SetObjectField[obj, field, Append[GetObjectField[obj, field], value]]];
+
+DefFn[
+ JoinObjectField[obj_, field_String, values_List] :=
+ SetObjectField[obj, field, Join[GetObjectField[obj, field], values]]];
+
+End[];
+
+EndPackage[];