shithub: irc.myr

Download patch

ref: 688ebf8ecf9d1b5de07930f19987d592cf4daab1
parent: 3c12de48c887a96f448830c9ac32af729caf5abc
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Nov 27 13:05:09 EST 2017

Smarter window switching.

	Prefer exact matches over end matches over partial
	matches.

--- a/main.myr
+++ b/main.myr
@@ -645,46 +645,55 @@
 }
 
 const chanswitch = {irc, args
-	var idx, srvidx
-	var ch, srv
+	/* full, end, internal */
+	var matches = [(-1, -1), (-1, -1), (-1, -1)]
+	var srv
 
 	if args.len != 1
 		status(irc, irc.self, "invalid arguments: {j= }", args)
 	else
-		srvidx = -1
-		idx = -1
 		irc.chandirty = true
 		irc.cmddirty = true
-		match std.strfind(irc.self.name, args[0])
-		| `std.None:	/* ok */
-		| `std.Some i:	idx = i
+		match matchrank(irc.self.name, args[0])
+		| `std.None:		/* ok */
+		| `std.Some rank:	matches[rank] = (0, -1)
 		;;
 		for var i = 0; i < irc.srv.len; i++
 			srv = irc.srv[i]
 			for var j = 0; j < srv.chan.len; j++
-				ch = srv.chan[j]
-				match std.strfind(ch.name, args[0])
-				| `std.None:	/* ok */
-				| `std.Some n:
-					if idx != -1
-						status(irc, irc.self, "ambiguous channel name {}", args[0])
-						-> void
-					else
-						srvidx = i
-						idx = j
-					;;
+				match matchrank(srv.chan[j].name, args[0])
+				| `std.None:		/* ok */
+				| `std.Some rank:
+					matches[rank] = (j, i)
 				;;
 			;;
 		;;
-		if idx != -1
-			if idx == -1 || srvidx == -1
-				irc.focus = -1
-			else
-				irc.focus = srvidx
-				irc.srv[srvidx].focus = idx
-				irc.srv[srvidx].chan[idx].stale = false
-				irc.srv[srvidx].chan[idx].flagged = false
+
+		for (chanidx, srvidx) : matches[:]
+			if chanidx < 0
+				continue
 			;;
+			irc.focus = srvidx
+			if srvidx >= 0
+				irc.srv[srvidx].focus = chanidx
+				irc.srv[srvidx].chan[chanidx].stale = false
+				irc.srv[srvidx].chan[chanidx].flagged = false
+			;;
+			break
+		;;
+	;;
+}
+
+const matchrank = {str, name
+	match std.strfind(str, name)
+	| `std.None:
+		-> `std.None
+	| `std.Some idx:
+		match (idx, idx + name.len == str.len)
+		| (0, true):	-> `std.Some 0
+		| (_, true):	-> `std.Some 1
+		| (0, false):	-> `std.Some 1
+		| (_, _):	-> `std.Some 2
 		;;
 	;;
 }
--