module Editor(oldEditorF,selectall,loadEditor,setEditorCursorPos) where
import Command
import CompOps((>+<))
import Cont(cmdContK')
import Cursor
import Defaults(menuFont,bgColor,metaKey)--defaultFont
import CmdLineEnv(argReadKey)
import QueryPointer
import TimerF
import Dlayout(groupF)
import Edtypes
import Edit--(EditStopT(..), EditCmd(..), EditEvt(..), IsSelect(..), editF)
import Event
--import Font(FontStruct)
import Fudget
import FRequest
import Geometry() -- instances, for hbc
import LayoutRequest
import Loops(loopCompThroughRightF)
--import Message(Message(..))
import NullF
--import Path(Path(..))
import PopupMenuF
--import SP
import SelectionF
--import Utils(mapList)--loop,
import Xtypes
import Data.Char(isAlpha,toLower,isPrint)
--import Graphic
import InputMsg(InputMsg(..))

default(Int) -- mostly for Hugs

ems :: EditStopFn -> IsSelect -> EditCmd
ems = EditStop -> IsSelect -> EditCmd
EditMove (EditStop -> IsSelect -> EditCmd)
-> (EditStopFn -> EditStop) -> EditStopFn -> IsSelect -> EditCmd
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EditStopFn -> EditStop
EditStopFn
stopafter :: Int -> EDirection -> IsSelect -> EditCmd
stopafter Int
n EDirection
dir = EditStopFn -> IsSelect -> EditCmd
ems (Int -> EditStopFn
sa Int
n) 
	  where sa :: Int -> EditStopFn
sa Int
n String
b String
a = if (Int
n::Int) Int -> Int -> IsSelect
forall a. Ord a => a -> a -> IsSelect
<= Int
0 then EditStopChoice
EdStop else EDirection -> EditStopFn -> EditStopChoice
EdGo EDirection
dir (Int -> EditStopFn
sa (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1))
stop1 :: EDirection -> IsSelect -> EditCmd
stop1 = Int -> EDirection -> IsSelect -> EditCmd
stopafter Int
1

ifhd :: (t -> IsSelect) -> [t] -> IsSelect
ifhd t -> IsSelect
p [t]
l = IsSelect -> IsSelect
not ([t] -> IsSelect
forall (t :: * -> *) a. Foldable t => t a -> IsSelect
null [t]
l) IsSelect -> IsSelect -> IsSelect
&& t -> IsSelect
p ([t] -> t
forall a. [a] -> a
head [t]
l)
aheadl :: EDirection -> p -> p -> p
aheadl EDirection
dir p
b p
a = if EDirection
dir EDirection -> EDirection -> IsSelect
forall a. Eq a => a -> a -> IsSelect
== EDirection
ELeft then p
b else p
a
ifdirhd :: (t -> IsSelect) -> EDirection -> [t] -> [t] -> IsSelect
ifdirhd t -> IsSelect
p EDirection
dir [t]
b [t]
a = (t -> IsSelect) -> [t] -> IsSelect
forall t. (t -> IsSelect) -> [t] -> IsSelect
ifhd t -> IsSelect
p (EDirection -> [t] -> [t] -> [t]
forall p. EDirection -> p -> p -> p
aheadl EDirection
dir [t]
b [t]
a)
stopwhen :: (Char -> IsSelect) -> EDirection -> IsSelect -> EditCmd
stopwhen Char -> IsSelect
p EDirection
dir = EditStopFn -> IsSelect -> EditCmd
ems EditStopFn
sw
   where sw :: EditStopFn
sw String
b String
a = if (Char -> IsSelect) -> EDirection -> String -> String -> IsSelect
forall t. (t -> IsSelect) -> EDirection -> [t] -> [t] -> IsSelect
ifdirhd Char -> IsSelect
p EDirection
dir String
b String
a then EditStopChoice
EdStop
	          else EDirection -> EditStopFn -> EditStopChoice
EdGo EDirection
dir EditStopFn
sw
stopat :: Char -> EDirection -> IsSelect -> EditCmd
stopat Char
c = (Char -> IsSelect) -> EDirection -> IsSelect -> EditCmd
stopwhen (Char -> Char -> IsSelect
forall a. Eq a => a -> a -> IsSelect
==Char
c)
stopnl :: EDirection -> IsSelect -> EditCmd
stopnl = Char -> EDirection -> IsSelect -> EditCmd
stopat Char
newline

stopborder :: (Char -> IsSelect) -> EDirection -> IsSelect -> EditCmd
stopborder Char -> IsSelect
p EDirection
dir = EditStopFn -> IsSelect -> EditCmd
ems EditStopFn
sw
  where sw :: EditStopFn
sw String
b String
a = if (Char -> IsSelect) -> EDirection -> String -> String -> IsSelect
forall t. (t -> IsSelect) -> EDirection -> [t] -> [t] -> IsSelect
ifdirhd (IsSelect -> IsSelect
not (IsSelect -> IsSelect) -> (Char -> IsSelect) -> Char -> IsSelect
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> IsSelect
p) EDirection
dir String
b String
a IsSelect -> IsSelect -> IsSelect
&&
		    (Char -> IsSelect) -> EDirection -> String -> String -> IsSelect
forall t. (t -> IsSelect) -> EDirection -> [t] -> [t] -> IsSelect
ifdirhd Char -> IsSelect
p EDirection
dir String
a String
b then EditStopChoice
EdStop
		 else EDirection -> EditStopFn -> EditStopChoice
EdGo EDirection
dir EditStopFn
sw

stopword :: EDirection -> IsSelect -> EditCmd
stopword = (Char -> IsSelect) -> EDirection -> IsSelect -> EditCmd
stopborder Char -> IsSelect
isAlpha

neverstop :: EDirection -> IsSelect -> EditCmd
neverstop = (Char -> IsSelect) -> EDirection -> IsSelect -> EditCmd
stopwhen (IsSelect -> Char -> IsSelect
forall a b. a -> b -> a
const IsSelect
False)

-- replaceAll is used for TextRequests
loadEditor :: String -> [EditCmd]
loadEditor String
s = [EditCmd]
selectall[EditCmd] -> [EditCmd] -> [EditCmd]
forall a. [a] -> [a] -> [a]
++[String -> EditCmd
EditReplace String
s]
selectall :: [EditCmd]
selectall = [EDirection -> IsSelect -> EditCmd
neverstop EDirection
ELeft IsSelect
False,
	     EDirection -> IsSelect -> EditCmd
neverstop EDirection
ERight IsSelect
True]

setEditorCursorPos :: (Int, Int) -> [EditCmd]
setEditorCursorPos (Int
row,Int
col) =
   EditStop -> IsSelect -> EditCmd
EditMove (Point -> EditStop
EditPoint Point
0) IsSelect
False EditCmd -> [EditCmd] -> [EditCmd]
forall a. a -> [a] -> [a]
:
   [[EditCmd]] -> [EditCmd]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (Int -> [EditCmd] -> [[EditCmd]]
forall a. Int -> a -> [a]
replicate (Int
rowInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) ([IsSelect -> EditCmd]
down [IsSelect -> EditCmd] -> IsSelect -> [EditCmd]
forall t a. [t -> a] -> t -> [a]
`funmap` IsSelect
False)) [EditCmd] -> [EditCmd] -> [EditCmd]
forall a. [a] -> [a] -> [a]
++
   [Int -> EDirection -> IsSelect -> EditCmd
stopafter (Int
colInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) EDirection
ERight IsSelect
False]

horiz :: EDirection -> IsSelect -> [IsSelect -> EditCmd]
horiz EDirection
dir IsSelect
meta = EDirection -> IsSelect -> EditCmd
stop1 EDirection
dir (IsSelect -> EditCmd)
-> [IsSelect -> EditCmd] -> [IsSelect -> EditCmd]
forall a. a -> [a] -> [a]
: if IsSelect
meta then [EDirection -> IsSelect -> EditCmd
stopword EDirection
dir] else []
left :: IsSelect -> [IsSelect -> EditCmd]
left = EDirection -> IsSelect -> [IsSelect -> EditCmd]
horiz EDirection
ELeft
right :: IsSelect -> [IsSelect -> EditCmd]
right = EDirection -> IsSelect -> [IsSelect -> EditCmd]
horiz EDirection
ERight
up :: [IsSelect -> EditCmd]
up = [EditStop -> IsSelect -> EditCmd
EditMove (EDirection -> EditStop
EditLine EDirection
ELeft)]
down :: [IsSelect -> EditCmd]
down = [EditStop -> IsSelect -> EditCmd
EditMove (EDirection -> EditStop
EditLine EDirection
ERight)]

undo :: [b -> EditCmd]
undo = [EditCmd -> b -> EditCmd
forall a b. a -> b -> a
const EditCmd
EditUndo]
redo :: [b -> EditCmd]
redo = [EditCmd -> b -> EditCmd
forall a b. a -> b -> a
const EditCmd
EditRedo]

cursorbindings :: IsSelect -> [(String, [IsSelect -> EditCmd])]
cursorbindings IsSelect
meta = 
    [(String
"left", IsSelect -> [IsSelect -> EditCmd]
left IsSelect
meta), 
     (String
"right",IsSelect -> [IsSelect -> EditCmd]
right IsSelect
meta),
     (String
"up",[IsSelect -> EditCmd]
up),
     (String
"down",[IsSelect -> EditCmd]
down),
     (String
"b",IsSelect -> [IsSelect -> EditCmd]
left IsSelect
meta),
     (String
"f",IsSelect -> [IsSelect -> EditCmd]
right IsSelect
meta)] 

ctrls :: [(String, [IsSelect -> EditCmd])]
ctrls  = [(String
"e",[EDirection -> IsSelect -> EditCmd
stopnl EDirection
ERight]),
         (String
"a",[EDirection -> IsSelect -> EditCmd
stopnl EDirection
ELeft]),
	 (String
"p",[IsSelect -> EditCmd]
up),
	 (String
"n",[IsSelect -> EditCmd]
down),
	 (String
"b",IsSelect -> [IsSelect -> EditCmd]
left IsSelect
False),
	 (String
"f",IsSelect -> [IsSelect -> EditCmd]
right IsSelect
False),
	 (String
"slash",[IsSelect -> EditCmd]
forall b. [b -> EditCmd]
undo),
	 (String
"question",[IsSelect -> EditCmd]
forall b. [b -> EditCmd]
redo)]

selectleft :: IsSelect -> [EditCmd]
selectleft IsSelect
meta = [IsSelect -> EditCmd] -> IsSelect -> [EditCmd]
forall t a. [t -> a] -> t -> [a]
funmap (IsSelect -> [IsSelect -> EditCmd]
left IsSelect
meta) IsSelect
True
[t -> a]
fl funmap :: [t -> a] -> t -> [a]
`funmap` t
x = [t -> a
f t
x | t -> a
f <- [t -> a]
fl]
hasMeta :: t Modifiers -> IsSelect
hasMeta t Modifiers
mods = Modifiers
metaKey Modifiers -> t Modifiers -> IsSelect
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> IsSelect
`elem` t Modifiers
mods
hasControl :: t Modifiers -> IsSelect
hasControl t Modifiers
mods = Modifiers
Control Modifiers -> t Modifiers -> IsSelect
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> IsSelect
`elem` t Modifiers
mods
cursorkey :: t Modifiers -> String -> Maybe [EditCmd]
cursorkey t Modifiers
mods String
key = (String
 -> [(String, [IsSelect -> EditCmd])]
 -> Maybe [IsSelect -> EditCmd])
-> [(String, [IsSelect -> EditCmd])]
-> String
-> Maybe [IsSelect -> EditCmd]
forall a b c. (a -> b -> c) -> b -> a -> c
flip String
-> [(String, [IsSelect -> EditCmd])] -> Maybe [IsSelect -> EditCmd]
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup (if t Modifiers -> IsSelect
forall (t :: * -> *). Foldable t => t Modifiers -> IsSelect
hasControl t Modifiers
mods then [(String, [IsSelect -> EditCmd])]
ctrls 
			     else IsSelect -> [(String, [IsSelect -> EditCmd])]
cursorbindings (t Modifiers -> IsSelect
forall (t :: * -> *). Foldable t => t Modifiers -> IsSelect
hasMeta t Modifiers
mods))
			    ((Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
key) 
		     Maybe [IsSelect -> EditCmd]
-> ([IsSelect -> EditCmd] -> Maybe [EditCmd]) -> Maybe [EditCmd]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \[IsSelect -> EditCmd]
l-> [EditCmd] -> Maybe [EditCmd]
forall a. a -> Maybe a
Just ([IsSelect -> EditCmd] -> IsSelect -> [EditCmd]
forall t a. [t -> a] -> t -> [a]
funmap [IsSelect -> EditCmd]
l (Modifiers
Shift Modifiers -> t Modifiers -> IsSelect
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> IsSelect
`elem` t Modifiers
mods))

isEnterKey :: String -> IsSelect
isEnterKey String
key = String
key String -> String -> IsSelect
forall a. Eq a => a -> a -> IsSelect
== String
"Return" IsSelect -> IsSelect -> IsSelect
|| String
key String -> String -> IsSelect
forall a. Eq a => a -> a -> IsSelect
== String
"KP_Enter"
printorenter :: t Modifiers -> String -> String -> Maybe String
printorenter t Modifiers
mods String
key String
ascii =
    if t Modifiers -> IsSelect
forall (t :: * -> *). Foldable t => t Modifiers -> IsSelect
hasMeta t Modifiers
mods then Maybe String
forall a. Maybe a
Nothing
    else if String -> IsSelect
isEnterKey String
key then
        String -> Maybe String
forall a. a -> Maybe a
Just [Char
newline]
    else if String
key String -> String -> IsSelect
forall a. Eq a => a -> a -> IsSelect
== String
"Tab" then String -> Maybe String
forall a. a -> Maybe a
Just [Char
'\t']
    else if IsSelect -> IsSelect
not (t Modifiers -> IsSelect
forall (t :: * -> *). Foldable t => t Modifiers -> IsSelect
hasControl t Modifiers
mods) then
        case String
ascii of
          Char
c : String
_ | Char -> IsSelect
isPrint Char
c -> String -> Maybe String
forall a. a -> Maybe a
Just [Char
c]
          String
_ -> Maybe String
forall a. Maybe a
Nothing
   else Maybe String
forall a. Maybe a
Nothing
toEdF :: b -> Message a (Either (Either a (Either a b)) b)
toEdF = Either (Either a (Either a b)) b
-> Message a (Either (Either a (Either a b)) b)
forall a b. b -> Message a b
High (Either (Either a (Either a b)) b
 -> Message a (Either (Either a (Either a b)) b))
-> (b -> Either (Either a (Either a b)) b)
-> b
-> Message a (Either (Either a (Either a b)) b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either a (Either a b) -> Either (Either a (Either a b)) b
forall a b. a -> Either a b
Left (Either a (Either a b) -> Either (Either a (Either a b)) b)
-> (b -> Either a (Either a b))
-> b
-> Either (Either a (Either a b)) b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either a b -> Either a (Either a b)
forall a b. b -> Either a b
Right (Either a b -> Either a (Either a b))
-> (b -> Either a b) -> b -> Either a (Either a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> Either a b
forall a b. b -> Either a b
Right

toSelF :: a -> Message a (Either (Either a (Either (Either a b) b)) b)
toSelF = Either (Either a (Either (Either a b) b)) b
-> Message a (Either (Either a (Either (Either a b) b)) b)
forall a b. b -> Message a b
High (Either (Either a (Either (Either a b) b)) b
 -> Message a (Either (Either a (Either (Either a b) b)) b))
-> (a -> Either (Either a (Either (Either a b) b)) b)
-> a
-> Message a (Either (Either a (Either (Either a b) b)) b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either a (Either (Either a b) b)
-> Either (Either a (Either (Either a b) b)) b
forall a b. a -> Either a b
Left (Either a (Either (Either a b) b)
 -> Either (Either a (Either (Either a b) b)) b)
-> (a -> Either a (Either (Either a b) b))
-> a
-> Either (Either a (Either (Either a b) b)) b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either (Either a b) b -> Either a (Either (Either a b) b)
forall a b. b -> Either a b
Right (Either (Either a b) b -> Either a (Either (Either a b) b))
-> (a -> Either (Either a b) b)
-> a
-> Either a (Either (Either a b) b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either a b -> Either (Either a b) b
forall a b. a -> Either a b
Left (Either a b -> Either (Either a b) b)
-> (a -> Either a b) -> a -> Either (Either a b) b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either a b
forall a b. a -> Either a b
Left
toTimerF :: b -> Message a (Either (Either a (Either (Either a b) b)) b)
toTimerF = Either (Either a (Either (Either a b) b)) b
-> Message a (Either (Either a (Either (Either a b) b)) b)
forall a b. b -> Message a b
High (Either (Either a (Either (Either a b) b)) b
 -> Message a (Either (Either a (Either (Either a b) b)) b))
-> (b -> Either (Either a (Either (Either a b) b)) b)
-> b
-> Message a (Either (Either a (Either (Either a b) b)) b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either a (Either (Either a b) b)
-> Either (Either a (Either (Either a b) b)) b
forall a b. a -> Either a b
Left (Either a (Either (Either a b) b)
 -> Either (Either a (Either (Either a b) b)) b)
-> (b -> Either a (Either (Either a b) b))
-> b
-> Either (Either a (Either (Either a b) b)) b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either (Either a b) b -> Either a (Either (Either a b) b)
forall a b. b -> Either a b
Right (Either (Either a b) b -> Either a (Either (Either a b) b))
-> (b -> Either (Either a b) b)
-> b
-> Either a (Either (Either a b) b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either a b -> Either (Either a b) b
forall a b. a -> Either a b
Left (Either a b -> Either (Either a b) b)
-> (b -> Either a b) -> b -> Either (Either a b) b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> Either a b
forall a b. b -> Either a b
Right

toOut :: b -> Message a (Either a b)
toOut = Either a b -> Message a (Either a b)
forall a b. b -> Message a b
High (Either a b -> Message a (Either a b))
-> (b -> Either a b) -> b -> Message a (Either a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> Either a b
forall a b. b -> Either a b
Right

getEdSel :: Cont
  (K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either a EditCmd)) b))
  String
getEdSel = EditCmd
-> Cont
     (K (Either (Either a (Either a EditEvt)) b)
        (Either (Either a (Either a EditCmd)) b))
     String
forall b a a b a a b.
b
-> Cont
     (K (Either (Either a (Either a EditEvt)) b)
        (Either (Either a (Either a b)) b))
     String
getEd EditCmd
EditGetSelection
getEdText :: Cont
  (K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either a EditCmd)) b))
  String
getEdText = EditCmd
-> Cont
     (K (Either (Either a (Either a EditEvt)) b)
        (Either (Either a (Either a EditCmd)) b))
     String
forall b a a b a a b.
b
-> Cont
     (K (Either (Either a (Either a EditEvt)) b)
        (Either (Either a (Either a b)) b))
     String
getEd EditCmd
EditGetText

getEd :: b
-> Cont
     (K (Either (Either a (Either a EditEvt)) b)
        (Either (Either a (Either a b)) b))
     String
getEd b
ecmd =
    KCommand (Either (Either a (Either a b)) b)
-> (KEvent (Either (Either a (Either a EditEvt)) b)
    -> Maybe String)
-> Cont
     (K (Either (Either a (Either a EditEvt)) b)
        (Either (Either a (Either a b)) b))
     String
forall ho hi a.
KCommand ho -> (KEvent hi -> Maybe a) -> Cont (K hi ho) a
cmdContK' (b -> KCommand (Either (Either a (Either a b)) b)
forall b a a a b. b -> Message a (Either (Either a (Either a b)) b)
toEdF b
ecmd)
              (\KEvent (Either (Either a (Either a EditEvt)) b)
e ->
               case KEvent (Either (Either a (Either a EditEvt)) b)
e of
                 High (Left (Right (Right (EditText String
t)))) -> String -> Maybe String
forall a. a -> Maybe a
Just String
t
                 KEvent (Either (Either a (Either a EditEvt)) b)
_ -> Maybe String
forall a. Maybe a
Nothing)

getSel :: Cont
  (K (Either (Either a (Either (Either (SelEvt a) b) b)) b)
     (Either (Either a (Either (Either (SelCmd a) b) b)) b))
  a
getSel =
    KCommand (Either (Either a (Either (Either (SelCmd a) b) b)) b)
-> (KEvent (Either (Either a (Either (Either (SelEvt a) b) b)) b)
    -> Maybe a)
-> Cont
     (K (Either (Either a (Either (Either (SelEvt a) b) b)) b)
        (Either (Either a (Either (Either (SelCmd a) b) b)) b))
     a
forall ho hi a.
KCommand ho -> (KEvent hi -> Maybe a) -> Cont (K hi ho) a
cmdContK' (SelCmd a
-> KCommand (Either (Either a (Either (Either (SelCmd a) b) b)) b)
forall a a a b b b.
a -> Message a (Either (Either a (Either (Either a b) b)) b)
toSelF SelCmd a
forall a. SelCmd a
PasteSel)
              (\KEvent (Either (Either a (Either (Either (SelEvt a) b) b)) b)
e ->
               case KEvent (Either (Either a (Either (Either (SelEvt a) b) b)) b)
e of
                 High (Left (Right (Left (Left (SelNotify a
t))))) -> a -> Maybe a
forall a. a -> Maybe a
Just a
t
                 KEvent (Either (Either a (Either (Either (SelEvt a) b) b)) b)
_ -> Maybe a
forall a. Maybe a
Nothing)

replace' :: String
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
replace' String
s = KCommand (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
forall ho hi. KCommand ho -> K hi ho -> K hi ho
putK (EditCmd -> KCommand (Either (Either a (Either a EditCmd)) b)
forall b a a a b. b -> Message a (Either (Either a (Either a b)) b)
toEdF (EditCmd -> KCommand (Either (Either a (Either a EditCmd)) b))
-> EditCmd -> KCommand (Either (Either a (Either a EditCmd)) b)
forall a b. (a -> b) -> a -> b
$ String -> EditCmd
EditReplace String
s)
clearSel :: K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
clearSel = String
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
forall hi a a b.
String
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
replace' String
""
copySel :: K (Either (Either a (Either a EditEvt)) b)
  (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
-> K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
copySel K (Either (Either a (Either a EditEvt)) b)
  (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
k = Cont
  (K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b))
  String
forall a a b a a b.
Cont
  (K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either a EditCmd)) b))
  String
