aboutsummaryrefslogtreecommitdiff
path: root/desiredata/extra/pureunity
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2008-02-08 13:00:32 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2008-02-08 13:00:32 +0000
commit4d84d14ac1aa13958eaa2971b03f7f929a519105 (patch)
tree6579d3f2cea5410a10c4baac8d0f372fb0dff372 /desiredata/extra/pureunity
parentb334d38aefbd8e0e159d7af6c20d63c5d2b64859 (diff)
reorganized
svn path=/trunk/; revision=9400
Diffstat (limited to 'desiredata/extra/pureunity')
-rw-r--r--desiredata/extra/pureunity/2times.pd31
-rw-r--r--desiredata/extra/pureunity/3times.pd40
-rw-r--r--desiredata/extra/pureunity/4times.pd49
-rw-r--r--desiredata/extra/pureunity/COPYING340
-rw-r--r--desiredata/extra/pureunity/ChangeLog23
-rw-r--r--desiredata/extra/pureunity/Makefile19
-rw-r--r--desiredata/extra/pureunity/README624
-rw-r--r--desiredata/extra/pureunity/^.pd25
-rw-r--r--desiredata/extra/pureunity/antireflexive-test.pd13
-rw-r--r--desiredata/extra/pureunity/antisymmetric-test.pd4
-rw-r--r--desiredata/extra/pureunity/arith-test.pd76
-rw-r--r--desiredata/extra/pureunity/associative-test.pd32
-rw-r--r--desiredata/extra/pureunity/associator.pd38
-rw-r--r--desiredata/extra/pureunity/commutative-test.pd39
-rw-r--r--desiredata/extra/pureunity/commutator.pd41
-rw-r--r--desiredata/extra/pureunity/comparators-test.pd65
-rw-r--r--desiredata/extra/pureunity/distributive-test.pd32
-rw-r--r--desiredata/extra/pureunity/distributor.pd46
-rw-r--r--desiredata/extra/pureunity/equivalence-test.pd14
-rw-r--r--desiredata/extra/pureunity/glue-test.pd15
-rw-r--r--desiredata/extra/pureunity/invertible-test.pd31
-rw-r--r--desiredata/extra/pureunity/invertor.pd30
-rw-r--r--desiredata/extra/pureunity/locale/english.tcl56
-rw-r--r--desiredata/extra/pureunity/main.pd90
-rw-r--r--desiredata/extra/pureunity/norm.#.pd8
-rw-r--r--desiredata/extra/pureunity/norm.f.pd8
-rw-r--r--desiredata/extra/pureunity/norm.~.pd8
-rw-r--r--desiredata/extra/pureunity/op2.#.pd8
-rw-r--r--desiredata/extra/pureunity/op2.f.pd8
-rw-r--r--desiredata/extra/pureunity/op2.~.pd8
-rw-r--r--desiredata/extra/pureunity/operator1-rule.pd11
-rw-r--r--desiredata/extra/pureunity/operator1-test.pd5
-rw-r--r--desiredata/extra/pureunity/operator2-rule.pd10
-rw-r--r--desiredata/extra/pureunity/operator2-test.pd10
-rw-r--r--desiredata/extra/pureunity/packunpack3.#.pd18
-rw-r--r--desiredata/extra/pureunity/packunpack3.f.pd16
-rw-r--r--desiredata/extra/pureunity/packunpack3.~.pd10
-rw-r--r--desiredata/extra/pureunity/partialorder-test.pd14
-rw-r--r--desiredata/extra/pureunity/partialordereq-test.pd14
-rw-r--r--desiredata/extra/pureunity/protocols-tree.pd65
-rw-r--r--desiredata/extra/pureunity/pureunity.c37
-rw-r--r--desiredata/extra/pureunity/rand.#.pd42
-rw-r--r--desiredata/extra/pureunity/rand.f.pd40
-rw-r--r--desiredata/extra/pureunity/rand.~.pd22
-rw-r--r--desiredata/extra/pureunity/reflexive-test.pd13
-rw-r--r--desiredata/extra/pureunity/swap.#.pd14
-rw-r--r--desiredata/extra/pureunity/swap.f.pd10
-rw-r--r--desiredata/extra/pureunity/swap.~.pd7
-rw-r--r--desiredata/extra/pureunity/taa.#.pd8
-rw-r--r--desiredata/extra/pureunity/taa.f.pd8
-rw-r--r--desiredata/extra/pureunity/taa.~.pd6
-rw-r--r--desiredata/extra/pureunity/totalorder-test.pd11
-rw-r--r--desiredata/extra/pureunity/totalordereq-test.pd11
-rw-r--r--desiredata/extra/pureunity/transitive-test.pd4
-rw-r--r--desiredata/extra/pureunity/tree.pd20
-rw-r--r--desiredata/extra/pureunity/trichotomy-test.pd32
56 files changed, 2279 insertions, 0 deletions
diff --git a/desiredata/extra/pureunity/2times.pd b/desiredata/extra/pureunity/2times.pd
new file mode 100644
index 00000000..5f3eeecd
--- /dev/null
+++ b/desiredata/extra/pureunity/2times.pd
@@ -0,0 +1,31 @@
+#N canvas 330 193 379 266 10;
+#X obj 20 16 inlet;
+#X obj 69 108 inlet;
+#X obj 108 108 inlet;
+#X obj 85 54 t a a;
+#X obj 20 35 route bang;
+#X obj 20 54 t b b;
+#X obj 118 211 pack s s;
+#X obj 46 209 pack 0 0;
+#X obj 46 241 outlet;
+#X obj 46 130 \$1 \$2;
+#X obj 85 130 \$1 \$3;
+#X obj 85 170 route float;
+#X obj 46 190 route float;
+#X connect 0 0 4 0;
+#X connect 1 0 9 1;
+#X connect 2 0 10 1;
+#X connect 3 0 9 0;
+#X connect 3 1 10 0;
+#X connect 4 0 5 0;
+#X connect 4 1 3 0;
+#X connect 5 0 9 0;
+#X connect 5 1 10 0;
+#X connect 6 0 8 0;
+#X connect 7 0 8 0;
+#X connect 9 0 12 0;
+#X connect 10 0 11 0;
+#X connect 11 0 7 1;
+#X connect 11 1 6 1;
+#X connect 12 0 7 0;
+#X connect 12 1 6 0;
diff --git a/desiredata/extra/pureunity/3times.pd b/desiredata/extra/pureunity/3times.pd
new file mode 100644
index 00000000..706d41db
--- /dev/null
+++ b/desiredata/extra/pureunity/3times.pd
@@ -0,0 +1,40 @@
+#N canvas 330 193 379 266 10;
+#X obj 20 16 inlet;
+#X obj 69 108 inlet;
+#X obj 108 108 inlet;
+#X obj 20 35 route bang;
+#X obj 46 241 outlet;
+#X obj 46 130 \$1 \$2;
+#X obj 85 130 \$1 \$3;
+#X obj 85 170 route float;
+#X obj 46 190 route float;
+#X obj 20 54 t b b b;
+#X obj 147 108 inlet;
+#X obj 124 130 \$1 \$4;
+#X obj 124 150 route float;
+#X obj 118 211 pack s s s;
+#X obj 46 209 pack 0 0 0;
+#X obj 85 54 t a a a;
+#X connect 0 0 3 0;
+#X connect 1 0 5 1;
+#X connect 2 0 6 1;
+#X connect 3 0 9 0;
+#X connect 3 1 15 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 14 1;
+#X connect 7 1 13 1;
+#X connect 8 0 14 0;
+#X connect 8 1 13 0;
+#X connect 9 0 5 0;
+#X connect 9 1 6 0;
+#X connect 9 2 11 0;
+#X connect 10 0 11 1;
+#X connect 11 0 12 0;
+#X connect 12 0 14 2;
+#X connect 12 1 13 2;
+#X connect 13 0 4 0;
+#X connect 14 0 4 0;
+#X connect 15 0 5 0;
+#X connect 15 1 6 0;
+#X connect 15 2 11 0;
diff --git a/desiredata/extra/pureunity/4times.pd b/desiredata/extra/pureunity/4times.pd
new file mode 100644
index 00000000..ed5f3f41
--- /dev/null
+++ b/desiredata/extra/pureunity/4times.pd
@@ -0,0 +1,49 @@
+#N canvas 330 193 381 323 10;
+#X obj 20 16 inlet;
+#X obj 69 108 inlet;
+#X obj 108 108 inlet;
+#X obj 20 35 route bang;
+#X obj 46 261 outlet;
+#X obj 46 130 \$1 \$2;
+#X obj 85 130 \$1 \$3;
+#X obj 85 190 route float;
+#X obj 46 210 route float;
+#X obj 147 108 inlet;
+#X obj 124 130 \$1 \$4;
+#X obj 124 170 route float;
+#X obj 20 54 t b b b b;
+#X obj 85 54 t a a a a;
+#X obj 187 108 inlet;
+#X obj 164 130 \$1 \$5;
+#X obj 134 229 pack s s s s;
+#X obj 46 229 pack 0 0 0 0;
+#X obj 164 150 route float;
+#X connect 0 0 3 0;
+#X connect 1 0 5 1;
+#X connect 2 0 6 1;
+#X connect 3 0 12 0;
+#X connect 3 1 13 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 17 1;
+#X connect 7 1 16 1;
+#X connect 8 0 17 0;
+#X connect 8 1 16 0;
+#X connect 9 0 10 1;
+#X connect 10 0 11 0;
+#X connect 11 0 17 2;
+#X connect 11 1 16 2;
+#X connect 12 0 5 0;
+#X connect 12 1 6 0;
+#X connect 12 2 10 0;
+#X connect 12 3 15 0;
+#X connect 13 0 5 0;
+#X connect 13 1 6 0;
+#X connect 13 2 10 0;
+#X connect 13 3 15 0;
+#X connect 14 0 15 1;
+#X connect 15 0 18 0;
+#X connect 16 0 4 0;
+#X connect 17 0 4 0;
+#X connect 18 0 17 3;
+#X connect 18 1 16 3;
diff --git a/desiredata/extra/pureunity/COPYING b/desiredata/extra/pureunity/COPYING
new file mode 100644
index 00000000..eeb586b3
--- /dev/null
+++ b/desiredata/extra/pureunity/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program 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.
+
+ This program 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 this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/desiredata/extra/pureunity/ChangeLog b/desiredata/extra/pureunity/ChangeLog
new file mode 100644
index 00000000..3f7bfd54
--- /dev/null
+++ b/desiredata/extra/pureunity/ChangeLog
@@ -0,0 +1,23 @@
+$Id: ChangeLog,v 1.1.2.2 2007-01-05 02:21:13 matju Exp $
+
+version 0.40.pre6 (2007.01.04):
+ * requires 0.40
+ * goes into DesireData pre6
+ * swap the order in the name of class templates
+
+
+version 0.0 (2006.01.06):
+ * LICENSE is GPL
+ * doc is in README
+ * new object classes:
+ * [commutator], [commutative-test]
+ * [associator], [associative-test]
+ * [invertor], [invertible-test]
+ * [distributor], [distributive-test]
+ * [trichotomy-test], ...
+ * [twice], [3times], [4times], [^]
+ * [tree], [protocols-tree]
+ * [rtimer]
+ * for $1 in f,~ and some of #:
+ [$1.norm], [$1.taa], [$1.do], [$1.packunpack3], [$1.swap]
+ [$1.inlet], [$1.outlet]
diff --git a/desiredata/extra/pureunity/Makefile b/desiredata/extra/pureunity/Makefile
new file mode 100644
index 00000000..a9e9ec88
--- /dev/null
+++ b/desiredata/extra/pureunity/Makefile
@@ -0,0 +1,19 @@
+# if you don't want the standard pd, set the PD-variable before doing "make"
+# e.g. "PD=/home/matju/pd_devel_0_39_und/bin/pd make"
+ PD ?= pd
+#PD ?= desire
+PDFLAGS = -lib pureunity -noaudio
+PDFLAGS += -lib gridflow
+CFLAGS = -Wall
+
+test:: built
+ $(PD) $(PDFLAGS) main.pd
+
+built: Makefile pureunity.pd_linux
+ echo > built
+
+generic/%~.pd: generic/%.pd
+
+pureunity.pd_linux: pureunity.c Makefile
+ $(CC) $(CFLAGS) -shared -o pureunity.pd_linux pureunity.c
+
diff --git a/desiredata/extra/pureunity/README b/desiredata/extra/pureunity/README
new file mode 100644
index 00000000..a3990537
--- /dev/null
+++ b/desiredata/extra/pureunity/README
@@ -0,0 +1,624 @@
+$Id: README,v 1.1.2.2 2007-06-01 16:31:54 matju Exp $
+
+PureUnity
+
+Copyright 2006 by Mathieu Bouchard <matju à artengine point ca>
+
+This program 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.
+
+See file ./COPYING for further informations on licensing terms.
+
+This program 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 this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
++-+-+--+---+-----+--------+-------------+---------------------+
+GOALS
+
+ 1. To provide a unit-test framework, which also provide benchmarking
+ features, all made in Pd for use in Pd.
+
+ 2. To provide tests for functionality in internals, externals, abstractions,
+ etc., in a modularized way, in a DRY/OAOO fashion, thus abstracting out
+ common features so that many objects share the same test patch for the
+ features that they have in common.
+
++-+-+--+---+-----+--------+-------------+---------------------+
+REQUIREMENTS
+
+ 1. Pd 0.39 (PureMSP or Devel)
+
++-+-+--+---+-----+--------+-------------+---------------------+
+TEST PROTOCOL
+
+ new:
+ create common (reusable) fixtures.
+
+ inlet 0:
+ bang:
+ run all available tests in that class. individual tests don't have
+ to be available through individual methods but may. If they do, the
+ names of the methods must match those given in the test results.
+
+ each test should build its own non-reusable fixtures and reinitialize
+ common fixtures, not assuming that the previous tests have left the
+ common fixtures in a normal state.
+
+ outlet 0:
+ test results. a sequence of lists like:
+ list $passed? $accuracy $elapsed $name1 ...
+
+ where:
+ $passed? is either 0 for failure or 1 for success
+ $accuracy is a float proportional to relative error on math
+ (if not applicable, use 0)
+ $elapsed is a nonnegative float, the time elapsed in milliseconds
+ or it is any negative float meaning the time hasn't been measured.
+ $name1 and the rest are symbols and/or floats identifying the test
+
+ for example:
+ list 1 0 -1 commutative f + *
+
+ Which means that the 1st test about commutativity passed ($2=1) because it
+ was perfectly accurate ($3==0) and that we didn't measure the time ($4=-).
+
++-+-+--+---+-----+--------+-------------+---------------------+
+SEVERITIES (in decreasing order)
+
+ * crash: Segmentation Fault, Bus Error, Illegal Instruction, Infinite Loop,
+ etc. You can't deal with those errors at the level of the tests. Maybe there
+ should be a way to tell a test object to skip certain tests, by name, in
+ order to be able to perform as many tests as possible while waiting for a
+ fix. It could become possible to rescue from some of those crashes if Pd
+ supported exceptions (stack-unwinding).
+
+ * corruption: this may cause future crashes and failures on innocent
+ objects/features. I have no solution for this except to be careful.
+
+ * post(),error(),pd_error(): Gets printed in the console. The problem is that
+ those can't be handled by the test objects, so someone has to read them and
+ interpret them. Also they prevent test objects to ensure that error
+ conditions produce error messages. This includes stack overflow.
+
+ * pd_error2(): I wish this would exist. It would be sort of like pd_error()
+ but it would produce a pd message instead, whose selector would be an
+ error code, designed to be both localizable and [route]able. By default, that
+ message would be sent to the console, but there would be an internal class
+ designed to catch those messages. (If stack-unwinding were possible, it would
+ be disabled by default on pd_error2 and could be enabled explicitly
+ by-selector).
+
+ * failure: a test object reports a problem through outlet 0.
+
+ * dropout: a failure in realtimeness... difficult for an object to detect.
+
+ * inaccuracy: a test more or less succeeds but the test detected that the
+ epsilon sucks.
+
++-+-+--+---+-----+--------+-------------+---------------------+
+PROTOCOL FOR [error]
+
+new:
+ optional argument which would either be a float
+ (e.g. the $0 of the enclosing abstraction) or a pointer.
+
+inlet 0:
+ set $scapegoat:
+ replaces the originator of the message by $scapegoat, which can be a
+ float or a pointer
+
+ error $1 ...:
+ causes its arguments to be concatenated, space-separated (may include
+ floats), and then sent through pd_error using the appropriate
+ originator (scapegoat).
+
+ list $1 ...:
+ for future use. would use pd_error2() (see README or previous mail).
+ $1 has to be a symbol.
+
++-+-+--+---+-----+--------+-------------+---------------------+
+ACCURACY AND ERROR (in math-related unit tests)
+
+The "absolute error" between a practical result and the expected value
+is considered to be the distance between the two value. That is the
+absolute value of the difference.
+
+In the case of positions in 2D, 3D, etc., use the L2-Norm which is
+a generalized Pythagoras' Theorem: dist^2 = x^2 + y^2 + z^2 + ...
+A norm is a distance between something and zero.
+
+Sometimes you have several practical results for one expected value
+and must extract a single absolute error out of that. Then you should pick
+the largest of the individual absolute errors.
+
+Sometimes you don't have an expected value, you just have several
+practical results that you expect to be quite the same. In that case,
+the absolute error is the "diameter" of those results. The meaning
+of diameter here is: the largest distance between any two results.
+
+If in a single test you must compare 2D errors with 3D errors and 1D
+errors, etc., you may have to adjust them by dividing the error by
+the square root of N (N is the number of dimensions). In that case,
+the resulting value is called a RMS (Root-Mean-Square).
+
+The maximum error introduced by just representing a number as a float
+(instead of an exact value) is at most proportional to the magnitude
+of the number (e.g. usually 16 million times smaller: about 6 decimals).
+Also, often we are only interested in relative error, which is absolute
+error divided by the norm of the expected result, because small absolute
+errors don't matter much with large results. This is the reason floats
+exist in the first place. By default, use relative error as the $accuracy
+in Pd tests.
+
+If you don't have an expected result, then compute the relative error as
+being the absolute error divided by the norm of the average of practical
+results.
+
+In the RMS case of relative error, the norms of expected results should also
+be adjusted, but both adjustments cancel because they get divided by each
+other. That means: don't divide by the sqrt(N) at all and you'll get an
+appropriate result.
+
++-+-+--+---+-----+--------+-------------+---------------------+
+TYPE PREFIXES
+
+Those have to be prefixes in order to be honored by DOLLSYM:
+[$1norm] should expand to [fnorm], [lfnorm], [#norm], etc.
+
+Those prefixes are necessary in order to achieve polymorphism through
+abstraction arguments.
+
+CURRENT:
+ f float
+ ~ signal
+
+FUTURE (from PureData):
+ s symbol
+ p gpointer
+ a anything
+ l list (of whatever)
+ lf list of floats
+ ls list of symbols
+ lp list of pointers
+
+FUTURE (from DesireData):
+ L listpointer (still trying to figure out whether this will really happen)
+ v varpointer (instance symbol)
+
+FUTURE (from GridFlow):
+ # grid (of whatever)
+ #b grid of bytes (uint8)
+ #s grid of shorts (int16)
+ #i grid of ints (int32)
+ #l grid of longs (int64)
+ #f grid of floats (float32)
+ #d grid of doubles (float64)
+ #t grid of Tcl_Object or t_atom or I don't know what.
+
+for a type prefix to be considered implemented, it has to
+have the following class set:
+
+ metaabstraction for floats for signals for grids
+ [inlet.$1] [inlet] [inlet~] [inlet]
+ [outlet.$1] [outlet] [outlet~] [outlet]
+ [op2.$1 $2 $3] [$2 $3] [$2~ $3] [# $2 $3]
+ [taa.$1] [t a a] noop [t a a]
+ [swap.$1] [swap] noop TODO
+ [norm.$1] [abs] [env~] [# sq]->[#ravel]->[#fold +]->[#export]->[sqrt]
+ [packunpack3.$1] pack,unpack noop TODO
+ [rand.$1] ..................................
+
+The first two cannot be implemented as abstractions and instead must be
+defined as aliases in pureunity.c.
+
+extra metaabstractions:
+ [$1.rand] [f.rand] [~.rand]TODO [#.rand]TODO
+
++-+-+--+---+-----+--------+-------------+---------------------+
+OTHER PROTOCOLS
+
+Those four classes are operators that give verify algebraic properties
+of other operators. The more their outputs are close to zero, the more
+those other operators are faithful to an algebraic property.
+
+(here, supported $types are f and ~)
+
+[commutator $type $class] (2 inlets) ab-ba
+[associator $type $class] (2 inlets) (ab)c-a(bc)
+[distributor $type $class1 $class2] (3 inlets) a&(b^c)-(a&b^a&c)
+[invertor $type $class1 $class2] (2 inlets) ab/b-a
+
++-+-+--+---+-----+--------+-------------+---------------------+
+TESTS AND RULES
+
+For each class, a test file's name is the class name followed by "-test.pd",
+and a rule file's name is the class name followed by "-rule.pd",
+in the same way as it is for help files.
+
+for a class called $foo, the protocol (aka interface aka rule) $foo is the
+set of behaviours expected from the $foo class; the class called $foo-rule
+must repect the $foo protocol as well, plus it should test that the inputs
+are valid, and if they are, it should test for one or several results and
+report any errors.
+
+To report errors and inaccuracies, output them through the properties outlet
+at the right. If there is no properties outlet in $foo (curently almost
+nothing in Pd has one), then $foo-rule must have one more outlet than $foo.
+
+Float messages coming out of the properties outlet of $foo-rule report
+accuracy. Named error messages come out with selector "error" followed by
+an error-symbol and then its arguments.
+
+In the case of true/false logic, a value of 0 means that a test has passed
+and a 1 means that a test has failed. Those values represent failure and not
+success. The reason is so that it matches with accuracy levels, where 0 is
+perfectly accurate, but any inaccuracy shows up as a relative error fraction.
+Any finite nonnegative value is allowed for accuracy, because it is expected
+to be the result of a norm.
+
+In standard math, "Discrete Metric" is when there are only two possible
+distances between objects: together=0 and apart=1
+
++-+-+--+---+-----+--------+-------------+---------------------+
+RANDOMIZERS (?)
+
++-+-+--+---+-----+--------+-------------+---------------------+
+ETC
+
+(write me!)
+
+If +-test.pd tests [+], it can test for hotness, coldness, it can test
+that only one result is produced per hot message, that all results are
+float, that a few example additions work, and that with random inputs it
+respects commutativity, associativity, invertibility, within appropriate
+relative-error bounds, etc.
+
+However +-test.pd can't test that errormessages aren't printed during the
+testing. This may be something that we want to check for, and currently
+the best way to handle it is to search the console for error messages, and
+if there are any, restart the tests in verbose mode and see where the
+error happens exactly.
+
+[...]
+
+Floating-point is the scientific notation for numbers that we all
+learned on paper in school. Rounding and inaccuracy are two sides
+of the same coin. They are required when it is stupid to have perfect
+results, that is, when it would mean too many computations for little
+gain.
+
+However sometimes we want to make sure that our math is accurate enough.
+Many algorithms are data-recursive: each computation uses previous
+results. Many of those algorithms have chaotic and/or unstable
+behaviours, which means that the inaccuracies may skyrocket instead of
+fading out.
+
++-+-+--+---+-----+--------+-------------+---------------------+
+
+Date: Fri, 13 Jan 2006 04:07:59 +0900
+From: Mathieu Bouchard <matju@artengine.ca>
+Reply-To: ruby-core@ruby-lang.org
+To: ruby-core@ruby-lang.org
+Subject: Re: Design contracts and refactoring (was Re: mathn: ugly warnings)
+
+On Fri, 13 Jan 2006, mathew wrote:
+
+> *Dean Wampler *<deanwampler gmail.com> writes:
+> > Let me suggest an XP-style alternative; make thorough unit tests
+> > required and make sure they "document" - and test! - the design
+> > "contract".
+> Unit tests are not an alternative. They are an additional requirement.
+
+I find unit-tests to be often decomposable like this. Start with something
+like this:
+
+ raise if Blah.new(666) != Blah.new(666)
+ raise if Blah.new(747) != Blah.new(747)
+ raise if Blah.new(242) != Blah.new(242)
+ raise if Blah.new(69) != Blah.new(69)
+ raise if Blah.new(37) != Blah.new(37)
+
+then generalize it ("equality is defined based on the arg of .new"):
+
+ for x in [666,747,242,69,37] do
+ raise if Blah.new(x) != Blah.new(x)
+ end
+
+then extract a contract from it:
+
+ class CheckedBlah < Blah
+ def self.new(x)
+ r = super(x)
+ raise if r != super(x)
+ r
+ end
+ end
+
+so now all Blah object creation may be checked throughout actual uses of a
+program and not just unit tests. The unit test now reduces to:
+
+ for x in [666,747,242,69,37] do Blah.new(x) end
+
+so for many unit tests, all you have to do is just do things and discard
+the results, and the contract will do the job of checking.
+
+ _ _ __ ___ _____ ________ _____________ _____________________ ...
+| Mathieu Bouchard - tél:+1.514.383.3801 - http://artengine.ca/matju
+| Freelance Digital Arts Engineer, Montréal QC Canada
+
++-+-+--+---+-----+--------+-------------+---------------------+
+
+Date: Fri, 13 Jan 2006 05:05:19 +0900
+From: Mathieu Bouchard <matju@artengine.ca>
+Reply-To: ruby-core@ruby-lang.org
+To: ruby-core@ruby-lang.org
+Subject: Re: Design contracts and refactoring (was Re: mathn: ugly warnings)
+
+On Fri, 13 Jan 2006, mathew wrote:
+
+> For example, consider a simple vector addition routine in a 3D library.
+> The unit tests might test its behavior with Float and Integer vectors,
+> since that's why it was written.
+
+Here's another way to factor unit-tests that I haven't mentioned in the
+last mail.
+
+suppose you test for + using:
+
+ class IntegerTest
+ def test; 2+2==4 or raise; end
+ end
+ class FloatTest
+ def test; 2.0+2.0==4.0 or raise; end
+ end
+ class RationalTest
+ def test; Rational(2,1)+Rational(2,1)==Rational(4,1) or raise; end
+ end
+
+you can refactor those tests like this:
+
+ class NumericTest
+ def initialize nt; @nt; end
+ def make x; raise "abstract class" end
+ def test; make(2)+make(2)==make(4) or raise; end
+ end
+ class IntegerTest; def make x; Integer(x) end end
+ class FloatTest; def make x; Float(x) end end
+ class RationalTest; def make x; Rational(x,1) end end
+
+> However, to do that you need to know whether the feature of supporting
+> (say) Complex vectors or BigDecimal vectors is intended or not. The unit
+> tests won't tell you this.
+
+[...]
+
+> > One limitation of documentation is that it has no enforcement power,
+> > so you have to write tests anyway to test conformance.
+> Unit tests have no enforcement power either, because you can just change the
+> test. Indeed, I've already had to do this once when it turned out that the
+> unit test was wrong. (In net/ftp.)
+
+That was a pretty bad case of strawman argument. Dean was assuming that
+your documentation was not executable when you had quite clearly stated
+that it was the contracts that acted as documentation!
+
+[...]
+
++-+-+--+---+-----+--------+-------------+---------------------+
+
+Date: Fri, 13 Jan 2006 07:36:36 +0900
+From: Mathieu Bouchard <matju@artengine.ca>
+Reply-To: ruby-core@ruby-lang.org
+To: ruby-core@ruby-lang.org
+Subject: Re: Design contracts and refactoring (was Re: mathn: ugly warnings)
+
+On Fri, 13 Jan 2006, mathew wrote:
+
+> > The XP view is
+> > that you should eliminate the redundancy.
+> Except it's not redundancy.
+> Unit tests define a set of functionality that is required. Documentation tells
+> you the functionality that is supported, which is generally a superset of the
+> functionality required by the unit tests.
+
+Let's follow the argument of both of you to the end.
+
+1. Unit-tests often match inputs with outputs on a case-by-case basis.
+
+2. Redundancy should be eliminated.
+
+(1) suggests that there is a shorter way to express the unit-tests.
+Suppose you are able to find a formula for generating output-validators
+from inputs. Then that formula is a postcondition of a contract, and the
+explicit output-validators of the unit-tests are redundant.
+
+(2) because part of the unit-tests are redundant, part of the unit-tests
+should be eliminated. This causes the postconditions to become an
+essential part of unit-testing.
+
+Unit-tests vs contracts is a false debate.
+
+ _ _ __ ___ _____ ________ _____________ _____________________ ...
+| Mathieu Bouchard - tél:+1.514.383.3801 - http://artengine.ca/matju
+| Freelance Digital Arts Engineer, Montréal QC Canada
+
+
++-+-+--+---+-----+--------+-------------+---------------------+
+Date: Fri, 13 Jan 2006 17:19:41 +0900
+From: Mathieu Bouchard <matju@artengine.ca>
+Reply-To: ruby-core@ruby-lang.org
+To: ruby-core@ruby-lang.org
+Subject: Re: Design contracts and refactoring (was Re: mathn: ugly warnings)
+
+[...]
+
+In order to entrench the tests-as-documentation habit firmly in the Ruby
+community, we need a catchy acronym. Like RTFUT = Read the Fabulous Unit
+Tests!
+
++-+-+--+---+-----+--------+-------------+---------------------+
+http://lists.puredata.info/pipermail/pd-dev/2006-01/005920.html
+Date: Fri, 20 Jan 2006 23:52:22 -0500 (EST)
+From: Mathieu Bouchard <matju@artengine.ca>
+To: pd-dev <pd-dev@iem.at>
+Subject: macros and such (was: pd-lib, SIMD)
+
+[...]
+
+I think that the Pd source doesn't use nearly enough macros or other
+code-reducing tricks.
+
+The reduction of code isn't so much about making things use less RAM: the
+RAM excuse is quickly evaporating as even the tiniest computers come with
+plenty of RAM and even the faster kinds of RAM come in ever more copious
+amounts (big caches).
+
+The reduction of code is programmer-oriented. I'm not talking about length
+of identifiers here (this is a separate issue). Every line of code should
+do something interesting by itself. Code should read like a good story and
+not like a car. Ever tried to read a car? It's boring. The same damn
+piston copy-pasted 12 times.
+
+The reduction of code is also documentation-oriented. Once the programmer
+has been contaminated with the wisdom required to make small code or
+understand small code, then why wouldn't the programmer explain it to his
+students in higher-level terms instead of chanting 12 times the same
+piston as if it were a marathon of Hail-Marys ?
+
+This is why Pd needs a taxonomy of object classes. If I don't get that
+taxonomy in Pd itself nor in its help files, at least I'll have it in its
+unit tests.
+
+Once and only once.
+Once and only once.
+Once and only once.
+Three strikes and you refactor.
+for x in [1,2,3] say: Once and only once
+
+http://c2.com/cgi/wiki/?ThreeStrikesAndYouRefactor
+
+BTW I'm not talking about only inheritance of implementations. The most
+important thing to me is inheritance of expectations, so that if I name
+100 classes that obey the rule "Operator2", then you have just learned
+something common about 100 classes.
+
+Operator2 means right-inlet is cold, left-inlet is hot, there is a "set"
+method for using left-inlet as cold, there is a "bang" for explicitly
+activating the main computation. The main computation only produces one
+message. That's what "Operator2" means in my taxonomy, and it's that much
+that hasn't to be stated explicitly in each help patch.
+
+Help patches can be abstractions to be used to by other help patches. Just
+put a [operator2-help] object in your help patch to indicate that the
+currently documented class obeys the standard operator2 rules.
+
+Who's against it?
+
++-+-+--+---+-----+--------+-------------+---------------------+
+http://lists.puredata.info/pipermail/pd-list/2006-02/035169.html
+Date: Sat Feb 4 21:22:29 CET 2006
+From: Mathieu Bouchard <matju@artengine.ca>
+To: pd-list
+
+ * Previous message: [PD] dealing with arguments and inlets
+ * Next message: [PD] Re: [PD-announce] A new version of FFTease is now available for Pd
+ * Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
+
+On Fri, 3 Feb 2006, Hans-Christoph Steiner wrote:
+
+> The way I have been thinking is that the first inlet is the general
+> inlet, and it can accept many types of messages. Then the second inlet
+> lines up with the first argument, the third inlet to the second
+> argument, etc.
+
+I agree. Many objects obey the rule that the k'th inlet matches argument
+$k for several arguments in a row, usually all of them.
+
+> I think this is pretty clean and flexible, and I think
+> it would be nice to have some kind of standard for this.
+
+And the best way to make sure people are following a standard is to make
+it so easy to follow that it's harder to not follow it than to follow it.
+Of course I don't mean adding hurdles to doing it otherwise, but rather
+make a shortcut for those who follow the standard. Short of this, people
+who make abstractions/externals can get a friendly reminder, from someone
+who cares, that it would be better if they followed the standard.
+
+> Obviously, it doesn't work for all objects, but I think it would be good to
+> standardize on objects it does work for.
+
+PureUnity's goal (when I work on it) is to design a taxonomy that
+separates objects that obey certain properties, from those that don't,
+because that's a way to reuse tests, but also because certainly it doesn't
+hurt documentation either, and it's even better if it can influence how
+abstractions are made.
+
+ _ _ __ ___ _____ ________ _____________ _____________________ ...
+| Mathieu Bouchard - tél:+1.514.383.3801 - http://artengine.ca/matju
+| Freelance Digital Arts Engineer, Montréal QC Canada
+
++-+-+--+---+-----+--------+-------------+---------------------+
+From matju@artengine.ca to pd-list on Dec 18, 2006
+
+I thought up some kind of classification of type systems, avoiding to call
+them strong/weak or static/dynamic because those words are confusing.
+
+1. Typed expressions: each piece of code that can give a value, has a
+type that can be figured out at compile-time.
+
+2. Typed variables/parameters: declarations allow runtime checks but not
+compile-time checks.
+
+3. Typed values: variables don't have types, they can contain any value,
+but every value has a type.
+
+4. Typed uses: values don't have types, a type is a way of using a value.
+
+Strictness, in the sense of forbidding things to the user, is not on that
+scale, it's another aspect. A well-balanced strictness allows one to
+bypass the system whenever needed, but without being too error-prone.
+
+However it's difficult to say what it means to "bypass the system" for all
+four typing categories at once, or even within one category.
+
+
++-+-+--+---+-----+--------+-------------+---------------------+
+From matju@artengine.ca to pd-dev on Jan 2, 2007
+
+PureUnity will now require pd 0.40. This will make things easier, as for
+example the aliases [f.inlet], [~.inlet] can be renamed to [inlet.f] and
+[inlet.~], which makes those class-templates sortable alphabetically, and
+readable as "inlet of float" and "inlet of signal" or maybe "inlet for
+floats" and "inlet for signals"... likewise for all other existing
+templates of PureUnity (do,norm,outlet,packunpack3,rand,swap,taa).
+
+(here, "template" means "parametrized classname" as in C++, and not t_template)
+
++-+-+--+---+-----+--------+-------------+---------------------+
+Old pre-DesireData ChangeLog for PureUnity:
+
+version 0.0 (2006.01.06):
+ * LICENSE is GPL
+ * doc is in README
+ * new object classes:
+ * [commutator], [commutative-test]
+ * [associator], [associative-test]
+ * [invertor], [invertible-test]
+ * [distributor], [distributive-test]
+ * [trichotomy-test], ...
+ * [twice], [3times], [4times], [^]
+ * [tree], [protocols-tree]
+ * [rtimer]
+ * for $1 in f,~ and some of #:
+ [$1.norm], [$1.taa], [$1.do], [$1.packunpack3], [$1.swap]
+ [$1.inlet], [$1.outlet]
+
++-+-+--+---+-----+--------+-------------+---------------------+
diff --git a/desiredata/extra/pureunity/^.pd b/desiredata/extra/pureunity/^.pd
new file mode 100644
index 00000000..5050174f
--- /dev/null
+++ b/desiredata/extra/pureunity/^.pd
@@ -0,0 +1,25 @@
+#N canvas 0 0 361 237 10;
+#X obj 55 14 inlet;
+#X obj 55 154 outlet;
+#X obj 55 60 |;
+#X obj 85 60 &;
+#X obj 85 79 * -1;
+#X obj 85 98 + -1;
+#X obj 55 98 &;
+#X text 103 155 x or y but not both;
+#X text 112 61 both;
+#X text 118 89 not;
+#X text 30 98 but;
+#X text 9 61 either;
+#X obj 101 33 inlet;
+#X obj 55 33 t a a;
+#X connect 0 0 13 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 1;
+#X connect 6 0 1 0;
+#X connect 12 0 3 1;
+#X connect 12 0 2 1;
+#X connect 13 0 2 0;
+#X connect 13 1 3 0;
diff --git a/desiredata/extra/pureunity/antireflexive-test.pd b/desiredata/extra/pureunity/antireflexive-test.pd
new file mode 100644
index 00000000..7353dc64
--- /dev/null
+++ b/desiredata/extra/pureunity/antireflexive-test.pd
@@ -0,0 +1,13 @@
+#N canvas 0 0 450 164 10;
+#X obj 12 18 inlet;
+#X obj 12 118 outlet;
+#X obj 12 80 \$2;
+#X msg 12 37 2 2;
+#X obj 12 56 t a a;
+#X obj 12 99 == 0;
+#X connect 0 0 3 0;
+#X connect 2 0 5 0;
+#X connect 3 0 4 0;
+#X connect 4 0 2 0;
+#X connect 4 1 2 1;
+#X connect 5 0 1 0;
diff --git a/desiredata/extra/pureunity/antisymmetric-test.pd b/desiredata/extra/pureunity/antisymmetric-test.pd
new file mode 100644
index 00000000..0788ad61
--- /dev/null
+++ b/desiredata/extra/pureunity/antisymmetric-test.pd
@@ -0,0 +1,4 @@
+#N canvas 0 0 450 300 10;
+#X obj 12 18 inlet;
+#X obj 12 48 outlet;
+#X connect 0 0 1 0;
diff --git a/desiredata/extra/pureunity/arith-test.pd b/desiredata/extra/pureunity/arith-test.pd
new file mode 100644
index 00000000..6be56ea2
--- /dev/null
+++ b/desiredata/extra/pureunity/arith-test.pd
@@ -0,0 +1,76 @@
+#N canvas 69 22 726 501 10;
+#X text 78 136 Abelian Groups:;
+#X text 80 229 Abelian Monoids:;
+#X text 79 349 Rings (incl Fields):;
+#X obj 134 87 r \$0-b;
+#X obj 309 87 r \$0-b;
+#X obj 460 87 r \$0-b;
+#X obj 26 69 s \$0-b;
+#X obj 26 50 inlet bang;
+#X obj 14 464 r \$0-r;
+#X obj 14 483 outlet reports;
+#X obj 134 456 s \$0-r;
+#X obj 309 456 s \$0-r;
+#X obj 460 456 s \$0-r;
+#X obj 134 157 commutative-test \$1 +;
+#X obj 134 367 distributive-test \$1 + *;
+#X obj 134 177 commutative-test \$1 *;
+#X obj 134 197 commutative-test \$1 ^;
+#X obj 134 247 commutative-test \$1 &;
+#X obj 134 267 commutative-test \$1 |;
+#X obj 309 157 associative-test \$1 +;
+#X obj 460 157 invertible-test \$1 + -;
+#X text 17 11 This is the testclass for + \, - \, * \, / \, div \,
+pow \, % \, mod;
+#X obj 134 296 commutative-test \$1 min;
+#X obj 134 317 commutative-test \$1 max;
+#X text 18 25 And also for & \, | \, ^ \, min \, max;
+#X obj 134 387 distributive-test \$1 ^ &;
+#X obj 309 177 associative-test \$1 *;
+#X obj 309 247 associative-test \$1 &;
+#X obj 309 267 associative-test \$1 |;
+#X obj 309 197 associative-test \$1 ^;
+#X obj 309 296 associative-test \$1 min;
+#X obj 309 316 associative-test \$1 max;
+#X obj 460 177 invertible-test \$1 * /;
+#X obj 460 197 invertible-test \$1 ^ ^;
+#X connect 3 0 13 0;
+#X connect 3 0 14 0;
+#X connect 3 0 15 0;
+#X connect 3 0 16 0;
+#X connect 3 0 17 0;
+#X connect 3 0 18 0;
+#X connect 3 0 22 0;
+#X connect 3 0 23 0;
+#X connect 3 0 25 0;
+#X connect 4 0 19 0;
+#X connect 4 0 26 0;
+#X connect 4 0 27 0;
+#X connect 4 0 28 0;
+#X connect 4 0 29 0;
+#X connect 4 0 30 0;
+#X connect 4 0 31 0;
+#X connect 5 0 20 0;
+#X connect 5 0 32 0;
+#X connect 5 0 33 0;
+#X connect 7 0 6 0;
+#X connect 8 0 9 0;
+#X connect 13 0 10 0;
+#X connect 14 0 10 0;
+#X connect 15 0 10 0;
+#X connect 16 0 10 0;
+#X connect 17 0 10 0;
+#X connect 18 0 10 0;
+#X connect 19 0 11 0;
+#X connect 20 0 12 0;
+#X connect 22 0 10 0;
+#X connect 23 0 10 0;
+#X connect 25 0 10 0;
+#X connect 26 0 11 0;
+#X connect 27 0 11 0;
+#X connect 28 0 11 0;
+#X connect 29 0 11 0;
+#X connect 30 0 11 0;
+#X connect 31 0 11 0;
+#X connect 32 0 12 0;
+#X connect 33 0 12 0;
diff --git a/desiredata/extra/pureunity/associative-test.pd b/desiredata/extra/pureunity/associative-test.pd
new file mode 100644
index 00000000..80e3e0c5
--- /dev/null
+++ b/desiredata/extra/pureunity/associative-test.pd
@@ -0,0 +1,32 @@
+#N canvas 736 151 452 434 10;
+#X obj 40 15 inlet bang;
+#X obj 40 150 /;
+#X obj 40 169 t a a;
+#X text 167 24 with tolerance 0;
+#X obj 40 188 <= 0;
+#X text 167 9 This test verifies that (1+2)+3=1+(2+3);
+#X msg 40 34 1 2 3;
+#X obj 40 74 unpack 0 0 0;
+#X obj 40 245 outlet;
+#X obj 40 131 * 2;
+#X obj 40 93 associator \$1 \$2;
+#X obj 40 226 list append associative \$1 \$2;
+#X obj 40 207 pack 0 0 -1;
+#X obj 40 112 norm.\$1;
+#X obj 147 112 norm.\$1;
+#X connect 0 0 6 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 2 1 12 1;
+#X connect 4 0 12 0;
+#X connect 6 0 7 0;
+#X connect 7 0 10 0;
+#X connect 7 1 10 1;
+#X connect 7 2 10 2;
+#X connect 9 0 1 0;
+#X connect 10 0 13 0;
+#X connect 10 1 14 0;
+#X connect 11 0 8 0;
+#X connect 12 0 11 0;
+#X connect 13 0 9 0;
+#X connect 14 0 1 1;
diff --git a/desiredata/extra/pureunity/associator.pd b/desiredata/extra/pureunity/associator.pd
new file mode 100644
index 00000000..f6592029
--- /dev/null
+++ b/desiredata/extra/pureunity/associator.pd
@@ -0,0 +1,38 @@
+#N canvas 574 54 580 317 10;
+#X text 245 40 when the associator is 0 the rule is respected.;
+#X text 245 63 see associative-test.pd;
+#X text 16 219 associator;
+#X text 166 219 antiassociator;
+#X text 244 25 (a*b)*c - a*(b*c) = 0;
+#X text 244 11 associativity rule for operator *=\$2 is:;
+#X obj 18 19 inlet.\$1 a;
+#X obj 91 19 inlet.\$1 b;
+#X obj 164 19 inlet.\$1 c;
+#X obj 18 61 packunpack3.\$1;
+#X obj 18 104 op2.\$1 \$2;
+#X obj 18 123 op2.\$1 \$2;
+#X obj 102 108 op2.\$1 \$2;
+#X obj 102 134 op2.\$1 \$2;
+#X obj 18 153 taa.\$1;
+#X obj 18 182 op2.\$1 -;
+#X obj 168 182 op2.\$1 +;
+#X obj 168 201 outlet.\$1 (ab)c+a(bc);
+#X obj 18 201 outlet.\$1 (ab)c-a(bc);
+#X connect 6 0 9 0;
+#X connect 7 0 9 1;
+#X connect 8 0 9 2;
+#X connect 9 0 10 0;
+#X connect 9 0 13 0;
+#X connect 9 1 10 1;
+#X connect 9 1 12 0;
+#X connect 9 2 11 1;
+#X connect 9 2 12 1;
+#X connect 10 0 11 0;
+#X connect 11 0 14 0;
+#X connect 12 0 13 1;
+#X connect 13 0 15 1;
+#X connect 13 0 16 1;
+#X connect 14 0 15 0;
+#X connect 14 1 16 0;
+#X connect 15 0 18 0;
+#X connect 16 0 17 0;
diff --git a/desiredata/extra/pureunity/commutative-test.pd b/desiredata/extra/pureunity/commutative-test.pd
new file mode 100644
index 00000000..1b4cb22e
--- /dev/null
+++ b/desiredata/extra/pureunity/commutative-test.pd
@@ -0,0 +1,39 @@
+#N canvas 555 5 452 322 10;
+#X obj 40 15 inlet bang;
+#X obj 101 102 unpack 0 0;
+#X obj 101 183 /;
+#X msg 40 34 1 3;
+#X text 216 9 This test verifies that 1+3=3+1;
+#X obj 101 202 t a a;
+#X obj 101 278 outlet;
+#X text 217 44 with tolerance 0;
+#X obj 101 221 <= 0;
+#X text 218 23 and 1*3=3*1 and...;
+#X obj 101 164 * 2;
+#X obj 101 126 commutator \$1 \$2;
+#X obj 41 53 t b l b;
+#X obj 43 95 realtime;
+#X floatatom 44 125 5 0 0 0 - - -;
+#X obj 101 259 list append commutative \$1 \$2;
+#X obj 101 240 pack 0 0 -1;
+#X obj 101 145 norm.\$1;
+#X obj 208 145 norm.\$1;
+#X connect 0 0 3 0;
+#X connect 1 0 11 0;
+#X connect 1 1 11 1;
+#X connect 2 0 5 0;
+#X connect 3 0 12 0;
+#X connect 5 0 8 0;
+#X connect 5 1 16 1;
+#X connect 8 0 16 0;
+#X connect 10 0 2 0;
+#X connect 11 0 17 0;
+#X connect 11 1 18 0;
+#X connect 12 0 13 1;
+#X connect 12 1 1 0;
+#X connect 12 2 13 0;
+#X connect 13 0 14 0;
+#X connect 15 0 6 0;
+#X connect 16 0 15 0;
+#X connect 17 0 10 0;
+#X connect 18 0 2 1;
diff --git a/desiredata/extra/pureunity/commutator.pd b/desiredata/extra/pureunity/commutator.pd
new file mode 100644
index 00000000..27a8e35e
--- /dev/null
+++ b/desiredata/extra/pureunity/commutator.pd
@@ -0,0 +1,41 @@
+#N canvas 394 81 620 407 10;
+#X text 90 114 ba;
+#X text 33 93 ab;
+#X text 220 113 however \, this thing i call commutator is more general
+;
+#X text 219 132 see commutative-test.pd;
+#X text 127 217 anticommutator;
+#X text 19 217 commutator;
+#X text 218 15 Say operator \$2 is *. Then the commutativity rule is:
+;
+#X text 218 32 a*b=b*a which is also a*b-b*a = 0;
+#X text 218 48 the commutator is a*b - b*a;
+#X text 219 72 when \$2=+ this is also known as a "group commutator"
+;
+#X text 219 92 when \$2=* this is also known as a "ring commutator"
+;
+#X obj 18 19 inlet.\$1 a;
+#X obj 93 19 inlet.\$1 b;
+#X obj 18 38 taa.\$1;
+#X obj 18 74 op2.\$1 \$2;
+#X obj 80 98 op2.\$1 \$2;
+#X obj 80 74 swap.\$1;
+#X obj 18 180 op2.\$1 -;
+#X obj 127 180 op2.\$1 +;
+#X obj 18 199 outlet.\$1 ab-ba;
+#X obj 127 199 outlet.\$1 ab+ba;
+#X obj 18 121 taa.\$1;
+#X connect 11 0 13 0;
+#X connect 12 0 14 1;
+#X connect 12 0 16 1;
+#X connect 13 0 14 0;
+#X connect 13 1 16 0;
+#X connect 14 0 21 0;
+#X connect 15 0 17 1;
+#X connect 15 0 18 0;
+#X connect 16 0 15 0;
+#X connect 16 1 15 1;
+#X connect 17 0 19 0;
+#X connect 18 0 20 0;
+#X connect 21 0 17 0;
+#X connect 21 1 18 1;
diff --git a/desiredata/extra/pureunity/comparators-test.pd b/desiredata/extra/pureunity/comparators-test.pd
new file mode 100644
index 00000000..f8b569ae
--- /dev/null
+++ b/desiredata/extra/pureunity/comparators-test.pd
@@ -0,0 +1,65 @@
+#N canvas 365 120 687 494 10;
+#X obj 134 87 r \$0-b;
+#X obj 329 87 r \$0-b;
+#X obj 26 69 s \$0-b;
+#X obj 26 50 inlet bang;
+#X obj 14 414 r \$0-r;
+#X obj 14 433 outlet reports;
+#X obj 134 406 s \$0-r;
+#X obj 329 406 s \$0-r;
+#X text 17 11 This is the testclass for == \, != \, < \, > \, <= \,
+>= \, && \, ||;
+#X obj 329 157 equivalence-test \$1 ==;
+#X obj 329 257 totalordereq-test \$1 == >=;
+#X obj 329 237 totalordereq-test \$1 == <=;
+#X obj 329 217 totalorder-test \$1 == >;
+#X obj 329 197 totalorder-test \$1 == <;
+#X obj 134 157 commutative-test \$1 ==;
+#X obj 134 177 commutative-test \$1 !=;
+#X obj 134 297 commutative-test \$1 &&;
+#X obj 134 317 commutative-test \$1 ||;
+#X obj 134 197 antisymmetric-test \$1 <;
+#X obj 134 217 antisymmetric-test \$1 >;
+#X obj 134 237 antisymmetric-test \$1 <=;
+#X obj 134 257 antisymmetric-test \$1 >=;
+#X obj 467 418 nbx 12 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0
+10 -262144 -1 -1 0 256;
+#X obj 467 382 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 329 297 associative-test \$1 &&;
+#X obj 329 317 associative-test \$1 ||;
+#X obj 467 399 rand.\$1;
+#X connect 0 0 14 0;
+#X connect 0 0 15 0;
+#X connect 0 0 16 0;
+#X connect 0 0 17 0;
+#X connect 0 0 18 0;
+#X connect 0 0 19 0;
+#X connect 0 0 20 0;
+#X connect 0 0 21 0;
+#X connect 1 0 9 0;
+#X connect 1 0 10 0;
+#X connect 1 0 11 0;
+#X connect 1 0 12 0;
+#X connect 1 0 13 0;
+#X connect 1 0 24 0;
+#X connect 1 0 25 0;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 9 0 7 0;
+#X connect 10 0 7 0;
+#X connect 11 0 7 0;
+#X connect 12 0 7 0;
+#X connect 13 0 7 0;
+#X connect 14 0 6 0;
+#X connect 15 0 6 0;
+#X connect 16 0 6 0;
+#X connect 17 0 6 0;
+#X connect 18 0 6 0;
+#X connect 19 0 6 0;
+#X connect 20 0 6 0;
+#X connect 21 0 6 0;
+#X connect 23 0 26 0;
+#X connect 24 0 7 0;
+#X connect 25 0 7 0;
+#X connect 26 0 22 0;
diff --git a/desiredata/extra/pureunity/distributive-test.pd b/desiredata/extra/pureunity/distributive-test.pd
new file mode 100644
index 00000000..fd1e11d8
--- /dev/null
+++ b/desiredata/extra/pureunity/distributive-test.pd
@@ -0,0 +1,32 @@
+#N canvas 665 86 471 430 10;
+#X obj 40 15 inlet bang;
+#X obj 37 160 /;
+#X obj 37 179 t a a;
+#X text 157 24 with tolerance 0;
+#X obj 37 198 <= 0;
+#X text 156 9 This test verifies that 3*(4+5)=3*4+3*5;
+#X msg 40 34 3 4 5;
+#X obj 40 82 unpack 0 0 0;
+#X obj 37 255 outlet;
+#X obj 37 141 * 2;
+#X obj 37 103 distributor \$1 \$2 \$3;
+#X obj 37 236 list append distributive \$1 \$2 \$3;
+#X obj 37 217 pack 0 0 -1;
+#X obj 37 122 norm.\$1;
+#X obj 172 122 norm.\$1;
+#X connect 0 0 6 0;
+#X connect 1 0 2 0;
+#X connect 2 0 4 0;
+#X connect 2 1 12 1;
+#X connect 4 0 12 0;
+#X connect 6 0 7 0;
+#X connect 7 0 10 0;
+#X connect 7 1 10 1;
+#X connect 7 2 10 2;
+#X connect 9 0 1 0;
+#X connect 10 0 13 0;
+#X connect 10 1 14 0;
+#X connect 11 0 8 0;
+#X connect 12 0 11 0;
+#X connect 13 0 9 0;
+#X connect 14 0 1 1;
diff --git a/desiredata/extra/pureunity/distributor.pd b/desiredata/extra/pureunity/distributor.pd
new file mode 100644
index 00000000..b7cf2b3d
--- /dev/null
+++ b/desiredata/extra/pureunity/distributor.pd
@@ -0,0 +1,46 @@
+#N canvas 414 247 580 318 10;
+#X text 183 92 see distributive-test.pd;
+#X text 183 69 when the distributor is 0 the rule is respected.;
+#X text 16 269 distributor;
+#X text 180 269 antidistributor;
+#X text 182 40 distributivity rule for operator \$3 over operator \$2
+is:;
+#X text 182 54 a \$3 (b \$2 c) - ((a \$3 b) \$2 (a \$3 c)) = 0;
+#X obj 18 19 inlet.\$1 a;
+#X obj 91 19 inlet.\$1 b;
+#X obj 164 19 inlet.\$1 c;
+#X obj 18 61 packunpack3.\$1;
+#X obj 18 80 taa.\$1;
+#X obj 55 99 taa.\$1;
+#X obj 25 146 op2.\$1 \$2;
+#X obj 18 169 op2.\$1 \$3;
+#X obj 18 193 taa.\$1;
+#X obj 18 232 op2.\$1 -;
+#X obj 18 251 outlet.\$1 a(bc)-(ab+ac);
+#X obj 182 251 outlet.\$1 a(bc)+(ab+ac);
+#X obj 182 232 op2.\$1 +;
+#X obj 184 184 op2.\$1 \$3;
+#X obj 124 165 op2.\$1 \$3;
+#X obj 124 184 op2.\$1 \$2;
+#X connect 6 0 9 0;
+#X connect 7 0 9 1;
+#X connect 8 0 9 2;
+#X connect 9 0 10 0;
+#X connect 9 1 12 0;
+#X connect 9 1 20 1;
+#X connect 9 2 12 1;
+#X connect 9 2 19 1;
+#X connect 10 0 13 0;
+#X connect 10 1 11 0;
+#X connect 11 0 20 0;
+#X connect 11 1 19 0;
+#X connect 12 0 13 1;
+#X connect 13 0 14 0;
+#X connect 14 0 15 0;
+#X connect 14 1 18 0;
+#X connect 15 0 16 0;
+#X connect 18 0 17 0;
+#X connect 19 0 21 1;
+#X connect 20 0 21 0;
+#X connect 21 0 15 1;
+#X connect 21 0 18 1;
diff --git a/desiredata/extra/pureunity/equivalence-test.pd b/desiredata/extra/pureunity/equivalence-test.pd
new file mode 100644
index 00000000..d824510e
--- /dev/null
+++ b/desiredata/extra/pureunity/equivalence-test.pd
@@ -0,0 +1,14 @@
+#N canvas 0 0 450 161 10;
+#X obj 13 21 inlet;
+#X obj 13 121 outlet;
+#X obj 13 97 commutative-test \$1 \$2;
+#X obj 35 78 transitive-test \$1 \$2;
+#X obj 57 59 reflexive-test \$1 \$2;
+#X obj 13 40 t b b b;
+#X connect 0 0 5 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 2 0;
+#X connect 5 1 3 0;
+#X connect 5 2 4 0;
diff --git a/desiredata/extra/pureunity/glue-test.pd b/desiredata/extra/pureunity/glue-test.pd
new file mode 100644
index 00000000..7d3fa2aa
--- /dev/null
+++ b/desiredata/extra/pureunity/glue-test.pd
@@ -0,0 +1,15 @@
+#N canvas 185 138 665 479 10;
+#X obj 26 69 s \$0-b;
+#X obj 26 50 inlet bang;
+#X obj 14 414 r \$0-r;
+#X obj 14 433 outlet reports;
+#X obj 176 111 func2-test float;
+#X obj 176 131 func2-test symbol;
+#X obj 176 151 func2-test int;
+#X obj 176 91 func1-test bang;
+#X text 346 19 todo: send \, receive \, select \, route;
+#X text 346 32 todo: pack \, unpack \, trigger \, spigot;
+#X text 346 45 todo: moses \, until \, print \, makefilename;
+#X text 346 58 todo: change \, swap \, value;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
diff --git a/desiredata/extra/pureunity/invertible-test.pd b/desiredata/extra/pureunity/invertible-test.pd
new file mode 100644
index 00000000..95703461
--- /dev/null
+++ b/desiredata/extra/pureunity/invertible-test.pd
@@ -0,0 +1,31 @@
+#N canvas 665 86 452 291 10;
+#X obj 40 15 inlet bang;
+#X obj 40 79 unpack 0 0;
+#X obj 33 160 /;
+#X msg 40 34 1 3;
+#X obj 33 179 t a a;
+#X text 217 24 with tolerance 0;
+#X obj 33 198 <= 0;
+#X text 215 9 This test verifies that 1+3-3=1;
+#X obj 33 255 outlet;
+#X obj 33 141 * 2;
+#X obj 33 103 invertor \$1 \$2 \$3;
+#X obj 33 236 list append invertible \$1 \$2 \$3;
+#X obj 33 217 pack 0 0 -1;
+#X obj 33 122 norm.\$1;
+#X obj 147 123 norm.\$1;
+#X connect 0 0 3 0;
+#X connect 1 0 10 0;
+#X connect 1 1 10 1;
+#X connect 2 0 4 0;
+#X connect 3 0 1 0;
+#X connect 4 0 6 0;
+#X connect 4 1 12 1;
+#X connect 6 0 12 0;
+#X connect 9 0 2 0;
+#X connect 10 0 13 0;
+#X connect 10 1 14 0;
+#X connect 11 0 8 0;
+#X connect 12 0 11 0;
+#X connect 13 0 9 0;
+#X connect 14 0 2 1;
diff --git a/desiredata/extra/pureunity/invertor.pd b/desiredata/extra/pureunity/invertor.pd
new file mode 100644
index 00000000..4ee54548
--- /dev/null
+++ b/desiredata/extra/pureunity/invertor.pd
@@ -0,0 +1,30 @@
+#N canvas 336 387 602 199 10;
+#X text 185 60 when the invertor is 0 the rule is respected.;
+#X text 185 83 see invertible-test.pd;
+#X text 19 174 invertor;
+#X text 149 174 antiinvertor;
+#X text 184 11 invertibility rule for operator \$2 with (presumed)
+right-inverse \$3 is:;
+#X text 184 45 (a \$2 b) \$3 b - a = 0;
+#X obj 18 19 inlet.\$1 a;
+#X obj 101 19 inlet.\$1 b;
+#X obj 18 39 taa.\$1;
+#X obj 18 65 op2.\$1 \$2;
+#X obj 18 91 op2.\$1 \$3;
+#X obj 18 115 taa.\$1;
+#X obj 18 137 op2.\$1 -;
+#X obj 18 156 outlet.\$1 (ab)/b-a;
+#X obj 148 156 outlet.\$1 (ab)/b+a;
+#X obj 148 137 op2.\$1 +;
+#X connect 6 0 8 0;
+#X connect 7 0 9 1;
+#X connect 7 0 10 1;
+#X connect 8 0 9 0;
+#X connect 8 1 12 1;
+#X connect 8 1 15 1;
+#X connect 9 0 10 0;
+#X connect 10 0 11 0;
+#X connect 11 0 12 0;
+#X connect 11 1 15 0;
+#X connect 12 0 13 0;
+#X connect 15 0 14 0;
diff --git a/desiredata/extra/pureunity/locale/english.tcl b/desiredata/extra/pureunity/locale/english.tcl
new file mode 100644
index 00000000..8dca411d
--- /dev/null
+++ b/desiredata/extra/pureunity/locale/english.tcl
@@ -0,0 +1,56 @@
+
+say_namespace summary {
+ foreach {x y} {
+ f "floating-point"
+ ~ "signal"
+ \# "grid"
+ } {
+ say_category basic<$x>
+ say $x.do " ($y)"
+ say $x.norm " ($y)"
+ say $x.packunpack3 " ($y)"
+ say $x.swap " ($y)"
+ say $x.taa " ($y)"
+ }
+
+ say_category interfaces
+ proc pu_say {} {
+ }
+
+ pu_say antireflexive {t } ""
+ pu_say reflexive {t } ""
+
+ pu_say commutative {t } ""
+ pu_say anticommutative {t } ""
+ pu_say antisymmetric {t } ""
+
+ pu_say associative {t } ""
+ pu_say distributive {t } ""
+ pu_say invertible {t } ""
+
+ pu_say partialorder {t } "partial order (open)"
+ pu_say partialordereq {t } "partial order (closed)"
+ pu_say totalorder {t } "total order (open)"
+ pu_say totalordereq {t } "total order (closed)"
+ pu_say equivalence {t } "equivalence relation"
+
+ pu_say transitive {t } "transitive: "
+ pu_say trichotomy {t } "trichotomy: either equal or less or greater"
+ pu_say operator1 {t } "1-input operator"
+ pu_say operator2 {t } "2-input operator"
+
+ say_category cancellators
+ say associator "(ab)c-a(bc)"
+ say commutator "ab-ba"
+ say distributor "a&(b^c)-(ab^ac)"
+ say invertor "ab/b-a"
+
+ say_category misc
+ say twice ""
+ say 3times ""
+ say 4times ""
+ say ^ "xor"
+ say error ""
+ say protocols-tree ""
+ say tree ""
+}
diff --git a/desiredata/extra/pureunity/main.pd b/desiredata/extra/pureunity/main.pd
new file mode 100644
index 00000000..fb8f27ee
--- /dev/null
+++ b/desiredata/extra/pureunity/main.pd
@@ -0,0 +1,90 @@
+#N canvas 732 0 490 486 10;
+#X obj 19 65 loadbang;
+#X obj 28 87 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 41 373 print;
+#N canvas 509 382 450 300 other 0;
+#X obj 20 38 2times symbol foo bar;
+#X obj 20 21 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 20 57 print;
+#X obj 20 81 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 20 117 print;
+#X obj 20 98 3times symbol foo bar baz;
+#X obj 20 141 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 20 177 print;
+#X obj 20 158 4times symbol foo bar baz fnord;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 3 0 5 0;
+#X connect 5 0 4 0;
+#X connect 6 0 8 0;
+#X connect 8 0 7 0;
+#X restore 345 56 pd other;
+#X obj 19 111 t b b b;
+#X obj 71 354 +;
+#X msg 121 354 0;
+#X msg 71 316 float \$1;
+#X obj 41 297 t a a;
+#X obj 96 354 t f;
+#X obj 19 346 f;
+#X obj 71 335 == 0;
+#X obj 19 392 print total_failures;
+#X obj 226 251 sel 0;
+#X obj 234 312 bng 100 250 50 0 empty empty empty 0 -6 0 8 -258699
+-1 -262144;
+#X msg 234 293 color \$1 \, bang;
+#X msg 226 270 16;
+#X msg 256 270 13;
+#X text 24 437 This does not count errors not reported by the tests
+;
+#X text 25 464 Consult the console for more information;
+#X obj 4 7 cnv 15 500 40 empty empty PureUnity 8 20 1 18 -34345 -68160
+0;
+#X text 130 7 TM;
+#X obj 15 35 cnv 1 480 1 empty empty Copyright_2006-2007_by_Mathieu_Bouchard
+150 -5 1 9 -258699 -262144 0;
+#X text 25 450 Such as Syntax Error \, Class Not Found \, etc.;
+#X text 297 253 Green: PASS;
+#X text 311 265 Red: FAIL;
+#X obj 85 150 glue-test;
+#X obj 41 131 t b b b;
+#X text 6 48 from the bit rot prevention department;
+#X obj 284 168 print;
+#X symbolatom 284 133 10 0 0 0 - - -;
+#X msg 284 114 symbol field;
+#X obj 63 169 arith-test f;
+#X obj 41 188 comparators-test f;
+#X text 209 96 type in the name of an interface;
+#X obj 284 149 protocols-tree;
+#X connect 0 0 4 0;
+#X connect 1 0 4 0;
+#X connect 4 0 10 0;
+#X connect 4 1 27 0;
+#X connect 4 2 6 0;
+#X connect 5 0 9 0;
+#X connect 5 0 10 1;
+#X connect 6 0 5 1;
+#X connect 7 0 11 0;
+#X connect 8 0 2 0;
+#X connect 8 1 7 0;
+#X connect 9 0 5 1;
+#X connect 10 0 12 0;
+#X connect 10 0 13 0;
+#X connect 11 0 5 0;
+#X connect 13 0 16 0;
+#X connect 13 1 17 0;
+#X connect 15 0 14 0;
+#X connect 16 0 15 0;
+#X connect 17 0 15 0;
+#X connect 26 0 8 0;
+#X connect 27 0 33 0;
+#X connect 27 1 32 0;
+#X connect 27 2 26 0;
+#X connect 30 0 35 0;
+#X connect 31 0 30 0;
+#X connect 32 0 8 0;
+#X connect 33 0 8 0;
+#X connect 35 0 29 0;
diff --git a/desiredata/extra/pureunity/norm.#.pd b/desiredata/extra/pureunity/norm.#.pd
new file mode 100644
index 00000000..d4fc6cef
--- /dev/null
+++ b/desiredata/extra/pureunity/norm.#.pd
@@ -0,0 +1,8 @@
+#N canvas 0 0 450 300 10;
+#X obj 21 24 inlet;
+#X obj 20 50 # sq;
+#X obj 20 80 #ravel;
+#X obj 21 111 #fold +;
+#X obj 21 139 #export;
+#X obj 22 170 sqrt;
+#X obj 22 201 outlet;
diff --git a/desiredata/extra/pureunity/norm.f.pd b/desiredata/extra/pureunity/norm.f.pd
new file mode 100644
index 00000000..305f4ac1
--- /dev/null
+++ b/desiredata/extra/pureunity/norm.f.pd
@@ -0,0 +1,8 @@
+#N canvas 462 350 544 148 10;
+#X obj 23 20 inlet f;
+#X obj 23 58 outlet f;
+#X text 101 18 \$1.norm takes a value of type \$1 and produces a nonnegative
+float \, normally using L2-norm formulas;
+#X obj 23 39 abs;
+#X connect 0 0 3 0;
+#X connect 3 0 1 0;
diff --git a/desiredata/extra/pureunity/norm.~.pd b/desiredata/extra/pureunity/norm.~.pd
new file mode 100644
index 00000000..d429fc17
--- /dev/null
+++ b/desiredata/extra/pureunity/norm.~.pd
@@ -0,0 +1,8 @@
+#N canvas 462 350 544 148 10;
+#X obj 23 20 inlet~ f;
+#X obj 23 58 outlet f;
+#X text 101 18 \$1.norm takes a value of type \$1 and produces a nonnegative
+float \, normally using L2-norm formulas;
+#X obj 23 39 env~;
+#X connect 0 0 3 0;
+#X connect 3 0 1 0;
diff --git a/desiredata/extra/pureunity/op2.#.pd b/desiredata/extra/pureunity/op2.#.pd
new file mode 100644
index 00000000..ee1ce083
--- /dev/null
+++ b/desiredata/extra/pureunity/op2.#.pd
@@ -0,0 +1,8 @@
+#N canvas 385 252 450 129 10;
+#X obj 21 34 inlet;
+#X obj 61 34 inlet;
+#X obj 21 82 outlet;
+#X obj 21 59 # \$1 \$2;
+#X connect 0 0 3 0;
+#X connect 1 0 3 1;
+#X connect 3 0 2 0;
diff --git a/desiredata/extra/pureunity/op2.f.pd b/desiredata/extra/pureunity/op2.f.pd
new file mode 100644
index 00000000..7e01d641
--- /dev/null
+++ b/desiredata/extra/pureunity/op2.f.pd
@@ -0,0 +1,8 @@
+#N canvas 324 321 451 124 10;
+#X obj 19 18 inlet;
+#X obj 69 18 inlet;
+#X obj 19 50 \$1 \$2;
+#X obj 19 84 outlet;
+#X connect 0 0 2 0;
+#X connect 1 0 2 1;
+#X connect 2 0 3 0;
diff --git a/desiredata/extra/pureunity/op2.~.pd b/desiredata/extra/pureunity/op2.~.pd
new file mode 100644
index 00000000..97c09c7f
--- /dev/null
+++ b/desiredata/extra/pureunity/op2.~.pd
@@ -0,0 +1,8 @@
+#N canvas 338 329 450 125 10;
+#X obj 19 50 \$1~ \$2;
+#X obj 19 18 inlet~;
+#X obj 69 18 inlet~;
+#X obj 19 84 outlet~;
+#X connect 0 0 3 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 1;
diff --git a/desiredata/extra/pureunity/operator1-rule.pd b/desiredata/extra/pureunity/operator1-rule.pd
new file mode 100644
index 00000000..f9d91e03
--- /dev/null
+++ b/desiredata/extra/pureunity/operator1-rule.pd
@@ -0,0 +1,11 @@
+#N canvas 0 0 450 142 10;
+#X obj 15 16 inlet;
+#X obj 37 104 outlet;
+#X text 57 17 Test that one input gives one output;
+#X obj 37 84 \$1;
+#X obj 87 104 outlet;
+#X obj 15 55 t b a b;
+#X obj 242 63 error;
+#X connect 0 0 5 0;
+#X connect 3 0 1 0;
+#X connect 5 1 3 0;
diff --git a/desiredata/extra/pureunity/operator1-test.pd b/desiredata/extra/pureunity/operator1-test.pd
new file mode 100644
index 00000000..ed7f0fb4
--- /dev/null
+++ b/desiredata/extra/pureunity/operator1-test.pd
@@ -0,0 +1,5 @@
+#N canvas 0 0 450 142 10;
+#X obj 15 16 inlet;
+#X obj 15 94 outlet;
+#X text 57 17 Test that one input gives one output;
+#X connect 0 0 1 0;
diff --git a/desiredata/extra/pureunity/operator2-rule.pd b/desiredata/extra/pureunity/operator2-rule.pd
new file mode 100644
index 00000000..8ef1f7f1
--- /dev/null
+++ b/desiredata/extra/pureunity/operator2-rule.pd
@@ -0,0 +1,10 @@
+#N canvas 248 186 450 162 10;
+#X obj 15 16 inlet;
+#X obj 15 94 outlet;
+#X obj 54 35 func1-test \$1 \$2;
+#X text 74 55 And test that one right input gives zero output;
+#X obj 15 35 t a a;
+#X connect 0 0 4 0;
+#X connect 2 0 1 0;
+#X connect 4 0 1 0;
+#X connect 4 1 2 0;
diff --git a/desiredata/extra/pureunity/operator2-test.pd b/desiredata/extra/pureunity/operator2-test.pd
new file mode 100644
index 00000000..8ef1f7f1
--- /dev/null
+++ b/desiredata/extra/pureunity/operator2-test.pd
@@ -0,0 +1,10 @@
+#N canvas 248 186 450 162 10;
+#X obj 15 16 inlet;
+#X obj 15 94 outlet;
+#X obj 54 35 func1-test \$1 \$2;
+#X text 74 55 And test that one right input gives zero output;
+#X obj 15 35 t a a;
+#X connect 0 0 4 0;
+#X connect 2 0 1 0;
+#X connect 4 0 1 0;
+#X connect 4 1 2 0;
diff --git a/desiredata/extra/pureunity/packunpack3.#.pd b/desiredata/extra/pureunity/packunpack3.#.pd
new file mode 100644
index 00000000..3c182771
--- /dev/null
+++ b/desiredata/extra/pureunity/packunpack3.#.pd
@@ -0,0 +1,18 @@
+#N canvas 622 298 449 167 10;
+#X obj 105 127 outlet;
+#X obj 115 14 inlet;
+#X obj 69 14 inlet;
+#X obj 59 127 outlet;
+#X obj 13 127 outlet;
+#X obj 13 14 inlet;
+#X obj 84 64 #store;
+#X obj 38 64 #store;
+#X obj 13 33 t a b b;
+#X connect 1 0 6 1;
+#X connect 2 0 7 1;
+#X connect 5 0 8 0;
+#X connect 6 0 0 0;
+#X connect 7 0 3 0;
+#X connect 8 0 4 0;
+#X connect 8 1 7 0;
+#X connect 8 2 6 0;
diff --git a/desiredata/extra/pureunity/packunpack3.f.pd b/desiredata/extra/pureunity/packunpack3.f.pd
new file mode 100644
index 00000000..7343d5f3
--- /dev/null
+++ b/desiredata/extra/pureunity/packunpack3.f.pd
@@ -0,0 +1,16 @@
+#N canvas 285 202 449 125 10;
+#X obj 106 87 outlet;
+#X obj 105 14 inlet;
+#X obj 59 14 inlet;
+#X obj 60 87 outlet;
+#X obj 14 87 outlet;
+#X obj 13 14 inlet;
+#X obj 27 41 pack 0 0 0;
+#X obj 27 60 unpack 0 0 0;
+#X connect 1 0 6 2;
+#X connect 2 0 6 1;
+#X connect 5 0 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 4 0;
+#X connect 7 1 3 0;
+#X connect 7 2 0 0;
diff --git a/desiredata/extra/pureunity/packunpack3.~.pd b/desiredata/extra/pureunity/packunpack3.~.pd
new file mode 100644
index 00000000..7171a98e
--- /dev/null
+++ b/desiredata/extra/pureunity/packunpack3.~.pd
@@ -0,0 +1,10 @@
+#N canvas 285 202 449 67 10;
+#X obj 13 14 inlet~;
+#X obj 13 34 outlet~;
+#X obj 73 14 inlet~;
+#X obj 73 34 outlet~;
+#X obj 133 14 inlet~;
+#X obj 133 34 outlet~;
+#X connect 0 0 1 0;
+#X connect 2 0 3 0;
+#X connect 4 0 5 0;
diff --git a/desiredata/extra/pureunity/partialorder-test.pd b/desiredata/extra/pureunity/partialorder-test.pd
new file mode 100644
index 00000000..65aff88c
--- /dev/null
+++ b/desiredata/extra/pureunity/partialorder-test.pd
@@ -0,0 +1,14 @@
+#N canvas 118 56 450 189 10;
+#X obj 13 21 inlet;
+#X obj 13 141 outlet;
+#X obj 35 87 transitive-test \$1 \$2;
+#X obj 13 107 antisymmetric-test \$1 \$2;
+#X obj 57 67 antireflexive-test \$1 \$2;
+#X obj 13 41 t b b b;
+#X connect 0 0 5 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 3 0;
+#X connect 5 1 2 0;
+#X connect 5 2 4 0;
diff --git a/desiredata/extra/pureunity/partialordereq-test.pd b/desiredata/extra/pureunity/partialordereq-test.pd
new file mode 100644
index 00000000..39de970a
--- /dev/null
+++ b/desiredata/extra/pureunity/partialordereq-test.pd
@@ -0,0 +1,14 @@
+#N canvas 118 56 450 182 10;
+#X obj 13 21 inlet;
+#X obj 13 131 outlet;
+#X obj 35 79 transitive-test \$1 \$2;
+#X obj 57 60 reflexive-test \$1 \$2;
+#X obj 13 98 antisymmetric-test \$1 \$2;
+#X obj 13 40 t b b b;
+#X connect 0 0 5 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
+#X connect 5 1 2 0;
+#X connect 5 2 3 0;
diff --git a/desiredata/extra/pureunity/protocols-tree.pd b/desiredata/extra/pureunity/protocols-tree.pd
new file mode 100644
index 00000000..0d0bba9e
--- /dev/null
+++ b/desiredata/extra/pureunity/protocols-tree.pd
@@ -0,0 +1,65 @@
+#N canvas 132 109 813 546 10;
+#X obj 13 466 r \$0-out;
+#X obj 13 485 outlet;
+#X text 20 15 the direction of flow indicates "inherits from";
+#X obj 208 110 tree \$0 commutative;
+#X obj 13 390 makefilename \$0-%s;
+#X obj 13 371 inlet symbol;
+#X text 7 508 output is a sequence of begin \$1 and end \$1 messages
+that indicate a hierarchy.;
+#X text 36 447 send to a certain tree object;
+#X obj 13 409 t b s;
+#X obj 13 447 s;
+#X obj 13 428 symbol \$0-out;
+#X obj 423 157 tree \$0 reflexive;
+#X obj 594 157 tree \$0 antireflexive;
+#X obj 423 135 tree \$0 partialorder;
+#X obj 594 135 tree \$0 partialordereq;
+#X obj 423 90 tree \$0 totalorder;
+#X obj 594 81 tree \$0 totalordereq;
+#X obj 380 54 tree \$0 equivalence;
+#X obj 458 455 tree \$0 associative;
+#X obj 486 355 tree \$0 distributive;
+#X obj 474 409 tree \$0 invertible;
+#X obj 512 115 tree \$0 trichotomy;
+#X obj 380 220 tree \$0 transitive;
+#X obj 458 436 tree \$0 semigroup ?;
+#X obj 458 381 tree \$0 group ?;
+#X obj 622 184 tree \$0 antisymmetric2 ?;
+#X obj 480 330 tree \$0 ring ?;
+#X obj 432 185 tree \$0 antisymmetric ?;
+#X obj 208 130 tree \$0 anticommutative;
+#X obj 480 310 tree \$0 field ?;
+#X obj 423 276 tree \$0 relation;
+#X obj 662 288 tree \$0 unpacklike;
+#X obj 662 311 tree \$0 packlike;
+#X obj 667 348 tree \$0 operator1;
+#X obj 667 368 tree \$0 operator2;
+#X connect 0 0 1 0;
+#X connect 4 0 8 0;
+#X connect 5 0 4 0;
+#X connect 8 0 10 0;
+#X connect 8 1 9 1;
+#X connect 10 0 9 0;
+#X connect 11 0 30 0;
+#X connect 12 0 25 0;
+#X connect 12 0 30 0;
+#X connect 13 0 11 0;
+#X connect 13 0 22 0;
+#X connect 13 0 27 0;
+#X connect 14 0 12 0;
+#X connect 14 0 22 0;
+#X connect 15 0 13 0;
+#X connect 15 0 21 0;
+#X connect 16 0 14 0;
+#X connect 16 0 21 0;
+#X connect 17 0 3 0;
+#X connect 17 0 11 0;
+#X connect 17 0 22 0;
+#X connect 22 0 30 0;
+#X connect 23 0 18 0;
+#X connect 24 0 20 0;
+#X connect 24 0 23 0;
+#X connect 26 0 19 0;
+#X connect 26 0 24 0;
+#X connect 29 0 26 0;
diff --git a/desiredata/extra/pureunity/pureunity.c b/desiredata/extra/pureunity/pureunity.c
new file mode 100644
index 00000000..2c7e2fcf
--- /dev/null
+++ b/desiredata/extra/pureunity/pureunity.c
@@ -0,0 +1,37 @@
+/*
+ $Id: pureunity.c,v 1.1.2.3 2007-06-28 03:21:16 matju Exp $
+ PureUnity
+ Copyright 2006 by Mathieu Bouchard <matju à artengine point ca>
+
+ This program 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.
+
+ See file ./COPYING for further informations on licensing terms.
+
+ This program 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 this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <sys/time.h>
+#include "../../src/m_pd.h"
+#define ALIAS(y,x) class_addcreator((t_newmethod)getfn(m,gensym(x)),gensym(y),A_GIMME,0);
+
+void pureunity_setup() {
+ t_pd *m = &pd_objectmaker;
+ ALIAS( "inlet.f","inlet" );
+ ALIAS( "inlet.#","inlet" );
+ ALIAS( "inlet.~","inlet~" );
+ ALIAS("outlet.f","outlet" );
+ ALIAS("outlet.#","outlet" );
+ ALIAS("outlet.~","outlet~");
+ ALIAS( "f.swap","swap" );
+}
+
diff --git a/desiredata/extra/pureunity/rand.#.pd b/desiredata/extra/pureunity/rand.#.pd
new file mode 100644
index 00000000..ce3d3c91
--- /dev/null
+++ b/desiredata/extra/pureunity/rand.#.pd
@@ -0,0 +1,42 @@
+#N canvas 0 0 450 300 10;
+#X obj 21 34 inlet;
+#X obj 21 223 *;
+#X obj 73 95 random 256;
+#X obj 183 87 random;
+#X msg 220 39 1;
+#X obj 220 20 loadbang;
+#X obj 220 58 << 23;
+#X obj 183 106 +;
+#X obj 21 53 t b b b;
+#X obj 21 136 random 2;
+#X obj 21 174 - 1;
+#X obj 73 114 - 150;
+#X obj 43 114 pow;
+#X obj 21 242 outlet;
+#X obj 43 76 t b b;
+#X msg 43 95 2;
+#X obj 21 199 *;
+#X obj 21 155 * 2;
+#X text 125 205 Should this actually produce a grid or not?...;
+#X text 126 221 Whatever does the job...;
+#X connect 0 0 8 0;
+#X connect 1 0 13 0;
+#X connect 2 0 11 0;
+#X connect 3 0 7 0;
+#X connect 4 0 6 0;
+#X connect 5 0 4 0;
+#X connect 6 0 3 1;
+#X connect 6 0 7 1;
+#X connect 7 0 16 1;
+#X connect 8 0 9 0;
+#X connect 8 1 14 0;
+#X connect 8 2 3 0;
+#X connect 9 0 17 0;
+#X connect 10 0 16 0;
+#X connect 11 0 12 1;
+#X connect 12 0 1 1;
+#X connect 14 0 15 0;
+#X connect 14 1 2 0;
+#X connect 15 0 12 0;
+#X connect 16 0 1 0;
+#X connect 17 0 10 0;
diff --git a/desiredata/extra/pureunity/rand.f.pd b/desiredata/extra/pureunity/rand.f.pd
new file mode 100644
index 00000000..f4372dc0
--- /dev/null
+++ b/desiredata/extra/pureunity/rand.f.pd
@@ -0,0 +1,40 @@
+#N canvas 0 0 450 300 10;
+#X obj 11 14 inlet;
+#X obj 11 192 *;
+#X obj 63 75 random 256;
+#X obj 183 87 random;
+#X msg 220 39 1;
+#X obj 220 20 loadbang;
+#X obj 220 58 << 23;
+#X obj 183 106 +;
+#X obj 11 33 t b b b;
+#X obj 11 116 random 2;
+#X obj 11 154 - 1;
+#X obj 63 94 - 150;
+#X obj 33 94 pow;
+#X obj 11 211 outlet;
+#X obj 33 56 t b b;
+#X msg 33 75 2;
+#X obj 11 173 *;
+#X obj 11 135 * 2;
+#X connect 0 0 8 0;
+#X connect 1 0 13 0;
+#X connect 2 0 11 0;
+#X connect 3 0 7 0;
+#X connect 4 0 6 0;
+#X connect 5 0 4 0;
+#X connect 6 0 3 1;
+#X connect 6 0 7 1;
+#X connect 7 0 16 1;
+#X connect 8 0 9 0;
+#X connect 8 1 14 0;
+#X connect 8 2 3 0;
+#X connect 9 0 17 0;
+#X connect 10 0 16 0;
+#X connect 11 0 12 1;
+#X connect 12 0 1 1;
+#X connect 14 0 15 0;
+#X connect 14 1 2 0;
+#X connect 15 0 12 0;
+#X connect 16 0 1 0;
+#X connect 17 0 10 0;
diff --git a/desiredata/extra/pureunity/rand.~.pd b/desiredata/extra/pureunity/rand.~.pd
new file mode 100644
index 00000000..cb1bf37b
--- /dev/null
+++ b/desiredata/extra/pureunity/rand.~.pd
@@ -0,0 +1,22 @@
+#N canvas 339 187 450 177 10;
+#X obj 105 118 pow;
+#X obj 105 80 t b b;
+#X msg 105 99 2;
+#X obj 22 98 env~;
+#X obj 11 14 inlet;
+#X obj 10 143 outlet~;
+#X text 52 14 banging the inlet does nothing for signals.;
+#X obj 37 62 noise~;
+#X obj 135 99 random 64;
+#X obj 135 118 - 64;
+#X obj 11 62 *~;
+#X connect 0 0 10 0;
+#X connect 1 0 2 0;
+#X connect 1 1 8 0;
+#X connect 2 0 0 0;
+#X connect 3 0 1 0;
+#X connect 7 0 10 1;
+#X connect 8 0 9 0;
+#X connect 9 0 0 1;
+#X connect 10 0 5 0;
+#X connect 10 0 3 0;
diff --git a/desiredata/extra/pureunity/reflexive-test.pd b/desiredata/extra/pureunity/reflexive-test.pd
new file mode 100644
index 00000000..1ae836d0
--- /dev/null
+++ b/desiredata/extra/pureunity/reflexive-test.pd
@@ -0,0 +1,13 @@
+#N canvas 0 0 450 161 10;
+#X obj 12 18 inlet;
+#X obj 12 120 outlet;
+#X obj 12 56 t a a;
+#X msg 12 37 2 2;
+#X obj 12 82 \$2;
+#X obj 12 101 == 1;
+#X connect 0 0 3 0;
+#X connect 2 0 4 0;
+#X connect 2 1 4 1;
+#X connect 3 0 2 0;
+#X connect 4 0 5 0;
+#X connect 5 0 1 0;
diff --git a/desiredata/extra/pureunity/swap.#.pd b/desiredata/extra/pureunity/swap.#.pd
new file mode 100644
index 00000000..2865b5a3
--- /dev/null
+++ b/desiredata/extra/pureunity/swap.#.pd
@@ -0,0 +1,14 @@
+#N canvas 0 0 450 125 10;
+#X obj 12 72 #store;
+#X obj 12 34 t a a;
+#X obj 12 53 #finished;
+#X obj 12 15 inlet a;
+#X obj 58 72 inlet b;
+#X obj 12 91 outlet b;
+#X obj 51 34 outlet a;
+#X connect 0 0 5 0;
+#X connect 1 0 2 0;
+#X connect 1 1 6 0;
+#X connect 2 0 0 0;
+#X connect 3 0 1 0;
+#X connect 4 0 0 1;
diff --git a/desiredata/extra/pureunity/swap.f.pd b/desiredata/extra/pureunity/swap.f.pd
new file mode 100644
index 00000000..1215b477
--- /dev/null
+++ b/desiredata/extra/pureunity/swap.f.pd
@@ -0,0 +1,10 @@
+#N canvas 218 156 450 98 10;
+#X obj 14 11 inlet~;
+#X obj 74 11 inlet~;
+#X obj 14 61 outlet~;
+#X obj 74 61 outlet~;
+#X obj 14 37 swap;
+#X connect 0 0 4 0;
+#X connect 1 0 4 1;
+#X connect 4 0 2 0;
+#X connect 4 1 3 0;
diff --git a/desiredata/extra/pureunity/swap.~.pd b/desiredata/extra/pureunity/swap.~.pd
new file mode 100644
index 00000000..8055ea0c
--- /dev/null
+++ b/desiredata/extra/pureunity/swap.~.pd
@@ -0,0 +1,7 @@
+#N canvas 218 156 450 98 10;
+#X obj 14 11 inlet~;
+#X obj 74 11 inlet~;
+#X obj 14 61 outlet~;
+#X obj 74 61 outlet~;
+#X connect 0 0 3 0;
+#X connect 1 0 2 0;
diff --git a/desiredata/extra/pureunity/taa.#.pd b/desiredata/extra/pureunity/taa.#.pd
new file mode 100644
index 00000000..ae3b4b1c
--- /dev/null
+++ b/desiredata/extra/pureunity/taa.#.pd
@@ -0,0 +1,8 @@
+#N canvas 353 249 367 122 10;
+#X obj 19 14 inlet;
+#X obj 19 71 outlet;
+#X obj 19 33 t a a;
+#X obj 49 52 outlet;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 2 1 3 0;
diff --git a/desiredata/extra/pureunity/taa.f.pd b/desiredata/extra/pureunity/taa.f.pd
new file mode 100644
index 00000000..ae3b4b1c
--- /dev/null
+++ b/desiredata/extra/pureunity/taa.f.pd
@@ -0,0 +1,8 @@
+#N canvas 353 249 367 122 10;
+#X obj 19 14 inlet;
+#X obj 19 71 outlet;
+#X obj 19 33 t a a;
+#X obj 49 52 outlet;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+#X connect 2 1 3 0;
diff --git a/desiredata/extra/pureunity/taa.~.pd b/desiredata/extra/pureunity/taa.~.pd
new file mode 100644
index 00000000..7f52b01a
--- /dev/null
+++ b/desiredata/extra/pureunity/taa.~.pd
@@ -0,0 +1,6 @@
+#N canvas 353 249 367 122 10;
+#X obj 19 14 inlet~;
+#X obj 49 52 outlet~;
+#X obj 19 71 outlet~;
+#X connect 0 0 1 0;
+#X connect 0 0 2 0;
diff --git a/desiredata/extra/pureunity/totalorder-test.pd b/desiredata/extra/pureunity/totalorder-test.pd
new file mode 100644
index 00000000..9aa72fce
--- /dev/null
+++ b/desiredata/extra/pureunity/totalorder-test.pd
@@ -0,0 +1,11 @@
+#N canvas 118 56 418 157 10;
+#X obj 13 21 inlet;
+#X obj 13 101 outlet;
+#X obj 43 59 partialorder-test \$1 \$2;
+#X obj 13 78 trichotomy-test \$1 \$2;
+#X obj 13 40 t b b;
+#X connect 0 0 4 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 3 0;
+#X connect 4 1 2 0;
diff --git a/desiredata/extra/pureunity/totalordereq-test.pd b/desiredata/extra/pureunity/totalordereq-test.pd
new file mode 100644
index 00000000..4c7372d6
--- /dev/null
+++ b/desiredata/extra/pureunity/totalordereq-test.pd
@@ -0,0 +1,11 @@
+#N canvas 349 136 450 153 10;
+#X obj 13 21 inlet;
+#X obj 13 97 outlet;
+#X obj 13 78 trichotomy-test \$1 \$2;
+#X obj 43 59 partialordereq-test \$1 \$2;
+#X obj 13 40 t b b;
+#X connect 0 0 4 0;
+#X connect 2 0 1 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 0;
+#X connect 4 1 3 0;
diff --git a/desiredata/extra/pureunity/transitive-test.pd b/desiredata/extra/pureunity/transitive-test.pd
new file mode 100644
index 00000000..0788ad61
--- /dev/null
+++ b/desiredata/extra/pureunity/transitive-test.pd
@@ -0,0 +1,4 @@
+#N canvas 0 0 450 300 10;
+#X obj 12 18 inlet;
+#X obj 12 48 outlet;
+#X connect 0 0 1 0;
diff --git a/desiredata/extra/pureunity/tree.pd b/desiredata/extra/pureunity/tree.pd
new file mode 100644
index 00000000..ae9d3d89
--- /dev/null
+++ b/desiredata/extra/pureunity/tree.pd
@@ -0,0 +1,20 @@
+#N canvas 415 303 474 293 10;
+#X obj 51 61 symbol \$2;
+#X obj 74 194 s;
+#X obj 19 4 inlet bang;
+#X obj 77 23 r \$1-\$2;
+#X msg 51 80 begin \$1;
+#X msg 19 134 end \$1;
+#X obj 35 42 outlet;
+#X obj 19 23 t b s b s;
+#X obj 19 115 symbol \$2;
+#X connect 0 0 4 0;
+#X connect 2 0 7 0;
+#X connect 3 0 7 0;
+#X connect 4 0 1 0;
+#X connect 5 0 1 0;
+#X connect 7 0 8 0;
+#X connect 7 1 6 0;
+#X connect 7 2 0 0;
+#X connect 7 3 1 1;
+#X connect 8 0 5 0;
diff --git a/desiredata/extra/pureunity/trichotomy-test.pd b/desiredata/extra/pureunity/trichotomy-test.pd
new file mode 100644
index 00000000..49aa8e76
--- /dev/null
+++ b/desiredata/extra/pureunity/trichotomy-test.pd
@@ -0,0 +1,32 @@
+#N canvas 174 185 553 302 10;
+#X obj 13 21 inlet;
+#X obj 13 255 outlet;
+#X msg 13 40 1 2 \, 2 2 \, 2 1;
+#X msg 38 78 \$2 \$1;
+#X obj 13 117 +;
+#X obj 13 59 t a a a;
+#X obj 13 97 \$3;
+#X obj 38 97 \$3;
+#X obj 91 100 \$2;
+#X obj 38 117 +;
+#X obj 13 136 - 1;
+#X obj 13 155 t a a;
+#X obj 13 174 == 0;
+#X obj 13 236 list append trichotomy \$1 \$2;
+#X obj 13 217 pack 0 0 -1;
+#X connect 0 0 2 0;
+#X connect 2 0 5 0;
+#X connect 3 0 7 0;
+#X connect 4 0 10 0;
+#X connect 5 0 6 0;
+#X connect 5 1 3 0;
+#X connect 5 2 8 0;
+#X connect 6 0 4 0;
+#X connect 7 0 9 0;
+#X connect 8 0 9 1;
+#X connect 9 0 4 1;
+#X connect 11 0 12 0;
+#X connect 11 1 14 1;
+#X connect 12 0 14 0;
+#X connect 13 0 1 0;
+#X connect 14 0 13 0;