about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2023-06-29 13:39:58 +0200
committerbptato <nincsnevem662@gmail.com>2023-06-29 13:51:55 +0200
commit19068fd7d803a157de671e189e01731bc903ba9e (patch)
treeaae00bec40a00b67586373199cfe6d9789e19013
parent1dd9eba6aba9760339fbef9bbd4244108fac2eab (diff)
downloadchawan-19068fd7d803a157de671e189e01731bc903ba9e.tar.gz
Factor out map search, remove sugar
-rw-r--r--src/data/idna.nim12
-rw-r--r--src/encoding/encoderstream.nim8
-rw-r--r--src/io/lineedit.nim12
-rw-r--r--src/types/color.nim313
-rw-r--r--src/utils/map.nim21
-rw-r--r--src/utils/opt.nim7
-rw-r--r--src/utils/twtstr.nim14
7 files changed, 200 insertions, 187 deletions
diff --git a/src/data/idna.nim b/src/data/idna.nim
index 451792a2..a067a66f 100644
--- a/src/data/idna.nim
+++ b/src/data/idna.nim
@@ -2,9 +2,10 @@ import algorithm
 import unicode
 import sets
 import tables
-import sugar
 import strutils
 
+import utils/map
+
 type
   IDNATableStatus* = enum
     IDNA_VALID, IDNA_IGNORED, IDNA_MAPPED, IDNA_DEVIATION, IDNA_DISALLOWED
@@ -141,15 +142,6 @@ const (MappedMap,
        Ignored,
        Deviation) = loadStuff(IdnaMappingTable)
 
-func searchInMap[U, T](a: openarray[(U, T)], u: U): int =
-  binarySearch(a, u, (x, y) => cmp(x[0], y))
-
-func isInMap[U, T](a: openarray[(U, T)], u: U): bool =
-  a.searchInMap(u) != -1
-
-func isInRange[U](a: openarray[(U, U)], u: U): bool =
-  binarySearch(a, u, (x, y) => (if x[0] < y: -1 elif x[1] > y: 1 else: 0)) != -1
-
 func getIdnaTableStatus*(r: Rune): IDNATableStatus =
   let i = uint32(r)
   {.cast(noSideEffect).}:
diff --git a/src/encoding/encoderstream.nim b/src/encoding/encoderstream.nim
index 57f27dd1..56d4c3da 100644
--- a/src/encoding/encoderstream.nim
+++ b/src/encoding/encoderstream.nim
@@ -5,6 +5,7 @@ import streams
 import unicode
 
 import data/charset
+import utils/map
 
 # EncoderStream encodes utf-32 to the specified encoding.
 type