getEdSel Cont
  (K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b))
  String
-> Cont
     (K (Either (Either a (Either a EditEvt)) b)
        (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b))
     String
forall a b. (a -> b) -> a -> b
$ (\String
s -> KCommand
  (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
-> K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
-> K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
forall ho hi. KCommand ho -> K hi ho -> K hi ho
putK (SelCmd String
-> KCommand
     (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
forall a a a b b b.
a -> Message a (Either (Either a (Either (Either a b) b)) b)
toSelF (String -> SelCmd String
forall a. a -> SelCmd a
Sel String
s)) K (Either (Either a (Either a EditEvt)) b)
  (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
k)
click :: IsSelect
-> Point
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
click IsSelect
issel Point
p = KCommand (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
forall ho hi. KCommand ho -> K hi ho -> K hi ho
putK (EditCmd -> KCommand (Either (Either a (Either a EditCmd)) b)
forall b a a a b. b -> Message a (Either (Either a (Either a b)) b)
toEdF (EditCmd -> KCommand (Either (Either a (Either a EditCmd)) b))
-> EditCmd -> KCommand (Either (Either a (Either a EditCmd)) b)
forall a b. (a -> b) -> a -> b
$ EditStop -> IsSelect -> EditCmd
EditMove (Point -> EditStop
EditPoint Point
p) IsSelect
issel)
starttimer :: K hi (Either (Either a (Either (Either a (Maybe (Int, Int))) b)) b)
-> K hi
     (Either (Either a (Either (Either a (Maybe (Int, Int))) b)) b)
starttimer = KCommand
  (Either (Either a (Either (Either a (Maybe (Int, Int))) b)) b)
-> K hi
     (Either (Either a (Either (Either a (Maybe (Int, Int))) b)) b)
-> K hi
     (Either (Either a (Either (Either a (Maybe (Int, Int))) b)) b)
forall ho hi. KCommand ho -> K hi ho -> K hi ho
putK (Maybe (Int, Int)
-> KCommand
     (Either (Either a (Either (Either a (Maybe (Int, Int))) b)) b)
forall b a a a b b.
b -> Message a (Either (Either a (Either (Either a b) b)) b)
toTimerF (Maybe (Int, Int)
 -> KCommand
      (Either (Either a (Either (Either a (Maybe (Int, Int))) b)) b))
-> Maybe (Int, Int)
-> KCommand
     (Either (Either a (Either (Either a (Maybe (Int, Int))) b)) b)
forall a b. (a -> b) -> a -> b
$ (Int, Int) -> Maybe (Int, Int)
forall a. a -> Maybe a
Just (Int
scrolldel,Int
scrolldel))
stoptimer :: K hi (Either (Either a (Either (Either a (Maybe a)) b)) b)
-> K hi (Either (Either a (Either (Either a (Maybe a)) b)) b)
stoptimer = KCommand (Either (Either a (Either (Either a (Maybe a)) b)) b)
-> K hi (Either (Either a (Either (Either a (Maybe a)) b)) b)
-> K hi (Either (Either a (Either (Either a (Maybe a)) b)) b)
forall ho hi. KCommand ho -> K hi ho -> K hi ho
putK (Maybe a
-> KCommand (Either (Either a (Either (Either a (Maybe a)) b)) b)
forall b a a a b b.
b -> Message a (Either (Either a (Either (Either a b) b)) b)
toTimerF (Maybe a
 -> KCommand (Either (Either a (Either (Either a (Maybe a)) b)) b))
-> Maybe a
-> KCommand (Either (Either a (Either (Either a (Maybe a)) b)) b)
forall a b. (a -> b) -> a -> b
$ Maybe a
forall a. Maybe a
Nothing)
scrolldel :: Int
scrolldel = String -> Int -> Int
forall p. (Read p, Show p) => String -> p -> p
argReadKey String
"scrolldel" Int
200

oldEditorF :: FontSpec -> F EditCmd EditEvt
oldEditorF FontSpec
font = F (Either
     (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        [(MenEvt, Any)]
        (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd)))
  (Either
     (Either
        (Either
           [(MenEvt, Any)]
           (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt)))
-> F EditCmd EditEvt
forall a b c d.
F (Either (Either a b) c) (Either (Either c d) a) -> F b d
loopCompThroughRightF F (Either
     (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        [(MenEvt, Any)]
        (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd)))
  (Either
     (Either
        (Either
           [(MenEvt, Any)]
           (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt)))
forall b4 a.
F (Either
     (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        [(MenEvt, b4)]
        (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd)))
  (Either
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt)))
g where
   g :: F (Either
     (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        [(MenEvt, b4)]
        (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd)))
  (Either
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt)))
g = [FRequest]
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> F (Either
        [(MenEvt, b4)]
        (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
-> F (Either
        (Either
           (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
           EditCmd)
        (Either
           [(MenEvt, b4)]
           (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd)))
     (Either
        (Either
           (Either
              a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
           EditEvt)
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt)))
forall a b c d.
[FRequest] -> K a b -> F c d -> F (Either a c) (Either b d)
groupF ((XCommand -> FRequest) -> [XCommand] -> [FRequest]
forall a b. (a -> b) -> [a] -> [b]
map XCommand -> FRequest
XCmd [[WindowAttributes] -> XCommand
ChangeWindowAttributes 
	       [[EventMask] -> WindowAttributes
CWEventMask [EventMask
KeyPressMask,EventMask
EnterWindowMask,EventMask
LeaveWindowMask]],
	       [WindowChanges] -> XCommand
ConfigureWindow [Int -> WindowChanges
CWBorderWidth Int
1],
	       IsSelect -> Button -> ModState -> [EventMask] -> XCommand
GrabButton IsSelect
True (Int -> Button
Button Int
1) [Modifiers
Any] 
	          [EventMask
ButtonPressMask,EventMask
PointerMotionMask,EventMask
ButtonReleaseMask]])
	      (Int
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. Int -> K a b -> K a b
setFontCursor Int
152 (K (Either
      (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
      EditCmd)
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)
 -> K (Either
         (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
         EditCmd)
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$ IsSelect
-> IsSelect
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a.
IsSelect
-> IsSelect
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
editorK IsSelect
False IsSelect
False)
	      (F (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd)
  (Either (Either (SelEvt String) Tick) EditEvt)
-> F (Either
        [(MenEvt, b4)]
        (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
forall c d b4.
F c d -> F (Either [(MenEvt, b4)] c) (Either MenEvt d)
menu ((F (SelCmd String) (SelEvt String)
selectionF F (SelCmd String) (SelEvt String)
-> F (Maybe (Int, Int)) Tick
-> F (Either (SelCmd String) (Maybe (Int, Int)))
     (Either (SelEvt String) Tick)
forall a b c d. F a b -> F c d -> F (Either a c) (Either b d)
>+< F (Maybe (Int, Int)) Tick
timerF) F (Either (SelCmd String) (Maybe (Int, Int)))
  (Either (SelEvt String) Tick)
-> F EditCmd EditEvt
-> F (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd)
     (Either (Either (SelEvt String) Tick) EditEvt)
forall a b c d. F a b -> F c d -> F (Either a c) (Either b d)
>+< FontSpec -> F EditCmd EditEvt
editF FontSpec
font))
   editorK :: IsSelect
-> IsSelect
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
editorK IsSelect
bpressed IsSelect
focus = K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same where
     same :: K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same = 
      Cont
  (K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt))
  (KEvent
     (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd))
forall hi ho. Cont (K hi ho) (KEvent hi)
getK Cont
  (K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt))
  (KEvent
     (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd))
-> Cont
     (K (Either
           (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
           EditCmd)
        (Either
           (Either
              a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
           EditEvt))
     (KEvent
        (Either
           (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
           EditCmd))
forall a b. (a -> b) -> a -> b
$ \KEvent
  (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
msg ->
        case KEvent
  (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
msg of
         Low (XEvt XEvent
event) ->
	   case XEvent
event of
	     KeyEvent Int
_ Point
_ Point
_ ModState
mods Pressed
Pressed KeyCode
_ String
key String
ascii -> 
		if ModState -> IsSelect
forall (t :: * -> *). Foldable t => t Modifiers -> IsSelect
hasMeta ModState
mods IsSelect -> IsSelect -> IsSelect
&& String -> IsSelect
isEnterKey String
key
		then String
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
putInputDoneMsg String
key
		else
		case ModState -> String -> String -> Maybe String
forall (t :: * -> *).
Foldable t =>
t Modifiers -> String -> String -> Maybe String
printorenter ModState
mods String
key String
ascii of
		   Just String
s -> String
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall hi a a b.
String
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
replace' String
s K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
		   Maybe String
Nothing -> case ModState -> String -> Maybe [EditCmd]
forall (t :: * -> *).
Foldable t =>
t Modifiers -> String -> Maybe [EditCmd]
cursorkey ModState
mods String
key of
		      Just [EditCmd]
eds -> [KCommand
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)]
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall b a. [KCommand b] -> K a b -> K a b
putsK ((EditCmd
 -> KCommand
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> [EditCmd]
-> [KCommand
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt)]
forall a b. (a -> b) -> [a] -> [b]
map EditCmd
-> KCommand
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall b a a a b. b -> Message a (Either (Either a (Either a b)) b)
toEdF [EditCmd]
eds) K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
		      Maybe [EditCmd]
Nothing -> 
			 if String
key String -> [String] -> IsSelect
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> IsSelect
`elem` [String
"Delete",String
"BackSpace"] 
			 then Cont
  (K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt))
  String
forall a a b a a b.
Cont
  (K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either a EditCmd)) b))
  String
getEdSel Cont
  (K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt))
  String
-> Cont
     (K (Either
           (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
           EditCmd)
        (Either
           (Either
              a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
           EditEvt))
     String
forall a b. (a -> b) -> a -> b
$ \String
s -> 
			      (if String -> IsSelect
forall (t :: * -> *) a. Foldable t => t a -> IsSelect
null String
s 
			       then [KCommand
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)]
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall b a. [KCommand b] -> K a b -> K a b
putsK ((EditCmd
 -> KCommand
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> [EditCmd]
-> [KCommand
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt)]
forall a b. (a -> b) -> [a] -> [b]
map EditCmd
-> KCommand
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall b a a a b. b -> Message a (Either (Either a (Either a b)) b)
toEdF 
					      (IsSelect -> [EditCmd]
selectleft (ModState -> IsSelect
forall (t :: * -> *). Foldable t => t Modifiers -> IsSelect
hasMeta ModState
mods)))
			       else K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a. a -> a
id) (K (Either
      (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
      EditCmd)
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)
 -> K (Either
         (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
         EditCmd)
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$ K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall hi a a b.
K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
clearSel K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
			 else K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
	     MotionNotify {pos :: XEvent -> Point
pos=Point
p,state :: XEvent -> ModState
state=ModState
mods} -> IsSelect
-> Point
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall hi a a b.
IsSelect
-> Point
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
click IsSelect
True Point
p K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
	     ButtonEvent {pos :: XEvent -> Point
pos=Point
p,state :: XEvent -> ModState
state=ModState
mods,type' :: XEvent -> Pressed
type'=Pressed
Pressed,button :: XEvent -> Button
button=Button Int
1} ->
		K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall hi a a b b.
K hi (Either (Either a (Either (Either a (Maybe (Int, Int))) b)) b)
-> K hi
     (Either (Either a (Either (Either a (Maybe (Int, Int))) b)) b)
starttimer (K (Either
      (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
      EditCmd)
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)
 -> K (Either
         (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
         EditCmd)
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$
		IsSelect
-> Point
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall hi a a b.
IsSelect
-> Point
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
click (Modifiers
Shift Modifiers -> ModState -> IsSelect
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> IsSelect
`elem` ModState
mods) Point
p (K (Either
      (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
      EditCmd)
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)
 -> K (Either
         (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
         EditCmd)
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$ IsSelect
-> IsSelect
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
showCursor IsSelect
True IsSelect
focus
	     ButtonEvent {type' :: XEvent -> Pressed
type'=Pressed
Released,button :: XEvent -> Button
button=Button Int
1} -> 
		K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall hi a a a b b.
K hi (Either (Either a (Either (Either a (Maybe a)) b)) b)
-> K hi (Either (Either a (Either (Either a (Maybe a)) b)) b)
stoptimer (K (Either
      (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
      EditCmd)
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)
 -> K (Either
         (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
         EditCmd)
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$ IsSelect
-> IsSelect
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
showCursor IsSelect
False IsSelect
focus
	     FocusIn {mode :: XEvent -> Mode
mode=Mode
NotifyNormal} -> IsSelect
-> IsSelect
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
showCursor IsSelect
bpressed IsSelect
True
	     FocusOut {mode :: XEvent -> Mode
mode=Mode
NotifyNormal} -> IsSelect
-> IsSelect
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
showCursor IsSelect
bpressed IsSelect
False
	     XEvent
_ -> K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
	 High (Left (Right (Left (Right Tick
Tick)))) ->
	   Cont
  (K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt))
  (IsSelect, Point, Point, ModState)
forall b c. Cont (K b c) (IsSelect, Point, Point, ModState)
queryPointerK Cont
  (K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt))
  (IsSelect, Point, Point, ModState)
-> Cont
     (K (Either
           (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
           EditCmd)
        (Either
           (Either
              a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
           EditEvt))
     (IsSelect, Point, Point, ModState)
forall a b. (a -> b) -> a -> b
$ \(IsSelect
_,Point
_,Point
p,ModState
_) -> IsSelect
-> Point
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall hi a a b.
IsSelect
-> Point
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
click IsSelect
True Point
p K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
	 High (Left (Left MenEvt
mencmd)) -> case MenEvt
mencmd of
				      MenEvt
MenCut -> K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a a b a b b.
K (Either (Either a (Either a EditEvt)) b)
  (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
-> K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
copySel (K (Either
      (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
      EditCmd)
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)
 -> K (Either
         (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
         EditCmd)
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$ K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall hi a a b.
K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
clearSel K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
				      MenEvt
MenCopy -> K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a a b a b b.
K (Either (Either a (Either a EditEvt)) b)
  (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
-> K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either (Either (SelCmd String) b) EditCmd)) b)
copySel K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
				      MenEvt
MenPaste -> Cont
  (K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt))
  String
forall a a b b b a a b b b.
Cont
  (K (Either (Either a (Either (Either (SelEvt a) b) b)) b)
     (Either (Either a (Either (Either (SelCmd a) b) b)) b))
  a
getSel Cont
  (K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt))
  String
-> Cont
     (K (Either
           (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
           EditCmd)
        (Either
           (Either
              a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
           EditEvt))
     String
forall a b. (a -> b) -> a -> b
$ \String
s ->
						  String
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall hi a a b.
String
-> K hi (Either (Either a (Either a EditCmd)) b)
-> K hi (Either (Either a (Either a EditCmd)) b)
replace' String
s K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
	 High (Left (Right (Right EditEvt
ecmd))) -> 
	    (case EditEvt
ecmd of
		  EditCursor Rect
r -> KCommand
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall ho hi. KCommand ho -> K hi ho -> K hi ho
putK (FRequest
-> KCommand
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. a -> Message a b
Low (FRequest
 -> KCommand
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> FRequest
-> KCommand
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$ LayoutMessage -> FRequest
LCmd (LayoutMessage -> FRequest) -> LayoutMessage -> FRequest
forall a b. (a -> b) -> a -> b
$
					Rect -> LayoutMessage
layoutMakeVisible Rect
r)
		  EditEvt
_ -> K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a. a -> a
id) (K (Either
      (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
      EditCmd)
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)
 -> K (Either
         (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
         EditCmd)
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$
	    KCommand
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall ho hi. KCommand ho -> K hi ho -> K hi ho
putK (EditEvt
-> KCommand
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall b a a. b -> Message a (Either a b)
toOut EditEvt
ecmd) K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
	 High (Right EditCmd
ocmd) -> KCommand
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall ho hi. KCommand ho -> K hi ho -> K hi ho
putK (EditCmd
-> KCommand
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall b a a a b. b -> Message a (Either (Either a (Either a b)) b)
toEdF EditCmd
ocmd) K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
	 KEvent
  (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
_ -> K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same
     showCursor :: IsSelect
-> IsSelect
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
showCursor IsSelect
b IsSelect
f = KCommand
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall ho hi. KCommand ho -> K hi ho -> K hi ho
putK (EditCmd
-> KCommand
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall b a a a b. b -> Message a (Either (Either a (Either a b)) b)
toEdF (IsSelect -> EditCmd
EditShowCursor (IsSelect
b IsSelect -> IsSelect -> IsSelect
|| IsSelect
f))) (K (Either
      (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
      EditCmd)
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)
 -> K (Either
         (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
         EditCmd)
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$ 
		    IsSelect
-> IsSelect
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
editorK IsSelect
b IsSelect
f
     putInputDoneMsg :: String
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
putInputDoneMsg String
key =
       Cont
  (K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt))
  String
forall a a b a a b.
Cont
  (K (Either (Either a (Either a EditEvt)) b)
     (Either (Either a (Either a EditCmd)) b))
  String
getEdText Cont
  (K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt))
  String
-> Cont
     (K (Either
           (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
           EditCmd)
        (Either
           (Either
              a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
           EditEvt))
     String
forall a b. (a -> b) -> a -> b
$ \ String
s ->
       KCommand
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall ho hi. KCommand ho -> K hi ho -> K hi ho
putK (EditEvt
-> KCommand
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall b a a. b -> Message a (Either a b)
toOut (EditEvt
 -> KCommand
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> EditEvt
-> KCommand
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$ InputMsg String -> EditEvt
EditChange (String -> String -> InputMsg String
forall a. String -> a -> InputMsg a
InputDone String
key String
s)) (K (Either
      (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
      EditCmd)
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)
 -> K (Either
         (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
         EditCmd)
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$
       [KCommand
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)]
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall b a. [KCommand b] -> K a b -> K a b
putsK ((EditCmd
 -> KCommand
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> [EditCmd]
-> [KCommand
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt)]
forall a b. (a -> b) -> [a] -> [b]
map EditCmd
-> KCommand
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall b a a a b. b -> Message a (Either (Either a (Either a b)) b)
toEdF [EditCmd]
selectall) (K (Either
      (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
      EditCmd)
   (Either
      (Either
         a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
      EditEvt)
 -> K (Either
         (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
         EditCmd)
      (Either
         (Either
            a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
         EditEvt))
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
-> K (Either
        (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
        EditCmd)
     (Either
        (Either
           a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
        EditEvt)
forall a b. (a -> b) -> a -> b
$
       K (Either
     (Either MenEvt (Either (Either (SelEvt String) Tick) EditEvt))
     EditCmd)
  (Either
     (Either
        a (Either (Either (SelCmd String) (Maybe (Int, Int))) EditCmd))
     EditEvt)
same

data MenEvt = MenCut | MenCopy | MenPaste  deriving (MenEvt -> MenEvt -> IsSelect
(MenEvt -> MenEvt -> IsSelect)
-> (MenEvt -> MenEvt -> IsSelect) -> Eq MenEvt
forall a. (a -> a -> IsSelect) -> (a -> a -> IsSelect) -> Eq a
/= :: MenEvt -> MenEvt -> IsSelect
$c/= :: MenEvt -> MenEvt -> IsSelect
== :: MenEvt -> MenEvt -> IsSelect
$c== :: MenEvt -> MenEvt -> IsSelect
Eq, Eq MenEvt
Eq MenEvt
-> (MenEvt -> MenEvt -> Ordering)
-> (MenEvt -> MenEvt -> IsSelect)
-> (MenEvt -> MenEvt -> IsSelect)
-> (MenEvt -> MenEvt -> IsSelect)
-> (MenEvt -> MenEvt -> IsSelect)
-> (MenEvt -> MenEvt -> MenEvt)
-> (MenEvt -> MenEvt -> MenEvt)
-> Ord MenEvt
MenEvt -> MenEvt -> IsSelect
MenEvt -> MenEvt -> Ordering
MenEvt -> MenEvt -> MenEvt
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> IsSelect)
-> (a -> a -> IsSelect)
-> (a -> a -> IsSelect)
-> (a -> a -> IsSelect)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MenEvt -> MenEvt -> MenEvt
$cmin :: MenEvt -> MenEvt -> MenEvt
max :: MenEvt -> MenEvt -> MenEvt
$cmax :: MenEvt -> MenEvt -> MenEvt
>= :: MenEvt -> MenEvt -> IsSelect
$c>= :: MenEvt -> MenEvt -> IsSelect
> :: MenEvt -> MenEvt -> IsSelect
$c> :: MenEvt -> MenEvt -> IsSelect
<= :: MenEvt -> MenEvt -> IsSelect
$c<= :: MenEvt -> MenEvt -> IsSelect
< :: MenEvt -> MenEvt -> IsSelect
$c< :: MenEvt -> MenEvt -> IsSelect
compare :: MenEvt -> MenEvt -> Ordering
$ccompare :: MenEvt -> MenEvt -> Ordering
$cp1Ord :: Eq MenEvt
Ord)

menu :: F c d -> F (Either [(MenEvt, b4)] c) (Either MenEvt d)
menu = String
-> IsSelect
-> String
-> Button
-> ModState
-> [(ModState, String)]
-> [(MenEvt, [Any])]
-> (MenEvt -> String)
-> F c d
-> F (Either [(MenEvt, b4)] c) (Either MenEvt d)
forall b1 b2 (t :: * -> *) b3 c d b4.
(Eq b1, Graphic b2, Foldable t) =>
String
-> IsSelect
-> String
-> Button
-> ModState
-> t (ModState, String)
-> [(b1, b3)]
-> (b1 -> b2)
-> F c d
-> F (Either [(b1, b4)] c) (Either b1 d)
oldPopupMenuF String
bgColor IsSelect
True String
menuFont (Int -> Button
Button Int
3) [] [] 
     [(MenEvt
MenCut, []), (MenEvt
MenCopy, []), (MenEvt
MenPaste, [])]
               (\MenEvt
x -> case MenEvt
x of
                  MenEvt
MenCut -> String
"Cut"
                  MenEvt
MenCopy -> String
"Copy"
                  MenEvt
MenPaste -> String
"Paste")