-
Notifications
You must be signed in to change notification settings - Fork 1
/
coordinates.ss
32 lines (28 loc) · 847 Bytes
/
coordinates.ss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#lang racket
(require srfi/25 rackunit)
(define (in-array-coordinates array)
(make-do-sequence
(lambda ()
(values
(lambda (seq)
(values (first seq)
(second seq)))
(lambda (seq)
(match seq
[(list x y)
(if (< x (sub1 (array-end array 0)))
(list (add1 x) y)
(list 0 (add1 y)))]))
'(0 0)
(lambda (seq)
(and
(< (first seq) (array-end array 0))
(< (second seq) (array-end array 1))))
(lambda (x y) #t)
(lambda (t x y) #t)))))
(provide/contract
[in-array-coordinates (-> array? sequence?)])
(check-equal?
'((0 . 0) (1 . 0) (2 . 0) (0 . 1) (1 . 1) (2 . 1) (0 . 2) (1 . 2) (2 . 2))
(for/list ([(a b) (in-array-coordinates (apply array (shape 0 3 0 3) (build-list 9 values) ))])
(cons a b)))