diff options
author | Ian Hinder <ian.hinder@aei.mpg.de> | 2013-09-13 11:42:52 +0200 |
---|---|---|
committer | Ian Hinder <ian.hinder@aei.mpg.de> | 2013-09-13 11:42:52 +0200 |
commit | 9347b58f09437c0c9e0ff86249f693c85a1212dd (patch) | |
tree | b7b23650cb14a08ae4b003638c5f9dd337beda59 | |
parent | 03496443003f6d1f9645b6dfe1d0baccb0fbd6b9 (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.mt | 71 | ||||
-rw-r--r-- | Tools/CodeGen/Object.m | 67 |
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[]; |