aboutsummaryrefslogtreecommitdiff
path: root/Tools/CodeGen/Object.m
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/CodeGen/Object.m')
-rw-r--r--Tools/CodeGen/Object.m67
1 files changed, 67 insertions, 0 deletions
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[];