diff options
Diffstat (limited to 'Tools')
-rw-r--r-- | Tools/CodeGen/Object.m | 67 |
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[]; |