@@ -57,12 +58,7 @@ template append_byte(stream: EncoderStream, c: int,
   stream.append_byte cast[uint8](c), oq, olen, n
 
 func findPair[U, V](map: seq[(U, V)], c: uint32): int =
-  when not (typeof(c) is U):
-    if c > cast[typeof(c)](high(U)):
-      return -1
-  return binarySearch(map, cast[U](c),
-    proc(a: tuple[ucs: U, val: V], b: U): int =
-      cmp(a.ucs, b))
+  return searchInMap(map, cast[U](c))
 
 proc handleError(stream: EncoderStream, oq: ptr UncheckedArray[uint8],
     olen: int, n: var int, c: uint32) =
diff --git a/src/io/lineedit.nim b/src/io/lineedit.nim
index 83f98ccb..51bf7cd9 100644
--- a/src/io/lineedit.nim
+++ b/src/io/lineedit.nim
@@ -1,7 +1,6 @@
 import unicode
 import strutils
 import sequtils
-import sugar
 
 import bindings/quickjs
 import buffer/cell
@@ -153,7 +152,16 @@ proc drawPrompt*(edit: LineEdit) =
 
 proc insertCharseq(edit: LineEdit, cs: var seq[Rune]) =
   let escNext = edit.escNext
-  cs.keepIf((r) => (escNext or not r.isControlChar) and not (r.isAscii and char(r) in edit.disallowed))
+  var i = 0
+  for j in 0 ..< cs.len:
+    if cs[i].isAscii():
+      let c = cast[char](cs[i])
+      if not escNext and c in Controls or c in edit.disallowed:
+        continue
+    if i != j:
+      cs[i] = cs[j]
+    inc i
+
   edit.escNext = false
   if cs.len == 0:
     return
diff --git a/src/types/color.nim b/src/types/color.nim
index a22ce1e5..d917569a 100644
--- a/src/types/color.nim
+++ b/src/types/color.nim
@@ -1,8 +1,6 @@
 import math
 import options
-import sequtils
 import strutils
-import sugar
 import tables
 
 import utils/twtstr
@@ -62,156 +60,161 @@ const
   ANSI_CYAN* = ANSIColor(6u8)
   ANSI_WHITE* = ANSIColor(7u8)
 
-const ColorsRGB* = {
-  "aliceblue": 0xf0f8ff,
-  "antiquewhite": 0xfaebd7,
-  "aqua": 0x00ffff,
-  "aquamarine": 0x7fffd4,
-  "azure": 0xf0ffff,
-  "beige": 0xf5f5dc,
-  "bisque": 0xffe4c4,
-  "black": 0x000000,
-  "blanchedalmond": 0xffebcd,
-  "blue": 0x0000ff,
-  "blueviolet": 0x8a2be2,
-  "brown": 0xa52a2a,
-  "burlywood": 0xdeb887,
-  "cadetblue": 0x5f9ea0,
-  "chartreuse": 0x7fff00,
-  "chocolate": 0xd2691e,
-  "coral": 0xff7f50,
-  "cornflowerblue": 0x6495ed,
-  "cornsilk": 0xfff8dc,
-  "crimson": 0xdc143c,
-  "cyan": 0x00ffff,
-  "darkblue": 0x00008b,
-  "darkcyan": 0x008b8b,
-  "darkgoldenrod": 0xb8860b,
-  "darkgray": 0xa9a9a9,
-  "darkgreen": 0x006400,
-  "darkgrey": 0xa9a9a9,
-  "darkkhaki": 0xbdb76b,
-  "darkmagenta": 0x8b008b,
-  "darkolivegreen": 0x556b2f,
-  "darkorange": 0xff8c00,
-  "darkorchid": 0x9932cc,
-  "darkred": 0x8b0000,
-  "darksalmon": 0xe9967a,
-  "darkseagreen": 0x8fbc8f,
-  "darkslateblue": 0x483d8b,
-  "darkslategray": 0x2f4f4f,
-  "darkslategrey": 0x2f4f4f,
-  "darkturquoise": 0x00ced1,
-  "darkviolet": 0x9400d3,
-  "deeppink": 0xff1493,
-  "deepskyblue": 0x00bfff,
-  "dimgray": 0x696969,
-  "dimgrey": 0x696969,
-  "dodgerblue": 0x1e90ff,
-  "firebrick": 0xb22222,
-  "floralwhite": 0xfffaf0,
-  "forestgreen": 0x228b22,
-  "fuchsia": 0xff00ff,
-  "gainsboro": 0xdcdcdc,
-  "ghostwhite": 0xf8f8ff,
-  "gold": 0xffd700,
-  "goldenrod": 0xdaa520,
-  "gray": 0x808080,
-  "green": 0x008000,
-  "greenyellow": 0xadff2f,
-  "grey": 0x808080,
-  "honeydew": 0xf0fff0,
-  "hotpink": 0xff69b4,
-  "indianred": 0xcd5c5c,
-  "indigo": 0x4b0082,
-  "ivory": 0xfffff0,
-  "khaki": 0xf0e68c,
-  "lavender": 0xe6e6fa,
-  "lavenderblush": 0xfff0f5,
-  "lawngreen": 0x7cfc00,
-  "lemonchiffon": 0xfffacd,
-  "lightblue": 0xadd8e6,
-  "lightcoral": 0xf08080,
-  "lightcyan": 0xe0ffff,
-  "lightgoldenrodyellow": 0xfafad2,
-  "lightgray": 0xd3d3d3,
-  "lightgreen": 0x90ee90,
-  "lightgrey": 0xd3d3d3,
-  "lightpink": 0xffb6c1,
-  "lightsalmon": 0xffa07a,
-  "lightseagreen": 0x20b2aa,
-  "lightskyblue": 0x87cefa,
-  "lightslategray": 0x778899,
-  "lightslategrey": 0x778899,
-  "lightsteelblue": 0xb0c4de,
-  "lightyellow": 0xffffe0,
-  "lime": 0x00ff00,
-  "limegreen": 0x32cd32,
-  "linen": 0xfaf0e6,
-  "magenta": 0xff00ff,
-  "maroon": 0x800000,
-  "mediumaquamarine": 0x66cdaa,
-  "mediumblue": 0x0000cd,
-  "mediumorchid": 0xba55d3,
-  "mediumpurple": 0x9370db,
-  "mediumseagreen": 0x3cb371,
-  "mediumslateblue": 0x7b68ee,
-  "mediumspringgreen": 0x00fa9a,
-  "mediumturquoise": 0x48d1cc,
-  "mediumvioletred": 0xc71585,
-  "midnightblue": 0x191970,
-  "mintcream": 0xf5fffa,
-  "mistyrose": 0xffe4e1,
-  "moccasin": 0xffe4b5,
-  "navajowhite": 0xffdead,
-  "navy": 0x000080,
-  "oldlace": 0xfdf5e6,
-  "olive": 0x808000,
-  "olivedrab": 0x6b8e23,
-  "orange": 0xffa500,
-  "orangered": 0xff4500,
-  "orchid": 0xda70d6,
-  "palegoldenrod": 0xeee8aa,
-  "palegreen": 0x98fb98,
-  "paleturquoise": 0xafeeee,
-  "palevioletred": 0xdb7093,
-  "papayawhip": 0xffefd5,
-  "peachpuff": 0xffdab9,
-  "peru": 0xcd853f,
-  "pink": 0xffc0cb,
-  "plum": 0xdda0dd,
-  "powderblue": 0xb0e0e6,
-  "purple": 0x800080,
-  "red": 0xff0000,
-  "rosybrown": 0xbc8f8f,
-  "royalblue": 0x4169e1,
-  "saddlebrown": 0x8b4513,
-  "salmon": 0xfa8072,
-  "sandybrown": 0xf4a460,
-  "seagreen": 0x2e8b57,
-  "seashell": 0xfff5ee,
-  "sienna": 0xa0522d,
-  "silver": 0xc0c0c0,
-  "skyblue": 0x87ceeb,
-  "slateblue": 0x6a5acd,
-  "slategray": 0x708090,
-  "slategrey": 0x708090,
-  "snow": 0xfffafa,
-  "springgreen": 0x00ff7f,
-  "steelblue": 0x4682b4,
-  "tan": 0xd2b48c,
-  "teal": 0x008080,
-  "thistle": 0xd8bfd8,
-  "tomato": 0xff6347,
-  "turquoise": 0x40e0d0,
-  "violet": 0xee82ee,
-  "wheat": 0xf5deb3,
-  "white": 0xffffff,
-  "whitesmoke": 0xf5f5f5,
-  "yellow": 0xffff00,
-  "yellowgreen": 0x9acd32,
-  "rebeccapurple": 0x663399,
-}.map((a) => (a[0], RGBColor(a[1]))).toTable()
+const ColorsRGB* = block:
+  const ColorsRGBMap = {
+    "aliceblue": 0xf0f8ff,
+    "antiquewhite": 0xfaebd7,
+    "aqua": 0x00ffff,
+    "aquamarine": 0x7fffd4,
+    "azure": 0xf0ffff,
+    "beige": 0xf5f5dc,
+    "bisque": 0xffe4c4,
+    "black": 0x000000,
+    "blanchedalmond": 0xffebcd,
+    "blue": 0x0000ff,
+    "blueviolet": 0x8a2be2,
+    "brown": 0xa52a2a,
+    "burlywood": 0xdeb887,
+    "cadetblue": 0x5f9ea0,
+    "chartreuse": 0x7fff00,
+    "chocolate": 0xd2691e,
+    "coral": 0xff7f50,
+    "cornflowerblue": 0x6495ed,
+    "cornsilk": 0xfff8dc,
+    "crimson": 0xdc143c,
+    "cyan": 0x00ffff,
+    "darkblue": 0x00008b,
+    "darkcyan": 0x008b8b,
+    "darkgoldenrod": 0xb8860b,
+    "darkgray": 0xa9a9a9,
+    "darkgreen": 0x006400,
+    "darkgrey": 0xa9a9a9,
+    "darkkhaki": 0xbdb76b,
+    "darkmagenta": 0x8b008b,
+    "darkolivegreen": 0x556b2f,
+    "darkorange": 0xff8c00,
+    "darkorchid": 0x9932cc,
+    "darkred": 0x8b0000,
+    "darksalmon": 0xe9967a,
+    "darkseagreen": 0x8fbc8f,
+    "darkslateblue": 0x483d8b,
+    "darkslategray": 0x2f4f4f,
+    "darkslategrey": 0x2f4f4f,
+    "darkturquoise": 0x00ced1,
+    "darkviolet": 0x9400d3,
+    "deeppink": 0xff1493,
+    "deepskyblue": 0x00bfff,
+    "dimgray": 0x696969,
+    "dimgrey": 0x696969,
+    "dodgerblue": 0x1e90ff,
+    "firebrick": 0xb22222,
+    "floralwhite": 0xfffaf0,
+    "forestgreen": 0x228b22,
+    "fuchsia": 0xff00ff,
+    "gainsboro": 0xdcdcdc,
+    "ghostwhite": 0xf8f8ff,
+    "gold": 0xffd700,
+    "goldenrod": 0xdaa520,
+    "gray": 0x808080,
+    "green": 0x008000,
+    "greenyellow": 0xadff2f,
+    "grey": 0x808080,
+    "honeydew": 0xf0fff0,
+    "hotpink": 0xff69b4,
+    "indianred": 0xcd5c5c,
+    "indigo": 0x4b0082,
+    "ivory": 0xfffff0,
+    "khaki": 0xf0e68c,
+    "lavender": 0xe6e6fa,
+    "lavenderblush": 0xfff0f5,
+    "lawngreen": 0x7cfc00,
+    "lemonchiffon": 0xfffacd,
+    "lightblue": 0xadd8e6,
+    "lightcoral": 0xf08080,
+    "lightcyan": 0xe0ffff,
+    "lightgoldenrodyellow": 0xfafad2,
+    "lightgray": 0xd3d3d3,
+    "lightgreen": 0x90ee90,
+    "lightgrey": 0xd3d3d3,
+    "lightpink": 0xffb6c1,
+    "lightsalmon": 0xffa07a,
+    "lightseagreen": 0x20b2aa,
+    "lightskyblue": 0x87cefa,
+    "lightslategray": 0x778899,
+    "lightslategrey": 0x778899,
+    "lightsteelblue": 0xb0c4de,
+    "lightyellow": 0xffffe0,
+    "lime": 0x00ff00,
+    "limegreen": 0x32cd32,
+    "linen": 0xfaf0e6,
+    "magenta": 0xff00ff,
+    "maroon": 0x800000,
+    "mediumaquamarine": 0x66cdaa,
+    "mediumblue": 0x0000cd,
+    "mediumorchid": 0xba55d3,
+    "mediumpurple": 0x9370db,
+    "mediumseagreen": 0x3cb371,
+    "mediumslateblue": 0x7b68ee,
+    "mediumspringgreen": 0x00fa9a,
+    "mediumturquoise": 0x48d1cc,
+    "mediumvioletred": 0xc71585,
+    "midnightblue": 0x191970,
+    "mintcream": 0xf5fffa,
+    "mistyrose": 0xffe4e1,
+    "moccasin": 0xffe4b5,
+    "navajowhite": 0xffdead,
+    "navy": 0x000080,
+    "oldlace": 0xfdf5e6,
+    "olive": 0x808000,
+    "olivedrab": 0x6b8e23,
+    "orange": 0xffa500,
+    "orangered": 0xff4500,
+    "orchid": 0xda70d6,
+    "palegoldenrod": 0xeee8aa,
+    "palegreen": 0x98fb98,
+    "paleturquoise": 0xafeeee,
+    "palevioletred": 0xdb7093,
+    "papayawhip": 0xffefd5,
+    "peachpuff": 0xffdab9,
+    "peru": 0xcd853f,
+    "pink": 0xffc0cb,
+    "plum": 0xdda0dd,
+    "powderblue": 0xb0e0e6,
+    "purple": 0x800080,
+    "red": 0xff0000,
+    "rosybrown": 0xbc8f8f,
+    "royalblue": 0x4169e1,
+    "saddlebrown": 0x8b4513,
+    "salmon": 0xfa8072,
+    "sandybrown": 0xf4a460,
+    "seagreen": 0x2e8b57,
+    "seashell": 0xfff5ee,
+    "sienna": 0xa0522d,
+    "silver": 0xc0c0c0,
+    "skyblue": 0x87ceeb,
+    "slateblue": 0x6a5acd,
+    "slategray": 0x708090,
+    "slategrey": 0x708090,
+    "snow": 0xfffafa,
+    "springgreen": 0x00ff7f,
+    "steelblue": 0x4682b4,
+    "tan": 0xd2b48c,
+    "teal": 0x008080,
+    "thistle": 0xd8bfd8,
+    "tomato": 0xff6347,
+    "turquoise": 0x40e0d0,
+    "violet": 0xee82ee,
+    "wheat": 0xf5deb3,
+    "white": 0xffffff,
+    "whitesmoke": 0xf5f5f5,
+    "yellow": 0xffff00,
+    "yellowgreen": 0x9acd32,
+    "rebeccapurple": 0x663399,
+  }
+  var res: Table[string, RGBColor]
+  for it in ColorsRGBMap:
+    res[it[0]] = RGBColor(it[1])
+  res
 
 func r*(c: RGBAColor): uint8 =
   return cast[uint8]((uint32(c) shr 16) and 0xff)
@@ -319,12 +322,6 @@ func blend*(c0, c1: RGBAColor): RGBAColor =
   let res = straight(pres)
   return res
 
-#func blend*(c0, c1: RGBAColor): RGBAColor =
-#  const norm = 1f64 / 255f64
-#  let c0a = float64(c0.a) * norm
-#  let c1a = float64(c1.a) * norm
-#  let a0 = c0a + c1a * (1 - c0a)
-
 func rgb*(r, g, b: uint8): RGBColor =
   return RGBColor((uint32(r) shl 16) or (uint32(g) shl 8) or uint32(b))
 
diff --git a/src/utils/map.nim b/src/utils/map.nim
new file mode 100644
index 00000000..526b9154
--- /dev/null
+++ b/src/utils/map.nim
@@ -0,0 +1,21 @@
+import algorithm
+
+func searchInMap*[U, T](a: openarray[(U, T)], u: U): int =
+  when not (typeof(u) is U):
+    if c > cast[typeof(c)](high(U)):
+      return -1
+  binarySearch(a, u, proc(x: (U, T), y: U): int = cmp(x[0], y))
+
+func isInMap*[U, T](a: openarray[(U, T)], u: U): bool =
+  a.searchInMap(u) != -1
+
+func isInRange*[U](a: openarray[(U, U)], u: U): bool =
+  let res = binarySearch(a, u, proc(x: (U, U), y: U): int =
+    if x[0] < y:
+      -1
+    elif x[1] > y:
+      1
+    else:
+      0
+  )
+  return res != -1
diff --git a/src/utils/opt.nim b/src/utils/opt.nim
index bcc4c595..7dd045af 100644
--- a/src/utils/opt.nim
+++ b/src/utils/opt.nim
@@ -100,10 +100,7 @@ template `?`*[T, E](res: Result[T, E]): auto =
   else:
     when typeof(result) is Result[T, E]:
       return x
-    elif typeof(result).errType is E:
-      when E is void:
-        return err()
-      else:
-        return err(x.error)
+    elif not (E is void) and typeof(result).errType is E:
+      return err(x.error)
     else:
       return err()
diff --git a/src/utils/twtstr.nim b/src/utils/twtstr.nim
index 35023290..0c37439a 100644
--- a/src/utils/twtstr.nim
+++ b/src/utils/twtstr.nim
@@ -3,7 +3,6 @@ import strutils
 import unicode
 import os
 import math
-import sugar
 import sequtils
 import options
 import punycode
@@ -12,6 +11,7 @@ import bindings/libunicode
 import data/idna
 import data/charwidth
 import utils/opt
+import utils/map
 
 when defined(posix):
   import posix
@@ -308,7 +308,8 @@ const romanNumbers = [
   (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")
 ]
 
-const romanNumbers_lower = romanNumbers.map((x) => (x[0], x[1].tolower()))
+const romanNumbers_lower = romanNumbers.map(proc(x: auto): auto =
+  (x[0], x[1].tolower()))
 
 func romanNumber*(i: int): string =
   return number_additive(i, 1..3999, romanNumbers)
@@ -721,6 +722,7 @@ func unicodeToAscii*(s: string, checkhyphens, checkbidi, checkjoiners, transitio
       return none(string) #error
   return some(labels.join('.'))
 
+
 # https://www.w3.org/TR/xml/#NT-Name
 const NameStartCharRanges = [
   (0xC0, 0xD6),
@@ -755,7 +757,7 @@ func matchNameProduction*(str: string): bool =
     inc i
   else:
     fastRuneAt(str, i, r)
-    if binarySearch(NameStartCharRanges, int32(r), (x, y) => cmp(x[0], y)) == -1:
+    if not isInRange(NameStartCharRanges, int32(r)):
       return false
   # NameChar
   while i < str.len:
@@ -765,9 +767,9 @@ func matchNameProduction*(str: string): bool =
       inc i
     else:
       fastRuneAt(str, i, r)
-      if binarySearch(NameStartCharRanges, int32(r), (x, y) => cmp(x[0], y)) == -1:
-        if binarySearch(NameCharRanges, int32(r), (x, y) => cmp(x[0], y)) == -1:
-          return false
+      if not isInRange(NameStartCharRanges, int32(r)) and
+          not isInMap(NameCharRanges, int32(r)):
+        return false
   return true
 
 func matchQNameProduction*(s: string): bool =