module CompletionStringF
    (stdcc,completeFromList,
     completionStringF,completionStringF',completionStringF'')
  where
import Fudgets
import Data.List(isPrefixOf) 
import HbcUtils(mapSnd)

completionStringF :: F (Either ([Char] -> [(a, [Char])]) [Char])
  (Either [(a, [Char])] (InputMsg [Char]))
completionStringF = Char
-> Customiser StringF
-> F (Either ([Char] -> [(a, [Char])]) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall a.
Char
-> Customiser StringF
-> F (Either ([Char] -> [(a, [Char])]) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
completionStringF' Char
stdcc Customiser StringF
forall a. Customiser a
standard

stdcc :: Char
stdcc = [Char] -> Char -> Char
forall p. (Read p, Show p) => [Char] -> p -> p
argReadKey [Char]
"stdcc" Char
' ' -- standard completion char

completionStringF' :: Char
-> Customiser StringF
-> F (Either ([Char] -> [(a, [Char])]) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
completionStringF' Char
cc Customiser StringF
cust = Char
-> Customiser StringF
-> F (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char]))
     (Either [(a, [Char])] (InputMsg [Char]))
forall a.
Char
-> Customiser StringF
-> F (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char]))
     (Either [(a, [Char])] (InputMsg [Char]))
completionStringF'' Char
cc Customiser StringF
cust F (Either
     ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char]))
  (Either [(a, [Char])] (InputMsg [Char]))
-> (Either ([Char] -> [(a, [Char])]) [Char]
    -> Either
         ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char]))
-> F (Either ([Char] -> [(a, [Char])]) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall c d e. F c d -> (e -> c) -> F e d
>=^< (([Char] -> [(a, [Char])]) -> [Char] -> [(a, [Char])])
-> ([Char] -> Either (Customiser StringF) [Char])
-> Either ([Char] -> [(a, [Char])]) [Char]
-> Either
     ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])
forall t1 a t2 b.
(t1 -> a) -> (t2 -> b) -> Either t1 t2 -> Either a b
mapEither ([Char] -> [(a, [Char])]) -> [Char] -> [(a, [Char])]
forall a. Customiser a
id [Char] -> Either (Customiser StringF) [Char]
forall a b. b -> Either a b
Right

completionStringF'' :: Char
-> Customiser StringF
-> F (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char]))
     (Either [(a, [Char])] (InputMsg [Char]))
completionStringF'' Char
cc Customiser StringF
cust =  -- cc = completion character
    F (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
-> F (Either (Customiser StringF) [Char]) (InputMsg [Char])
-> F (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char]))
     (Either [(a, [Char])] (InputMsg [Char]))
