diff --git a/.travis.yml b/.travis.yml index 791313a..3a3392d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,8 @@ language: node_js sudo: false node_js: - 0.10 + - 0.12 + - 4.1 env: - PATH=$HOME/purescript:$PATH install: diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index ed5a3d2..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = function(grunt) { - - "use strict"; - - grunt.initConfig({ - - libFiles: [ - "src/**/*.purs", - "bower_components/purescript-*/src/**/*.purs", - ], - - clean: ["output"], - - pscMake: ["<%=libFiles%>"], - dotPsci: ["<%=libFiles%>"], - docgen: { - readme: { - src: "src/**/*.purs", - dest: "README.md" - } - } - - }); - - grunt.loadNpmTasks("grunt-contrib-clean"); - grunt.loadNpmTasks("grunt-purescript"); - - grunt.registerTask("make", ["pscMake", "dotPsci", "docgen"]); - grunt.registerTask("default", ["make"]); -}; diff --git a/bower.json b/bower.json index 48788e8..18bcf26 100644 --- a/bower.json +++ b/bower.json @@ -11,5 +11,10 @@ "dependencies": { "purescript-eff": "~0.1.0", "purescript-maybe": "~0.3.1" + }, + "devDependencies": { + "purescript-assert": "~0.1.1", + "purescript-console": "~0.1.1", + "purescript-foldable-traversable": "~0.4.1" } } diff --git a/docs/Node/Buffer.md b/docs/Node/Buffer.md index 4fecedb..5781e37 100644 --- a/docs/Node/Buffer.md +++ b/docs/Node/Buffer.md @@ -30,13 +30,13 @@ An instance of Node's Buffer class. instance showBuffer :: Show Buffer ``` -#### `BufferWrite` +#### `BUFFER` ``` purescript -data BufferWrite :: ! +data BUFFER :: ! ``` -Effect for buffer modification. +Effect for buffer creation, reading, or writing. #### `BufferValueType` @@ -68,7 +68,7 @@ instance showBufferValueType :: Show BufferValueType #### `create` ``` purescript -create :: Int -> Buffer +create :: forall e. Int -> Eff (buffer :: BUFFER | e) Buffer ``` Creates a new buffer of the specified size. @@ -76,7 +76,7 @@ Creates a new buffer of the specified size. #### `fromArray` ``` purescript -fromArray :: Array Octet -> Buffer +fromArray :: forall e. Array Octet -> Eff (buffer :: BUFFER | e) Buffer ``` Creates a new buffer from an array of octets, sized to match the array. @@ -84,7 +84,7 @@ Creates a new buffer from an array of octets, sized to match the array. #### `fromString` ``` purescript -fromString :: String -> Encoding -> Buffer +fromString :: forall e. String -> Encoding -> Eff (buffer :: BUFFER | e) Buffer ``` Creates a new buffer from a string with the specified encoding, sized to @@ -93,7 +93,7 @@ match the string. #### `read` ``` purescript -read :: BufferValueType -> Offset -> Buffer -> Int +read :: forall e. BufferValueType -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Int ``` Reads a numeric value from a buffer at the specified offset. @@ -101,7 +101,7 @@ Reads a numeric value from a buffer at the specified offset. #### `readString` ``` purescript -readString :: Encoding -> Offset -> Offset -> Buffer -> String +readString :: forall e. Encoding -> Offset -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) String ``` Reads a section of a buffer as a string with the specified encoding. @@ -109,7 +109,7 @@ Reads a section of a buffer as a string with the specified encoding. #### `toString` ``` purescript -toString :: Encoding -> Buffer -> String +toString :: forall e. Encoding -> Buffer -> Eff (buffer :: BUFFER | e) String ``` Reads the buffer as a string with the specified encoding. @@ -117,7 +117,7 @@ Reads the buffer as a string with the specified encoding. #### `write` ``` purescript -write :: forall e. BufferValueType -> Int -> Offset -> Buffer -> Eff (buffer :: BufferWrite | e) Unit +write :: forall e. BufferValueType -> Int -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Unit ``` Writes a numeric value to a buffer at the specified offset. @@ -125,7 +125,7 @@ Writes a numeric value to a buffer at the specified offset. #### `writeString` ``` purescript -writeString :: forall e. Encoding -> Offset -> Int -> String -> Buffer -> Eff (buffer :: BufferWrite | e) Int +writeString :: forall e. Encoding -> Offset -> Int -> String -> Buffer -> Eff (buffer :: BUFFER | e) Int ``` Writes octets from a string to a buffer at the specified offset. Multi-byte @@ -135,7 +135,7 @@ to write them fully. The number of bytes written is returned. #### `toArray` ``` purescript -toArray :: Buffer -> Array Octet +toArray :: forall e. Buffer -> Eff (buffer :: BUFFER | e) (Array Octet) ``` Creates an array of octets from a buffer's contents. @@ -143,7 +143,7 @@ Creates an array of octets from a buffer's contents. #### `getAtOffset` ``` purescript -getAtOffset :: Offset -> Buffer -> Maybe Octet +getAtOffset :: forall e. Offset -> Buffer -> Eff (buffer :: BUFFER | e) (Maybe Octet) ``` Reads an octet from a buffer at the specified offset. @@ -151,7 +151,7 @@ Reads an octet from a buffer at the specified offset. #### `setAtOffset` ``` purescript -setAtOffset :: forall e. Octet -> Offset -> Buffer -> Eff (buffer :: BufferWrite | e) Unit +setAtOffset :: forall e. Octet -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Unit ``` Writes an octet in the buffer at the specified offset. @@ -159,7 +159,7 @@ Writes an octet in the buffer at the specified offset. #### `size` ``` purescript -size :: Buffer -> Int +size :: forall e. Buffer -> Eff (buffer :: BUFFER | e) Int ``` Returns the size of a buffer. @@ -167,7 +167,7 @@ Returns the size of a buffer. #### `concat` ``` purescript -concat :: Array Buffer -> Buffer +concat :: forall e. Array Buffer -> Eff (buffer :: BUFFER | e) Buffer ``` Concatenates a list of buffers. @@ -175,7 +175,7 @@ Concatenates a list of buffers. #### `concat'` ``` purescript -concat' :: Array Buffer -> Int -> Buffer +concat' :: forall e. Array Buffer -> Int -> Eff (buffer :: BUFFER | e) Buffer ``` Concatenates a list of buffers, combining them into a new buffer of the @@ -184,16 +184,16 @@ specified length. #### `copy` ``` purescript -copy :: Offset -> Offset -> Buffer -> Offset -> Buffer -> Buffer +copy :: forall e. Offset -> Offset -> Buffer -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Int ``` Copies a section of a source buffer into a target buffer at the specified -offset. +offset, and returns the number of octets copied. #### `fill` ``` purescript -fill :: forall e. Octet -> Offset -> Offset -> Buffer -> Eff (buffer :: BufferWrite | e) Unit +fill :: forall e. Octet -> Offset -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Unit ``` Fills a range in a buffer with the specified octet. diff --git a/src/Node/Buffer.js b/src/Node/Buffer.js index c625266..88b4754 100644 --- a/src/Node/Buffer.js +++ b/src/Node/Buffer.js @@ -8,23 +8,31 @@ exports.showImpl = require('util').inspect; exports.create = function (size) { - return new Buffer(size); + return function() { + return new Buffer(size); + }; }; exports.fromArray = function (octets) { - return new Buffer(octets); + return function() { + return new Buffer(octets); + }; }; exports.fromStringImpl = function (str) { return function (encoding) { - return new Buffer(str, encoding); + return function() { + return new Buffer(str, encoding); + }; }; }; exports.readImpl = function (ty) { return function (offset) { return function (buf) { - return buf['read' + ty](offset); + return function() { + return buf['read' + ty](offset); + }; }; }; }; @@ -33,7 +41,9 @@ exports.readStringImpl = function (enc) { return function (start) { return function (end) { return function (buff) { - return buff.toString(enc, start, end); + return function() { + return buff.toString(enc, start, end); + }; }; }; }; @@ -41,7 +51,9 @@ exports.readStringImpl = function (enc) { exports.toStringImpl = function (enc) { return function (buff) { - return buff.toString(enc); + return function() { + return buff.toString(enc); + }; }; }; @@ -73,16 +85,21 @@ exports.writeStringImpl = function (enc) { }; exports.toArray = function (buff) { - return buff.toJSON(); + return function() { + var json = buff.toJSON() + return json.data || json; + }; }; exports.getAtOffsetImpl = function (nothing) { return function (just) { return function (buff) { return function (offset) { - var octet = buff[offset]; - return octet == null ? nothing - : just(buff[i]); + return function() { + var octet = buff[offset]; + return octet == null ? nothing + : just(buff[i]); + }; }; }; }; @@ -91,25 +108,33 @@ exports.getAtOffsetImpl = function (nothing) { exports.setAtOffset = function (value) { return function (offset) { return function (buff) { - buff[offset] = value; - return {}; + return function() { + buff[offset] = value; + return {}; + }; }; }; }; exports.size = function (buff) { - return buff.length; + return function() { + return buff.length; + }; }; exports.concat = function (buffs) { - return Buffer.concat(buffs); + return function() { + return Buffer.concat(buffs); + }; }; -exports.concat$prime = function (buffs) { +exports["concat'"] = function (buffs) { return function (totalLength) { - return Buffer.concat(buffs, totalLength); + return function() { + return Buffer.concat(buffs, totalLength); + }; }; }; @@ -118,21 +143,23 @@ exports.copy = function (srcStart) { return function (src) { return function (targStart) { return function (targ) { - return src.copy(targ, targStart, srcStart, strcEnd); + return function() { + return src.copy(targ, targStart, srcStart, srcEnd); + }; }; }; }; }; }; -exports.fill = function (buff) { - return function (octet) { - return function (start) { - return function (end) { +exports.fill = function (octet) { + return function (start) { + return function (end) { + return function (buf) { return function() { - buff.fill(octet, start, end); + buf.fill(octet, start, end); return {}; - } + }; }; }; }; diff --git a/src/Node/Buffer.purs b/src/Node/Buffer.purs index abb7a34..891a31e 100644 --- a/src/Node/Buffer.purs +++ b/src/Node/Buffer.purs @@ -2,7 +2,7 @@ module Node.Buffer ( Octet() , Offset() , Buffer() - , BufferWrite() + , BUFFER() , BufferValueType(..) , create , fromArray @@ -42,8 +42,8 @@ instance showBuffer :: Show Buffer where foreign import showImpl :: Buffer -> String --- | Effect for buffer modification. -foreign import data BufferWrite :: ! +-- | Effect for buffer creation, reading, or writing. +foreign import data BUFFER :: ! -- | Enumeration of the numeric types that can be written to a buffer. data BufferValueType @@ -79,80 +79,81 @@ instance showBufferValueType :: Show BufferValueType where show DoubleBE = "DoubleBE" -- | Creates a new buffer of the specified size. -foreign import create :: Int -> Buffer +foreign import create :: forall e. Int -> Eff (buffer :: BUFFER | e) Buffer -- | Creates a new buffer from an array of octets, sized to match the array. -foreign import fromArray :: Array Octet -> Buffer +foreign import fromArray :: forall e. Array Octet -> Eff (buffer :: BUFFER | e) Buffer -- | Creates a new buffer from a string with the specified encoding, sized to -- | match the string. -fromString :: String -> Encoding -> Buffer +fromString :: forall e. String -> Encoding -> Eff (buffer :: BUFFER | e) Buffer fromString str = fromStringImpl str <<< show -foreign import fromStringImpl :: String -> String -> Buffer +foreign import fromStringImpl :: forall e. String -> String -> Eff (buffer :: BUFFER | e) Buffer -- | Reads a numeric value from a buffer at the specified offset. -read :: BufferValueType -> Offset -> Buffer -> Int +read :: forall e. BufferValueType -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Int read = readImpl <<< show -foreign import readImpl :: String -> Offset -> Buffer -> Int +foreign import readImpl :: forall e. String -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Int -- | Reads a section of a buffer as a string with the specified encoding. -readString :: Encoding -> Offset -> Offset -> Buffer -> String +readString :: forall e. Encoding -> Offset -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) String readString = readStringImpl <<< show -foreign import readStringImpl :: String -> Offset -> Offset -> Buffer -> String +foreign import readStringImpl :: + forall e. String -> Offset -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) String -- | Reads the buffer as a string with the specified encoding. -toString :: Encoding -> Buffer -> String +toString :: forall e. Encoding -> Buffer -> Eff (buffer :: BUFFER | e) String toString = toStringImpl <<< show -foreign import toStringImpl :: String -> Buffer -> String +foreign import toStringImpl :: forall e. String -> Buffer -> Eff (buffer :: BUFFER | e) String -- | Writes a numeric value to a buffer at the specified offset. -write :: forall e. BufferValueType -> Int -> Offset -> Buffer -> Eff (buffer :: BufferWrite | e) Unit +write :: forall e. BufferValueType -> Int -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Unit write = writeImpl <<< show foreign import writeImpl :: - forall e. String -> Int -> Offset -> Buffer -> Eff (buffer :: BufferWrite | e) Unit + forall e. String -> Int -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Unit -- | Writes octets from a string to a buffer at the specified offset. Multi-byte -- | characters will not be written to the buffer if there is not enough capacity -- | to write them fully. The number of bytes written is returned. -writeString :: forall e. Encoding -> Offset -> Int -> String -> Buffer -> Eff (buffer :: BufferWrite | e) Int +writeString :: forall e. Encoding -> Offset -> Int -> String -> Buffer -> Eff (buffer :: BUFFER | e) Int writeString = writeStringImpl <<< show foreign import writeStringImpl :: - forall e. String -> Offset -> Int -> String -> Buffer -> Eff (buffer :: BufferWrite | e) Int + forall e. String -> Offset -> Int -> String -> Buffer -> Eff (buffer :: BUFFER | e) Int -- | Creates an array of octets from a buffer's contents. -foreign import toArray :: Buffer -> Array Octet +foreign import toArray :: forall e. Buffer -> Eff (buffer :: BUFFER | e) (Array Octet) -- | Reads an octet from a buffer at the specified offset. -getAtOffset :: Offset -> Buffer -> Maybe Octet +getAtOffset :: forall e. Offset -> Buffer -> Eff (buffer :: BUFFER | e) (Maybe Octet) getAtOffset = getAtOffsetImpl Just Nothing foreign import getAtOffsetImpl :: - (Octet -> Maybe Octet) -> Maybe Octet -> Offset -> Buffer -> Maybe Octet + forall e. (Octet -> Maybe Octet) -> Maybe Octet -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) (Maybe Octet) -- | Writes an octet in the buffer at the specified offset. foreign import setAtOffset :: - forall e. Octet -> Offset -> Buffer -> Eff (buffer :: BufferWrite | e) Unit + forall e. Octet -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Unit -- | Returns the size of a buffer. -foreign import size :: Buffer -> Int +foreign import size :: forall e. Buffer -> Eff (buffer :: BUFFER | e) Int -- | Concatenates a list of buffers. -foreign import concat :: Array Buffer -> Buffer +foreign import concat :: forall e. Array Buffer -> Eff (buffer :: BUFFER | e) Buffer -- | Concatenates a list of buffers, combining them into a new buffer of the -- | specified length. -foreign import concat' :: Array Buffer -> Int -> Buffer +foreign import concat' :: forall e. Array Buffer -> Int -> Eff (buffer :: BUFFER | e) Buffer -- | Copies a section of a source buffer into a target buffer at the specified --- | offset. -foreign import copy :: Offset -> Offset -> Buffer -> Offset -> Buffer -> Buffer +-- | offset, and returns the number of octets copied. +foreign import copy :: forall e. Offset -> Offset -> Buffer -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Int -- | Fills a range in a buffer with the specified octet. foreign import fill :: - forall e. Octet -> Offset -> Offset -> Buffer -> Eff (buffer :: BufferWrite | e) Unit + forall e. Octet -> Offset -> Offset -> Buffer -> Eff (buffer :: BUFFER | e) Unit diff --git a/test/Main.purs b/test/Main.purs index 588aecb..7b5cbe6 100644 --- a/test/Main.purs +++ b/test/Main.purs @@ -1,8 +1,129 @@ module Test.Main where import Prelude +import Data.Traversable (traverse) import Control.Monad.Eff +import Control.Monad.Eff.Console (log, CONSOLE()) +import Test.Assert --- TODO -main :: forall e. Eff e Unit -main = return unit +import Node.Buffer +import Node.Encoding + +type Test = forall e. Eff (assert :: ASSERT, buffer :: BUFFER, console :: CONSOLE | e) Unit + +main :: Test +main = do + log "Testing..." + + log "Reading and writing" + testReadWrite + + log "fromArray" + testFromArray + + log "toArray" + testToArray + + log "fromString" + testFromString + + log "toString" + testToString + + log "readString" + testReadString + + log "copy" + testCopy + + log "fill" + testFill + + log "concat'" + testConcat' + +testReadWrite :: Test +testReadWrite = do + buf <- create 1 + let val = 42 + write UInt8 val 0 buf + readVal <- read UInt8 0 buf + + assertEq val readVal + +testFromArray :: Test +testFromArray = do + buf <- fromArray [1,2,3,4,5] + readVal <- read UInt8 2 buf + + assertEq 3 readVal + +testToArray :: Test +testToArray = do + let val = [1,2,67,3,3,7,8,3,4,237] + + buf <- fromArray val + valOut <- toArray buf + + assertEq val valOut + +testFromString :: Test +testFromString = do + let str = "hello, world" + + buf <- fromString str ASCII + val <- read UInt8 6 buf + + assertEq val 32 -- ASCII space + +testToString :: Test +testToString = do + let str = "hello, world" + + buf <- fromString str ASCII + strOut <- toString ASCII buf + + assertEq str strOut + +testReadString :: Test +testReadString = do + let str = "hello, world" + + buf <- fromString str ASCII + strOut <- readString ASCII 7 12 buf + + assertEq "world" strOut + +testCopy :: Test +testCopy = do + buf1 <- fromArray [1,2,3,4,5] + buf2 <- fromArray [10,9,8,7,6] + + copied <- copy 0 3 buf1 2 buf2 + out <- toArray buf2 + + assertEq copied 3 + assertEq out [10,9,1,2,3] + +testFill :: Test +testFill = do + buf <- fromArray [1,1,1,1,1] + fill 42 2 4 buf + out <- toArray buf + + assertEq [1,1,42,42,1] out + +testConcat' :: Test +testConcat' = do + bufs <- traverse fromArray $ map (\x -> [x, x+1, x+2]) [0,3,6,9,12] + buf <- concat' bufs 15 + out <- toArray buf + + assertEq [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14] out + +assertEq :: forall a. (Eq a, Show a) => a -> a -> Test +assertEq x y = + if x == y + then return unit + else let msg = show x ++ " and " ++ show y ++ " were not equal." + in assert' msg false