all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* Is there any existing solution to move list number backwards, forwards in a list?
@ 2022-10-21  7:56 Jean Louis
  2022-10-21  9:28 ` [SOLVED]: " Jean Louis
  2022-10-21 13:13 ` Stefan Monnier via Users list for the GNU Emacs text editor
  0 siblings, 2 replies; 4+ messages in thread
From: Jean Louis @ 2022-10-21  7:56 UTC (permalink / raw)
  To: Help GNU Emacs

For purposes of changing priorities of objects in a set, I need to
move single item in a list backwards and forwards.

Let us say item is number 7 in following list:

'(1 2 3 4 5 6 7 8 9)

Then I wish to move item number 7 to different number and renumber all
items so that number 7 becomes number 6 and number 6 comes in the
place of number 7.

Situation is more complex, each object ID has its priority like one of
those in the list. So each object ID has to be updated with its
priority when I press single click.

As it looks somehow common to me, maybe somebody knows if something
like that exists as a package.


Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



^ permalink raw reply	[flat|nested] 4+ messages in thread

* [SOLVED]: Re: Is there any existing solution to move list number backwards, forwards in a list?
  2022-10-21  7:56 Is there any existing solution to move list number backwards, forwards in a list? Jean Louis
@ 2022-10-21  9:28 ` Jean Louis
  2022-10-21 13:13 ` Stefan Monnier via Users list for the GNU Emacs text editor
  1 sibling, 0 replies; 4+ messages in thread
From: Jean Louis @ 2022-10-21  9:28 UTC (permalink / raw)
  To: Help GNU Emacs

* Jean Louis <bugs@gnu.support> [2022-10-21 11:50]:
> For purposes of changing priorities of objects in a set, I need to
> move single item in a list backwards and forwards.
> 
> Let us say item is number 7 in following list:
> 
> '(1 2 3 4 5 6 7 8 9)
> 
> Then I wish to move item number 7 to different number and renumber all
> items so that number 7 becomes number 6 and number 6 comes in the
> place of number 7.
> 
> Situation is more complex, each object ID has its priority like one of
> those in the list. So each object ID has to be updated with its
> priority when I press single click.
> 
> As it looks somehow common to me, maybe somebody knows if something
> like that exists as a package.

My request is complicated to understand. And I have made function
which works, though it is slow as it has to update all the objects
with new priority. Priorities could be anything like '(3 4 5) so how
to update object with priority 4 to be before 3? Without adding some
numbers it does not work. I have chosen to multiply items by 10, like
'(30 40 50), then object's priority 40 can by decreased for 15 and get
priority 25, or increased for 15 and get priority 55, this way
priorities are solved. It is now up to me to speed it up by using only
one SQL statement.

