module StreamProcIO where
import SP

class StreamProcIO sp where -- or: SPIO SP_IO SpIO SpIo ?
  put :: o -> sp i o -> sp i o
  get :: (i -> sp i o) -> sp i o
  end :: sp i o -- null?

puts :: t a -> sp i a -> sp i a
puts t a
xs sp i a
sp = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall (sp :: * -> * -> *) o i.
StreamProcIO sp =>
o -> sp i o -> sp i o
put sp i a
sp t a
xs

instance StreamProcIO SP where
  put :: forall o i. o -> SP i o -> SP i o
put = forall a b. b -> SP a b -> SP a b
PutSP
  get :: forall i o. (i -> SP i o) -> SP i o
get = forall i o. (i -> SP i o) -> SP i o
GetSP
  end :: forall i o. SP i o
end = forall i o. SP i o
NullSP