changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/organ/object/stat-cookie.lisp

changeset 698: 96958d3eb5b0
parent: a5ae5a58c4cd
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
132
ellis <ellis@rwest.io>
parents: 128
diff changeset
1
 ;;; Code:
128
99f2ab6bc8ba organ work
ellis <ellis@rwest.io>
parents: 127
diff changeset
2
 (in-package :organ)
99f2ab6bc8ba organ work
ellis <ellis@rwest.io>
parents: 127
diff changeset
3
 
132
ellis <ellis@rwest.io>
parents: 128
diff changeset
4
 ;; the logic will be a bit weird here - we store 2 numbers (completed
ellis <ellis@rwest.io>
parents: 128
diff changeset
5
 ;; vs remaining) but sometimes need to parse a percentage without
ellis <ellis@rwest.io>
parents: 128
diff changeset
6
 ;; actually knowing the counts of completed vs remaining. To get
ellis <ellis@rwest.io>
parents: 128
diff changeset
7
 ;; around this, we'll allow a float to be stored in the N1 slot, which
ellis <ellis@rwest.io>
parents: 128
diff changeset
8
 ;; indicated that we parsed a percentage without knowing our counts.
133
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
9
 (define-org-object stat-cookie ((n1 0 :type number) (n2 0 :type fixnum)))
132
ellis <ellis@rwest.io>
parents: 128
diff changeset
10
 
ellis <ellis@rwest.io>
parents: 128
diff changeset
11
 (defmacro matches (name)
ellis <ellis@rwest.io>
parents: 128
diff changeset
12
   `(make-matcher ,name))
ellis <ellis@rwest.io>
parents: 128
diff changeset
13
 
ellis <ellis@rwest.io>
parents: 128
diff changeset
14
 (define-matcher stat-cookie-percent (is #\%))
ellis <ellis@rwest.io>
parents: 128
diff changeset
15
 
ellis <ellis@rwest.io>
parents: 128
diff changeset
16
 (define-matcher stat-cookie-ratio (is #\/))
ellis <ellis@rwest.io>
parents: 128
diff changeset
17
 
133
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
18
 (define-matcher int (in #\0 #\9))
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
19
 
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
20
 (define-matcher stat-cookie-start 
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
21
     (and (is #\[)
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
22
          (next (matches (or :int
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
23
                             :stat-cookie-ratio
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
24
                             :stat-cookie-percent)))))
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
25
 
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
26
 (define-matcher stat-cookie-end (is #\]))
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
27
 
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
28
 ;; this feels slow
132
ellis <ellis@rwest.io>
parents: 128
diff changeset
29
 (define-org-parser (stat-cookie :from string)
ellis <ellis@rwest.io>
parents: 128
diff changeset
30
   ;; either X/Y or X%
ellis <ellis@rwest.io>
parents: 128
diff changeset
31
   (with-lexer-environment (input)
133
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
32
     (when (char= #\[ (consume))
132
ellis <ellis@rwest.io>
parents: 128
diff changeset
33
       (let ((res (org-create :stat-cookie)))
ellis <ellis@rwest.io>
parents: 128
diff changeset
34
         (setf (org-stat-cookie-n1 res)
ellis <ellis@rwest.io>
parents: 128
diff changeset
35
               (parse-number
133
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
36
                (consume-until (matches (not :int)))))
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
37
         (case (consume)
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
38
           (#\/ (setf (org-stat-cookie-n2 res) (parse-number (consume-until (matches :stat-cookie-end)))))
a5ae5a58c4cd org element comments and type definitions
ellis <ellis@rwest.io>
parents: 132
diff changeset
39
           (#\% (setf (org-stat-cookie-n1 res) (/  (org-stat-cookie-n1 res) 100))))
132
ellis <ellis@rwest.io>
parents: 128
diff changeset
40
         res))))
ellis <ellis@rwest.io>
parents: 128
diff changeset
41