summaryrefslogtreecommitdiff
path: root/public/assets/javascripts/rectangles/util/sort.js
blob: 3b4771c82af7988fed064bcf34fed6310e852575 (plain)
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
(function(){

	function compare_rect_position(a,b){
		if (a[0].x.a < b[0].x.a) {
			return -1
		}
		if (a[0].x.a > b[0].x.a) {
			return 1
		}
		if (a[0].y.a < b[0].y.a) {
			return -1
		}
		if (a[0].y.a > b[0].y.a) {
			return 1
		}
		return 0
	}

	function compare_car_reversed (a,b){
		if (a[0] < b[0]) {
			return 1
		}
		if (a[0] > b[0]) {
			return -1
		}
		return 0
	}
	function compare_car (a,b){
		if (a[0] < b[0]) {
			return -1
		}
		if (a[0] > b[0]) {
			return 1
		}
		return 0
	}

	function room_id_tuple (r){ return [r.id, r] }
	function room_height_tuple (r){ return [r.height, r] }
	function room_area_tuple (r){ return [r.rect.area(), r] }
	function rect_area_tuple (r){ return [r.area(), r] }
	function rect_area_tuple_larger (r){ return [-r.area(), r] }

	function room_rect_tuple (r){ return [r.rect, r] }
	function identity_tuple (r){ return [r, r] }
	function car (r){ return r[0] }
	function cdr (r){ return r[1] }

	var sort = {}
	
	sort.rooms_by_id = function (list){
		return list.map(room_id_tuple)
							 .sort(compare_car)
							 .map(cdr)
	}
	sort.rooms_by_height = function (list){
		return list.map(room_height_tuple)
							 .sort(compare_car_reversed)
							 .map(cdr)
	}
	sort.rooms_by_position = function (list){
		return list.map(room_rect_tuple)
							 .sort(compare_rect_position)
							 .map(cdr)
	}
	sort.rooms_by_area = function (list){
		return list.map(room_area_tuple)
							 .sort(compare_car)
							 .map(cdr)
	}

	sort.rects_by_position = function (list){
		return list.map(identity_tuple)
							 .sort(compare_rect_position)
							 .map(cdr)
	}
	sort.rects_by_area = function (list){
		return list.map(rect_area_tuple)
							 .sort(compare_car)
							 .map(cdr)
	}
	sort.rects_by_larger_area = function (list){
		return list.map(rect_area_tuple_larger)
							 .sort(compare_car)
							 .map(cdr)
	}
	sort.compare_z = function (a,b){
		return a.rect.y.a < b.rect.y.a ? -1 : a.rect.y.a == b.rect.y.a ? 0 : 1
	}
	sort.compare_x = function (a,b){
		return a.rect.x.a > b.rect.x.a ? -1 : a.rect.x.a == b.rect.x.a ? 0 : 1
	}

	if ("window" in this) {
		window.sort = sort
	}
	else {
		module.exports = sort
	}

})()