@@ -33,7 +33,7 @@ module Node.Stream
3333import Prelude
3434
3535import Control.Bind ((<=<))
36- import Data.Maybe (Maybe (..), maybe )
36+ import Data.Maybe (Maybe (..), maybe , fromMaybe )
3737import Data.Either (Either (..))
3838import Node.Encoding
3939import Node.Buffer (Buffer ())
@@ -66,6 +66,8 @@ type Writable r = Stream (write :: Write | r)
6666-- | A duplex (readable _and_ writable stream)
6767type Duplex = Stream (read :: Read , write :: Write )
6868
69+ foreign import undefined :: forall a . a
70+
6971foreign import data Chunk :: *
7072readChunk :: Chunk -> Either String Buffer
7173readChunk = readChunkImpl Left Right
@@ -84,26 +86,26 @@ onData r cb =
8486 Right buf ->
8587 pure buf
8688
87- read :: forall w eff . Readable w (err :: EXCEPTION | eff ) -> Eff (err :: EXCEPTION | eff ) (Maybe Buffer )
88- read r = do
89- v <- readEither r
89+ read :: forall w eff . Readable w (err :: EXCEPTION | eff ) -> Maybe Int -> Eff (err :: EXCEPTION | eff ) (Maybe Buffer )
90+ read r size = do
91+ v <- readEither r size
9092 case v of
9193 Nothing -> pure Nothing
9294 Just (Left _) -> throw " Stream encoding should not be set"
9395 Just (Right b) -> pure (Just b)
9496
95- readString :: forall w eff . Readable w (err :: EXCEPTION | eff ) -> Encoding -> Eff (err :: EXCEPTION | eff ) (Maybe String )
96- readString r enc = do
97- v <- readEither r
97+ readString :: forall w eff . Readable w (err :: EXCEPTION | eff ) -> Maybe Int -> Encoding -> Eff (err :: EXCEPTION | eff ) (Maybe String )
98+ readString r size enc = do
99+ v <- readEither r size
98100 case v of
99101 Nothing -> pure Nothing
100102 Just (Left _) -> throw " Stream encoding should not be set"
101103 Just (Right buf) -> Just <$> (unsafeInterleaveEff $ Buffer .toString enc buf)
102104
103- readEither :: forall w eff . Readable w eff -> Eff eff (Maybe (Either String Buffer ))
104- readEither = readImpl readChunk Nothing Just
105+ readEither :: forall w eff . Readable w eff -> Maybe Int -> Eff eff (Maybe (Either String Buffer ))
106+ readEither r size = readImpl readChunk Nothing Just r (fromMaybe undefined size)
105107
106- foreign import readImpl :: forall r eff . (Chunk -> Either String Buffer ) -> (forall a . Maybe a ) -> (forall a . a -> Maybe a ) -> Readable r eff -> Eff eff (Maybe (Either String Buffer ))
108+ foreign import readImpl :: forall r eff . (Chunk -> Either String Buffer ) -> (forall a . Maybe a ) -> (forall a . a -> Maybe a ) -> Readable r eff -> Int -> Eff eff (Maybe (Either String Buffer ))
107109
108110-- | Listen for `data` events, returning data in a String, which will be
109111-- | decoded using the given encoding. Note that this will fail if `setEncoding`
0 commit comments