forall a b c d. F (Either a b) (Either c d) -> F c a -> F b d
loopThroughRightF (SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
-> F (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a b. SP a b -> F a b
absF SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
forall a.
SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
completeSP0) (Customiser StringF
-> F (Either (Customiser StringF) [Char]) (InputMsg [Char])
stringF'' Customiser StringF
cust)
  where
    completeSP0 :: SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
completeSP0 = ([Char] -> [(a, [Char])])
-> ([(a, [Char])], [(a, [Char])])
-> [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a.
([Char] -> [(a, [Char])])
-> ([(a, [Char])], [(a, [Char])])
-> [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
completeSP ([(a, [Char])] -> [Char] -> [(a, [Char])]
forall a b. a -> b -> a
const []) ([],[]) [Char]
""

    completeSP :: ([Char] -> [(a, [Char])])
-> ([(a, [Char])], [(a, [Char])])
-> [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
completeSP [Char] -> [(a, [Char])]
listfun ([(a, [Char])], [(a, [Char])])
updownlist [Char]
current =
        Cont
  (SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char]))))
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
forall a b. Cont (SP a b) a
getSP Cont
  (SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char]))))
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
-> Cont
     (SP
        (Either
           (InputMsg [Char])
           (Either
              ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
        (Either
           (Either (Customiser StringF) [Char])
           (Either [(a, [Char])] (InputMsg [Char]))))
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
forall a b. (a -> b) -> a -> b
$ (InputMsg [Char]
 -> SP
      (Either
         (InputMsg [Char])
         (Either
            ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
      (Either
         (Either (Customiser StringF) [Char])
         (Either [(a, [Char])] (InputMsg [Char]))))
-> (Either
      ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])
    -> SP
         (Either
            (InputMsg [Char])
            (Either
               ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
         (Either
            (Either (Customiser StringF) [Char])
            (Either [(a, [Char])] (InputMsg [Char]))))
-> Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char]))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either InputMsg [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
fromStringF Either
  ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
fromOutside
      where
        list :: [(a, [Char])]
list = [Char] -> [(a, [Char])]
listfun [Char]
current

        same :: SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
same = ([Char] -> [(a, [Char])])
-> ([(a, [Char])], [(a, [Char])])
-> [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
completeSP [Char] -> [(a, [Char])]
listfun ([(a, [Char])], [(a, [Char])])
updownlist [Char]
current
	newList :: ([Char] -> [(a, [Char])])
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
newList [Char] -> [(a, [Char])]
listfun' = ([Char] -> [(a, [Char])])
-> ([(a, [Char])], [(a, [Char])])
-> [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
completeSP [Char] -> [(a, [Char])]
listfun' ([],[]) [Char]
current
	newString' :: ([(a, [Char])], [(a, [Char])])
-> [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
newString' ([(a, [Char])], [(a, [Char])])
p [Char]
s = Either
  (Either (Customiser StringF) [Char])
  (Either [(a, [Char])] (InputMsg [Char]))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall b a. b -> SP a b -> SP a b
putSP (InputMsg [Char]
-> Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall b a a. b -> Either a (Either a b)
toOutput ([Char] -> InputMsg [Char]
forall a. a -> InputMsg a
InputChange [Char]
s)) (SP
   (Either
      (InputMsg [Char])
      (Either
         ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
   (Either
      (Either (Customiser StringF) [Char])
      (Either [(a, [Char])] (InputMsg [Char])))
 -> SP
      (Either
         (InputMsg [Char])
         (Either
            ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
      (Either
         (Either (Customiser StringF) [Char])
         (Either [(a, [Char])] (InputMsg [Char]))))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a b. (a -> b) -> a -> b
$
			 ([Char] -> [(a, [Char])])
-> ([(a, [Char])], [(a, [Char])])
-> [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
completeSP [Char] -> [(a, [Char])]
listfun ([(a, [Char])], [(a, [Char])])
p [Char]
s
	newString :: [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
newString = ([(a, [Char])], [(a, [Char])])
-> [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
newString' ([],[])


        toStringF'' :: a -> Either a b
toStringF'' = a -> Either a b
forall a b. a -> Either a b
Left
        toString :: b -> Either (Either a b) b
toString = Either a b -> Either (Either a b) b
forall a b. a -> Either a b
toStringF'' (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
	toCustomiser :: a -> Either (Either a b) b
toCustomiser = Either a b -> Either (Either a b) b
forall a b. a -> Either a b
toStringF'' (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
	toOutput :: b -> Either a (Either a b)
toOutput = 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
	toCompletionList :: a -> Either a (Either a b)
toCompletionList = Either a b -> Either a (Either a b)
forall a b. b -> Either a b
Right (Either a b -> Either a (Either a b))
-> (a -> Either a b) -> a -> Either a (Either a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either a b
forall a b. a -> Either a b
Left

	fromOutside :: Either
  ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
fromOutside = (([Char] -> [(a, [Char])])
 -> SP
      (Either
         (InputMsg [Char])
         (Either
            ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
      (Either
         (Either (Customiser StringF) [Char])
         (Either [(a, [Char])] (InputMsg [Char]))))
-> (Either (Customiser StringF) [Char]
    -> SP
         (Either
            (InputMsg [Char])
            (Either
               ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
         (Either
            (Either (Customiser StringF) [Char])
            (Either [(a, [Char])] (InputMsg [Char]))))
-> Either
     ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ([Char] -> [(a, [Char])])
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
newList Either (Customiser StringF) [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
inputToStringF''
	inputToStringF'' :: Either (Customiser StringF) [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
inputToStringF'' Either (Customiser StringF) [Char]
msg = Either
  (Either (Customiser StringF) [Char])
  (Either [(a, [Char])] (InputMsg [Char]))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall b a. b -> SP a b -> SP a b
putSP (Either (Customiser StringF) [Char]
-> Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall a b. a -> Either a b
toStringF'' Either (Customiser StringF) [Char]
msg) SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
same

        fromStringF :: InputMsg [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
fromStringF InputMsg [Char]
msg = 
	  case InputMsg [Char]
msg of
	    InputDone [Char]
"Up"   [Char]
_ -> ([(a, [Char])], [(a, [Char])])
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
goto ([(a, [Char])], [(a, [Char])])
above
	    InputDone [Char]
"Down" [Char]
_ -> ([(a, [Char])], [(a, [Char])])
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
goto ([(a, [Char])], [(a, [Char])])
below
	    InputDone [Char]
"Tab"  [Char]
_ -> SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
doCompletion
	    InputDone [Char]
_ [Char]
_ -> Either
  (Either (Customiser StringF) [Char])
  (Either [(a, [Char])] (InputMsg [Char]))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall b a. b -> SP a b -> SP a b
putSP (InputMsg [Char]
-> Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall b a a. b -> Either a (Either a b)
toOutput InputMsg [Char]
msg) SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
same
	    InputChange [Char]
s ->
	      if [Char]
s[Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
==[Char]
current[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++[Char
cc]
	      then SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
doCompletion
	      else if [Char] -> Bool
fromupdownlist [Char]
s
	           then SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
same
		   else [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
newString [Char]
s -- erase completion list?

        fromupdownlist :: [Char] -> Bool
fromupdownlist [Char]
s =
 	    case ([(a, [Char])], [(a, [Char])])
updownlist of
	      (_,(_,s'):_) -> [Char]
s[Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
==[Char]
s'
	      ([(a, [Char])], [(a, [Char])])
_ -> Bool
False

        goto :: ([(a, [Char])], [(a, [Char])])
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
goto ([(a, [Char])]
_,[]) = SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
same
        goto l :: ([(a, [Char])], [(a, [Char])])
l@([(a, [Char])]
_,item :: (a, [Char])
item@(a
_,[Char]
s):[(a, [Char])]
_) =
	    Either
  (Either (Customiser StringF) [Char])
  (Either [(a, [Char])] (InputMsg [Char]))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall b a. b -> SP a b -> SP a b
putSP ([Char]
-> Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall b a b. b -> Either (Either a b) b
toString [Char]
s) (SP
   (Either
      (InputMsg [Char])
      (Either
         ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
   (Either
      (Either (Customiser StringF) [Char])
      (Either [(a, [Char])] (InputMsg [Char])))
 -> SP
      (Either
         (InputMsg [Char])
         (Either
            ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
      (Either
         (Either (Customiser StringF) [Char])
         (Either [(a, [Char])] (InputMsg [Char]))))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a b. (a -> b) -> a -> b
$
	    Either
  (Either (Customiser StringF) [Char])
  (Either [(a, [Char])] (InputMsg [Char]))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall b a. b -> SP a b -> SP a b
putSP ([(a, [Char])]
-> Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall a a b. a -> Either a (Either a b)
toCompletionList [(a, [Char])
item]) (SP
   (Either
      (InputMsg [Char])
      (Either
         ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
   (Either
      (Either (Customiser StringF) [Char])
      (Either [(a, [Char])] (InputMsg [Char])))
 -> SP
      (Either
         (InputMsg [Char])
         (Either
            ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
      (Either
         (Either (Customiser StringF) [Char])
         (Either [(a, [Char])] (InputMsg [Char]))))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a b. (a -> b) -> a -> b
$
	    Either
  (Either (Customiser StringF) [Char])
  (Either [(a, [Char])] (InputMsg [Char]))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall b a. b -> SP a b -> SP a b
putSP (InputMsg [Char]
-> Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall b a a. b -> Either a (Either a b)
toOutput ([Char] -> InputMsg [Char]
forall a. a -> InputMsg a
InputChange [Char]
s)) (SP
   (Either
      (InputMsg [Char])
      (Either
         ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
   (Either
      (Either (Customiser StringF) [Char])
      (Either [(a, [Char])] (InputMsg [Char])))
 -> SP
      (Either
         (InputMsg [Char])
         (Either
            ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
      (Either
         (Either (Customiser StringF) [Char])
         (Either [(a, [Char])] (InputMsg [Char]))))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a b. (a -> b) -> a -> b
$
	    ([(a, [Char])], [(a, [Char])])
-> [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
newString' ([(a, [Char])], [(a, [Char])])
l [Char]
current

	above :: ([(a, [Char])], [(a, [Char])])
above = case ([(a, [Char])], [(a, [Char])])
updownlist of
		  ([],[]) -> case [(a, [Char])] -> [(a, [Char])]
forall a. [a] -> [a]
reverse [(a, [Char])]
updownlist' of
			       (a, [Char])
x:[(a, [Char])]
xs -> ([(a, [Char])]
xs,[(a, [Char])
x])
			       [(a, [Char])]
_ -> ([],[])
		  (x:xs,ys) -> ([(a, [Char])]
xs,(a, [Char])
x(a, [Char]) -> [(a, [Char])] -> [(a, [Char])]
forall a. a -> [a] -> [a]
:[(a, [Char])]
ys)
		  ([(a, [Char])], [(a, [Char])])
_ -> ([(a, [Char])], [(a, [Char])])
updownlist

        below :: ([(a, [Char])], [(a, [Char])])
below = case ([(a, [Char])], [(a, [Char])])
updownlist of
		  ([],[]) -> ([],[(a, [Char])]
updownlist')
		  (xs,x1:x2:ys) -> ((a, [Char])
x1(a, [Char]) -> [(a, [Char])] -> [(a, [Char])]
forall a. a -> [a] -> [a]
:[(a, [Char])]
xs,(a, [Char])
x2(a, [Char]) -> [(a, [Char])] -> [(a, [Char])]
forall a. a -> [a] -> [a]
:[(a, [Char])]
ys)
		  ([(a, [Char])], [(a, [Char])])
_ -> ([(a, [Char])], [(a, [Char])])
updownlist

        updownlist' :: [(a, [Char])]
updownlist' = ([Char] -> [Char]) -> [(a, [Char])] -> [(a, [Char])]
forall t b a. (t -> b) -> [(a, t)] -> [(a, b)]
mapSnd ([Char]
current[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++) [(a, [Char])]
list

        doCompletion :: SP
  (Either
     (InputMsg [Char])
     (Either
        ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
  (Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char])))
doCompletion =
	    Either
  (Either (Customiser StringF) [Char])
  (Either [(a, [Char])] (InputMsg [Char]))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall b a. b -> SP a b -> SP a b
putSP ([(a, [Char])]
-> Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall a a b. a -> Either a (Either a b)
toCompletionList [(a, [Char])]
list) (SP
   (Either
      (InputMsg [Char])
      (Either
         ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
   (Either
      (Either (Customiser StringF) [Char])
      (Either [(a, [Char])] (InputMsg [Char])))
 -> SP
      (Either
         (InputMsg [Char])
         (Either
            ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
      (Either
         (Either (Customiser StringF) [Char])
         (Either [(a, [Char])] (InputMsg [Char]))))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a b. (a -> b) -> a -> b
$
	    [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
putNewString ([Char]
current[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++[[Char]] -> [Char]
forall a. Eq a => [[a]] -> [a]
commonPrefix (((a, [Char]) -> [Char]) -> [(a, [Char])] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (a, [Char]) -> [Char]
forall a b. (a, b) -> b
snd [(a, [Char])]
list))

        putNewString :: [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
putNewString [Char]
new =
	  Either
  (Either (Customiser StringF) [Char])
  (Either [(a, [Char])] (InputMsg [Char]))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall b a. b -> SP a b -> SP a b
putSP ([Char]
-> Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall b a b. b -> Either (Either a b) b
toString [Char]
new) (SP
   (Either
      (InputMsg [Char])
      (Either
         ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
   (Either
      (Either (Customiser StringF) [Char])
      (Either [(a, [Char])] (InputMsg [Char])))
 -> SP
      (Either
         (InputMsg [Char])
         (Either
            ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
      (Either
         (Either (Customiser StringF) [Char])
         (Either [(a, [Char])] (InputMsg [Char]))))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a b. (a -> b) -> a -> b
$
	  Either
  (Either (Customiser StringF) [Char])
  (Either [(a, [Char])] (InputMsg [Char]))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall b a. b -> SP a b -> SP a b
putSP (Customiser StringF
-> Either
     (Either (Customiser StringF) [Char])
     (Either [(a, [Char])] (InputMsg [Char]))
forall a b b. a -> Either (Either a b) b
toCustomiser (Int -> Customiser StringF
setCursorPos ([Char] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Char]
new))) (SP
   (Either
      (InputMsg [Char])
      (Either
         ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
   (Either
      (Either (Customiser StringF) [Char])
      (Either [(a, [Char])] (InputMsg [Char])))
 -> SP
      (Either
         (InputMsg [Char])
         (Either
            ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
      (Either
         (Either (Customiser StringF) [Char])
         (Either [(a, [Char])] (InputMsg [Char]))))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
forall a b. (a -> b) -> a -> b
$
	  [Char]
-> SP
     (Either
        (InputMsg [Char])
        (Either
           ([Char] -> [(a, [Char])]) (Either (Customiser StringF) [Char])))
     (Either
        (Either (Customiser StringF) [Char])
        (Either [(a, [Char])] (InputMsg [Char])))
newString [Char]
new

commonPrefix :: [[a]] -> [a]
commonPrefix ((a
c:[a]
s):[[a]]
ss) =
  case ([a] -> Bool) -> [[a]] -> [[a]]
forall a. (a -> Bool) -> [a] -> [a]
filter (([a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
/=[a
c])([a] -> Bool) -> ([a] -> [a]) -> [a] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
1) [[a]]
ss of
    [] -> a
ca -> [a] -> [a]
forall a. a -> [a] -> [a]
:[[a]] -> [a]
commonPrefix ([a]
s[a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
:([a] -> [a]) -> [[a]] -> [[a]]
forall a b. (a -> b) -> [a] -> [b]
map [a] -> [a]
forall a. [a] -> [a]
tail [[a]]
ss)
    [[a]]
_ -> []
commonPrefix [[a]]
_ = []

pos :: [a] -> [[a]] -> (Int, Bool)
pos [a]
y [[a]]
xs =
  case [(Int, [a])
ix|ix :: (Int, [a])
ix@(Int
i,[a]
x)<-Int -> [[a]] -> [(Int, [a])]
forall a. Int -> [a] -> [(Int, a)]
number Int
0 [[a]]
xs,[a]
y [a] -> [a] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` [a]
x] of
    []      -> (Int
0,Bool
False)
    (Int
i,[a]
x):[(Int, [a])]
_ -> (Int
i,[a]
x[a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
==[a]
y)

completeFromList :: [[a]] -> [a] -> [([a], [a])]
completeFromList [[a]]
list [a]
current =
    [([a]
current,[a]
compl)|([a]
pre,[a]
compl)<-[([a], [a])]
splits,[a]
pre[a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
==[a]
current]
  where
    splits :: [([a], [a])]
splits = ([a] -> ([a], [a])) -> [[a]] -> [([a], [a])]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
n) [[a]]
list
    n :: Int
n = [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
current