module MapstateMsg(mapLow, mapHigh, mapstateLow, mapstateHigh) where
import Message(Message(..))
--import SP(SP)
import Spops
import HbcUtils(apSnd)

mapstateHigh :: (t -> t -> (t, [b])) -> t -> SP (Message a t) (Message a b)
mapstateHigh t -> t -> (t, [b])
p t
s =
    let ms :: t -> Message a t -> (t, [Message a b])
ms t
s' (Low a
msg) = (t
s', [a -> Message a b
forall a b. a -> Message a b
Low a
msg])
        ms t
s' (High t
msg) = ([b] -> [Message a b]) -> (t, [b]) -> (t, [Message a b])
forall t b a. (t -> b) -> (a, t) -> (a, b)
apSnd ((b -> Message a b) -> [b] -> [Message a b]
forall a b. (a -> b) -> [a] -> [b]
map b -> Message a b
forall a b. b -> Message a b
High) (t -> t -> (t, [b])
p t
s' t
msg)
    in  (t -> Message a t -> (t, [Message a b]))
-> t -> SP (Message a t) (Message a b)
forall t a b. (t -> a -> (t, [b])) -> t -> SP a b
mapstateSP t -> Message a t -> (t, [Message a b])
forall a. t -> Message a t -> (t, [Message a b])
ms t
s

mapstateLow :: (t -> t -> (t, [a])) -> t -> SP (Message t b) (Message a b)
mapstateLow t -> t -> (t, [a])
p t
s =
    let ms :: t -> Message t b -> (t, [Message a b])
ms t
s' (High b
msg) = (t
s', [b -> Message a b
forall a b. b -> Message a b
High b
msg])
        ms t
s' (Low t
msg) = ([a] -> [Message a b]) -> (t, [a]) -> (t, [Message a b])
forall t b a. (t -> b) -> (a, t) -> (a, b)
apSnd ((a -> Message a b) -> [a] -> [Message a b]
forall a b. (a -> b) -> [a] -> [b]
map a -> Message a b
forall a b. a -> Message a b
Low) (t -> t -> (t, [a])
p t
s' t
msg)
    in  (t -> Message t b -> (t, [Message a b]))
-> t -> SP (Message t b) (Message a b)
forall t a b. (t -> a -> (t, [b])) -> t -> SP a b
mapstateSP t -> Message t b -> (t, [Message a b])
forall b. t -> Message t b -> (t, [Message a b])
ms t
s

mapHigh :: (t -> [b]) -> SP (Message a t) (Message a b)
mapHigh t -> [b]
p =
    let ms :: Message a t -> [Message a b]
ms (High t
msg) = (b -> Message a b) -> [b] -> [Message a b]
forall a b. (a -> b) -> [a] -> [b]
map b -> Message a b
forall a b. b -> Message a b
High (t -> [b]
p t
msg)
        ms (Low a
msg) = [a -> Message a b
forall a b. a -> Message a b
Low a
msg]
    in  (Message a t -> [Message a b]) -> SP (Message a t) (Message a b)
forall t b. (t -> [b]) -> SP t b
concmapSP Message a t -> [Message a b]
forall a. Message a t -> [Message a b]
ms

mapLow :: (t -> [a]) -> SP (Message t b) (Message a b)
mapLow t -> [a]
p =
    let ms :: Message t b -> [Message a b]
ms (Low t
msg) = (a -> Message a b) -> [a] -> [Message a b]
forall a b. (a -> b) -> [a] -> [b]
map a -> Message a b
forall a b. a -> Message a b
Low (t -> [a]
p t
msg)
        ms (High b
msg) = [b -> Message a b
forall a b. b -> Message a b
High b
msg]
    in  (Message t b -> [Message a b]) -> SP (Message t b) (Message a b)
forall t b. (t -> [b]) -> SP t b
concmapSP Message t b -> [Message a b]
forall b. Message t b -> [Message a b]
ms