Concurrent Clean + 日本語 : 単語の範囲選択

次は、ここですね。現在のカーソル位置を含む単語の前後の位置を検索するということです。isCorrectCharでは、現在のカーソル位置と同じ種類の文字であるかどうかをチェックする関数を返しています。findWordが、実際に前後の位置を検索しているところなので、これを書き換えることになります。

< EdMovement.icl >
selectWordAt :: !Position -> EditMonad .env Selection 
selectWordAt {col, row}
  = IF (col == 0)
	THEN
	  ( result {start={col=0,row=row},end={col=0,row=row}} )
	ELSE
	  (
		getText										>>>= \text ->
		let col`				= col - 1
 			(line, _)			= getLine row text
 			char				= line.[col`]
	 		isCorrectChar		=
	 			if (isWordChar char) isWordChar
	 			(if (isFunnyChar char) isFunnyChar
	 			(if (isWhiteSpace char) isWhiteSpace
	 			(otherChar char)))
			(leftCol, rightCol)	= findWord isCorrectChar col` line
		in
	 	result	{ start	= { col = leftCol,	row = row }
	 			, end	= { col = rightCol,	row = row }
	 			}
	  )

findWord :: (Char -> Bool) ColumnNr String -> (ColumnNr, ColumnNr)
findWord isCorrectChar column line
  = (findLeft column, findRight column)
  where
    findLeft column
      | column < 0
        = 0
      | isCorrectChar line.[column]
        = findLeft (column-1)
        = column + 1
    findRight column
      | column >= size line
        = size line
      | isCorrectChar line.[column]
        = findRight (column+1)
        = column

isWordChar c	= isAlpha c || isDigit c || isMember c ['`_']
isFunnyChar c	= isMember c ['~@#$%^?!+-*<>\\/|&=:.']
isWhiteSpace c	= isMember c [' \t\r\n\f\b']
otherChar c		= (==) c