NullF

module NullF(module NullF, Cont(..),K,F,StreamProcIO(..),FudgetIO(..)) where
import Utils(pair)
import Fudget
import Message(aLow,stripHigh) --Message(..),
import Path(here)
import Spops
import Cont(dropSP,kContWrap,fContWrap,waitForK,waitForFu)
import StreamProcIO
import FudgetIO

--{- -}
instance StreamProcIO F where
  put = putF
  get = getF -- Discards low level input! Leave undefined?
  end = nullF

instance StreamProcIO K where
  put = putHigh
  get = getHigh
  end = nullK

instance FudgetIO F where
  waitForMsg = waitForFu
  putMsg = putMessageFu
  --nullMsg = nullF
  --getMsg = getMessageFu


instance FudgetIO K where
  putMsg = putK
  waitForMsg = waitForK
  --nullMsg = nullK
  --getMsg = getK

---}

----

nullK = K{-kk-} nullSP
nullF = F{-ff-} nullSP

--putK :: KCommand ho -> K hi ho -> K hi ho
putK o (K sp) = kk (putSP o sp)

putF = putMessageF . High

putsF = puts :: ([b] -> F a b -> F a b)
--putsF his f = foldr putF f his
putsK = putMsgs :: ([KCommand b] -> K a b -> K a b)
--putsK msgs k = foldr putK k msgs

putMessageF msg (F sp) = F{-ff-} (putSP msg sp)
putMessageFu = putMessageF . aLow (pair here)

putMessagesF hos (F sp) = F{-ff-} (putsSP hos sp)
putMessagesFu = putMsgs :: ([KCommand b] -> F a b -> F a b)
--putMessagesFu msgs f = foldr putMessageFu f msgs

--appendStartK :: [KCommand b] -> K a b -> K a b
appendStartK kcmds (K sp) = kk (appendStartSP kcmds sp)

--appendStartMessageF :: [FCommand b] -> F a b -> F a b
appendStartMessageF fcmds (F sp) = F{-ff-} (appendStartSP fcmds sp)

--appendStartF :: [b] -> F a b -> F a b
appendStartF = appendStartMessageF . map High

getK = kContWrap getSP -- :: (Cont (K a b) (KEvent a))

getMessageF = fContWrap getSP -- :: (Cont (F a b) (FEvent a))
getMessageFu = fContWrap (getSP . (. aLow snd)) :: (Cont (F a b) (KEvent a))

--getF :: Cont (F a b) a
getF = fContWrap (dropSP stripHigh)

--startupK :: ([KEvent a] -> K a b -> K a b)
startupK kevs (K sp) = kk (startupSP kevs sp)
--startupMessageF :: ([FEvent a] -> F a b -> F a b)
startupMessageF fevs (F sp) = F{-ff-} (startupSP fevs sp)

--startupMessageFu = startupMessageF . map (aLow (pair here)) -- error prone

--startupF :: [a] -> F a b -> F a b
startupF = startupMessageF . map High

--delayF :: (F a b -> F a b)
delayF (F sp) = F{-ff-} (delaySP sp)