summaryrefslogtreecommitdiff
path: root/sly/utils.scm
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2014-11-07 19:38:47 -0500
committerDavid Thompson <dthompson2@worcester.edu>2014-11-07 19:38:47 -0500
commit27c195b6d8339e71642fea89c8707d0a0cc153f4 (patch)
tree8bac06b3ad261e49a47bdbf393e9feab57d46b19 /sly/utils.scm
parente192265fd0d4873cfd852748cc0f1fb38374288d (diff)
Rename (sly helpers) module to (sly utils).
* sly/helpers.scm: Delete. * sly/utils.scm: New file. * Makefile.am (SOURCES): Remove old file. Add new one. * sly/render/camera.scm: s/helpers/utils/ * sly/scene.scm: Likewise. * sly/shader.scm: Likewise. * sly/sprite.scm: Likewise. * sly/texture.scm: Likewise. * sly/transform.scm: Likewise. * examples/tilemap.scm: Likewise.
Diffstat (limited to 'sly/utils.scm')
-rw-r--r--sly/utils.scm76
1 files changed, 76 insertions, 0 deletions
diff --git a/sly/utils.scm b/sly/utils.scm
new file mode 100644
index 0000000..7bf38f7
--- /dev/null
+++ b/sly/utils.scm
@@ -0,0 +1,76 @@
+;;; Sly
+;;; Copyright (C) 2013, 2014 David Thompson <dthompson2@worcester.edu>
+;;; Copyright (C) 2014 Ludovic Courtès <ludo@gnu.org>
+;;;
+;;; 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 3 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, see
+;;; <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Miscellaneous helper procedures.
+;;
+;;; Code:
+
+(define-module (sly utils)
+ #:use-module (srfi srfi-1)
+ #:use-module (rnrs arithmetic bitwise)
+ #:use-module (sly agenda)
+ #:export (any-equal?
+ logand?
+ define-guardian
+ memoize
+ forever
+ trampoline))
+
+(define (any-equal? elem . args)
+ "Return #t if ELEM equals any of the elements in the list ARGS."
+ (any (lambda (e) (equal? elem e)) args))
+
+(define (logand? . args)
+ "Return #t if the result of a bitwise AND of the integers in list
+ARGS is non-zero."
+ (not (zero? (apply logand args))))
+
+(define-syntax-rule (define-guardian name reaper)
+ "Define a new guardian called NAME and call REAPER when an object
+within the guardian is GC'd. Reaping is ensured to happen from the
+same thread that is running the game loop."
+ (begin
+ (define name (make-guardian))
+ (schedule-each
+ (lambda ()
+ (let reap ((obj (name)))
+ (when obj
+ (reaper obj)
+ (reap (name))))))))
+
+(define (memoize proc)
+ "Return a memoizing version of PROC."
+ (let ((cache (make-hash-table)))
+ (lambda args
+ (let ((results (hash-ref cache args)))
+ (if results
+ (apply values results)
+ (let ((results (call-with-values (lambda ()
+ (apply proc args))
+ list)))
+ (hash-set! cache args results)
+ (apply values results)))))))
+
+(define-syntax-rule (forever body ...)
+ (while #t body ...))
+
+(define-syntax-rule (trampoline proc)
+ (lambda args
+ (apply proc args)))