--- /dev/null
+(use-modules (srfi srfi-1))
+
+(define distance (a b)
+ (abs (- a b)))
+
+(define (distance-change bpm_c bpm_n bpm_n+1)
+ (- (abs (distance bpm_c bpm_n) (distance bpm_c bpm_n+1))
+ (distance bpm_a bpm_b)))
+
+(define (insert-song song playlist)
+ (let ((last
+ (let find-minimum ((current-minimum (inf))
+ (min-cons '())
+ (plist playlist))
+ (cond
+ ((null? (cdr rest))
+ '())
+ ((< (distance-change song (first plist) (second plist))
+ current-minimum)
+ (find-minimum (distance-change song (first plist) (second plist))
+ (first plist)
+ (rest plist)))
+ (else (find-minimum current-minimum min-cons (rest plist)))))))
+ (let insert-copy ((old-list playlist))
+ (cond ((eq? last old-list)
+ ;; (list... (car old-list) song (cdr old-list))
+ (cons* (car old-list) song (cdr old-list)))
+ (else (cons (car old-list) (insert-copy (cdr old-list))))))))
+