(defun hyperscope-hyperdocument-set-priority (hyperscope-set id direction)
  (let* ((hyperdocuments (rcd-sql-list (cond (hyperscope-set "SELECT hyobjects_id FROM hyobjects
                                                               WHERE hyobjects_parent = $1
                                                            ORDER BY hyobjects_priorities, hyobjects_id")
					     (t "SELECT hyobjects_id FROM hyobjects
                                                  WHERE hyobjects_parent = NULL
                                               ORDER BY hyobjects_priorities, hyobjects_id"))
                        	       cf-db hyperscope-set))
	 (hash (make-hash-table :test #'equal))
	 (renumbered (let ((count 20))
		       (mapcar (lambda (id)
				 (puthash id (* (setq count (1+ count)) 10) hash))
			       hyperdocuments))))
    (cond ((eq direction 'back) (puthash id (- (gethash id hash) 15) hash))
	  ((eq direction 'forth) (puthash id (+ (gethash id hash) 15) hash))
	  (t (error "Verify arguments to `hyperscope-hyperdocument-set-priority'")))
    (let ((keys (hash-table-keys hash)))
      (while keys
	(let ((key (pop keys)))
	(hlink-update-priority-1 key (gethash key hash)))))))

-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Is there any existing solution to move list number backwards, forwards in a list?
  2022-10-21  7:56 Is there any existing solution to move list number backwards, forwards in a list? Jean Louis
  2022-10-21  9:28 ` [SOLVED]: " Jean Louis
@ 2022-10-21 13:13 ` Stefan Monnier via Users list for the GNU Emacs text editor
  2022-10-21 15:54   ` Jean Louis
  1 sibling, 1 reply; 4+ messages in thread
From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2022-10-21 13:13 UTC (permalink / raw)
  To: help-gnu-emacs

> Let us say item is number 7 in following list:
>
> '(1 2 3 4 5 6 7 8 9)
>
> Then I wish to move item number 7 to different number and renumber all
> items so that number 7 becomes number 6 and number 6 comes in the
> place of number 7.

That was clear (ahem) :-)

> Situation is more complex,

I suspect so.  From where I stand, the normal answer is to change the
priority of the relevant object and then to pass your list to `sort`
with the appropriate so it re-sorts based on the new priorities.


        Stefan




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Is there any existing solution to move list number backwards, forwards in a list?
  2022-10-21 13:13 ` Stefan Monnier via Users list for the GNU Emacs text editor
@ 2022-10-21 15:54   ` Jean Louis
  0 siblings, 0 replies; 4+ messages in thread
From: Jean Louis @ 2022-10-21 15:54 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: help-gnu-emacs

* Stefan Monnier via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> [2022-10-21 16:34]:
> > Let us say item is number 7 in following list:
> >
> > '(1 2 3 4 5 6 7 8 9)
> >
> > Then I wish to move item number 7 to different number and renumber all
> > items so that number 7 becomes number 6 and number 6 comes in the
> > place of number 7.
> 
> That was clear (ahem) :-)

Thanks. You got it, though my expression is not perfect.

> > Situation is more complex,
> 
> I suspect so.  From where I stand, the normal answer is to change the
> priority of the relevant object and then to pass your list to `sort`
> with the appropriate so it re-sorts based on the new priorities.

I have decided to use hash with ID being the key, and value being the
priority. Then in one SQL set I update it all at once. Now it is
pretty fast.

(defun hyperscope-hyperdocument-set-priority (hyperscope-set id direction)
  (let* ((hyperdocuments (rcd-sql-list (cond (hyperscope-set "SELECT hyobjects_id FROM hyobjects
                                                               WHERE hyobjects_parent = $1
                                                            ORDER BY hyobjects_priorities, hyobjects_id")
					     (t "SELECT hyobjects_id FROM hyobjects
                                                  WHERE hyobjects_parent = NULL
                                               ORDER BY hyobjects_priorities, hyobjects_id"))
                        	       cf-db hyperscope-set))
	 (hash (make-hash-table :test #'equal))
	 (renumbered (let ((count 20))
		       (mapcar (lambda (id)
				 (puthash id (* (setq count (1+ count)) 10) hash))
			       hyperdocuments))))
    (cond ((eq direction 'up) (puthash id (- (gethash id hash) 15) hash))
	  ((eq direction 'down) (puthash id (+ (gethash id hash) 15) hash))
	  (t (error "Verify arguments to `hyperscope-hyperdocument-set-priority'")))
    (let* ((keys (hash-table-keys hash))
	  (sql (with-temp-buffer 
		 (insert "BEGIN;\n")
		 (while keys
		   (let ((key (pop keys)))
		     (insert (format "UPDATE hyobjects set hyobjects_priorities = %s 
                                       WHERE hyobjects_id = %s;\n"
				     (gethash key hash) key))))
		 (insert "COMMIT;\n")
		 (buffer-string))))
      (rcd-sql sql cf-db))))


-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-10-21 15:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-21  7:56 Is there any existing solution to move list number backwards, forwards in a list? Jean Louis
2022-10-21  9:28 ` [SOLVED]: " Jean Louis
2022-10-21 13:13 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-10-21 15:54   ` Jean Louis

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.