PasteRack.org
Paste # 60840
2024-10-24 19:06:01

Fork as a new paste.

Paste viewed 152 times.


Embed:

  1. #lang racket
  2.  
  3. (provide (all-defined-out))
  4.  
  5. (require rackunit
  6.          2htdp/image
  7.          2htdp/universe)
  8.  
  9. ;; constants
  10. (define FONT-SIZE 32)
  11. (define FONT-COLOR "black")
  12. (define CURSOR-WIDTH 2)
  13. (define TEXTBOX-WIDTH 512)
  14. (define TEXTBOX-HEIGHT 40)
  15. (define INITIAL-SPACE 4)
  16. (define TEXTBOX (empty-scene TEXTBOX-WIDTH TEXTBOX-HEIGHT))
  17.  
  18.  
  19. ;; ListofChars is either:
  20. ;; - '()
  21. ;; - (cons char ListofChars)
  22. ;; interp: represents a set of characters
  23.  
  24. ;; interp: Rchars is a ListofChars
  25. (define (Rchars? x)
  26.   (andmap char? x))
  27.  
  28. ;; interp: Lchars is a ListofChars
  29. (define (Lchars? x)
  30.   (andmap char? x))
  31.  
  32.  
  33. ;; A TextBox is a (make-TextBox[Lchars: ListofChars] [Rchars: ListofChars]) where:
  34. ;; Lchars: represents the list of characters to the left of cursor
  35. ;; RChars: represents the list of characters to the right of cursor
  36. (struct TextBox[Lchars Rchars] #:transparent)
  37. (define/contract (make-TextBox Lchars Rchars)
  38.   (-> Lchars? Rchars? TextBox?)
  39.   (TextBox Lchars Rchars))
  40.  
  41.  
  42. ;; constants for testing
  43. (define TEST-LIST1 (list #\l #\e #\f #\t))
  44. (define TEST-LIST2 (list #\r #\i #\g #\h #\t))
  45. (define TEST-TEXTBOX1 (make-TextBox TEST-LIST1 TEST-LIST2))
  46. (define TEST-STR1 "left")
  47. (define TEST-STR2 "right")
  48.  
  49.  
  50. ;; create-TextBox: string & string -> TextBox
  51. ;; takes 2 strings and create a TextBox struct with them
  52. (define/contract (create-TextBox Lstring Rstring)
  53.   (-> string? string? TextBox?)
  54.   (let ([Lchars (string->list Lstring)]
  55.         [Rchars (string->list Rstring)])
  56.     (make-TextBox Lchars Rchars)))
  57.  
  58. (check-equal? (create-TextBox TEST-STR1 TEST-STR2)
  59.               TEST-TEXTBOX1)
  60.  
  61.  
  62. ;; TextBox-pre: TextBox -> string
  63. ;; takes a TextBox instance and returns the string of the contents before the cursor
  64. (define/contract (TextBox-pre text)
  65.   (-> TextBox? string?)
  66.   (let ([Lchars (TextBox-Lchars text)])
  67.     (list->string Lchars)))
  68.  
  69. (check-equal? (TextBox-pre TEST-TEXTBOX1)
  70.               TEST-STR1)
  71.  
  72. #;(define/contract (TextBox-pre2 text)
  73.     (-> TextBox? string?)
  74.     ((compose1 list->string TextBox-Lchars) text))
  75.  
  76. #;(check-equal? (TextBox-pre TEST-TEXTBOX1)
  77.                 (TextBox-pre2 TEST-TEXTBOX1))
  78.  
  79.  
  80. ;; TextBox-post: TextBox -> string
  81. ;; takes a TextBox instance and returns the string of the contents after the cursor
  82. (define/contract (TextBox-post text)
  83.   (-> TextBox? string?)
  84.   (let ([Rchars (TextBox-Rchars text)])
  85.     (list->string Rchars)))
  86.  
  87. (check-equal? (TextBox-post TEST-TEXTBOX1)
  88.               TEST-STR2)
  89.  
  90.  
  91. ;; render: TextBox ->
  92. ;; takes a TextBox and print it on top of
  93. #;(define/contract (render Text)
  94.   (-> TextBox? Image?)
  95.  
  96.   )

=>