@@ -33,7 +33,7 @@ module Node.Stream
33
33
import Prelude
34
34
35
35
import Control.Bind ((<=<))
36
- import Data.Maybe (Maybe (..), maybe )
36
+ import Data.Maybe (Maybe (..), maybe , fromMaybe )
37
37
import Data.Either (Either (..))
38
38
import Node.Encoding
39
39
import Node.Buffer (Buffer ())
@@ -66,6 +66,8 @@ type Writable r = Stream (write :: Write | r)
66
66
-- | A duplex (readable _and_ writable stream)
67
67
type Duplex = Stream (read :: Read , write :: Write )
68
68
69
+ foreign import undefined :: forall a . a
70
+
69
71
foreign import data Chunk :: *
70
72
readChunk :: Chunk -> Either String Buffer
71
73
readChunk = readChunkImpl Left Right
@@ -84,26 +86,26 @@ onData r cb =
84
86
Right buf ->
85
87
pure buf
86
88
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
90
92
case v of
91
93
Nothing -> pure Nothing
92
94
Just (Left _) -> throw " Stream encoding should not be set"
93
95
Just (Right b) -> pure (Just b)
94
96
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
98
100
case v of
99
101
Nothing -> pure Nothing
100
102
Just (Left _) -> throw " Stream encoding should not be set"
101
103
Just (Right buf) -> Just <$> (unsafeInterleaveEff $ Buffer .toString enc buf)
102
104
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)
105
107
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 ))
107
109
108
110
-- | Listen for `data` events, returning data in a String, which will be
109
111
-- | decoded using the given encoding. Note that this will fail if `setEncoding`
0 commit comments