9 people like it.

EnumerableStream

A lazy enumerable/stream of bytes.

  1: 
  2: 
  3: 
  4: 
  5: 
  6: 
  7: 
  8: 
  9: 
 10: 
 11: 
 12: 
 13: 
 14: 
 15: 
 16: 
 17: 
 18: 
 19: 
 20: 
 21: 
 22: 
 23: 
 24: 
 25: 
 26: 
 27: 
 28: 
 29: 
 30: 
 31: 
 32: 
 33: 
 34: 
 35: 
 36: 
 37: 
 38: 
 39: 
 40: 
 41: 
 42: 
 43: 
 44: 
 45: 
 46: 
 47: 
 48: 
 49: 
 50: 
 51: 
 52: 
 53: 
 54: 
 55: 
 56: 
 57: 
 58: 
 59: 
 60: 
 61: 
 62: 
 63: 
 64: 
 65: 
 66: 
 67: 
 68: 
 69: 
 70: 
 71: 
 72: 
 73: 
 74: 
 75: 
 76: 
 77: 
 78: 
 79: 
 80: 
 81: 
 82: 
 83: 
 84: 
 85: 
 86: 
 87: 
 88: 
 89: 
 90: 
 91: 
 92: 
 93: 
 94: 
 95: 
 96: 
 97: 
 98: 
 99: 
100: 
101: 
102: 
103: 
104: 
105: 
106: 
107: 
108: 
109: 
110: 
111: 
112: 
113: 
114: 
115: 
open System
open System.Collections
open System.Collections.Generic
open System.Diagnostics.Contracts
open System.IO
open System.Runtime.Serialization
open System.Runtime.Serialization.Formatters.Binary
open System.Text

/// Extensions to the Array module.
[<System.Runtime.CompilerServices.Extension>]
module Array =
  /// Slices out a portion of the array from the start index up to the stop index.
  let slice start stop (source:'a[]) =
    let stop' = ref stop
    if !stop' < 0 then stop' := source.Length + !stop'
    let len = !stop' - start
    [| for i in [0..(len-1)] do yield source.[i + start] |]

  [<System.Runtime.CompilerServices.Extension>]
  let Slice(arr, start, stop) = slice start stop arr

/// Initializes a new instance of the SeqStream class.
/// <see href="http://extensia.codeplex.com"/>
type SeqStream(data:seq<byte>) =
  inherit Stream()
  do Contract.Requires(data <> null)
  let enumerator = data.GetEnumerator

  interface IEnumerable<byte> with
    /// Gets the enumerator for the SeqStream.
    member this.GetEnumerator() = enumerator()
    /// Gets the enumerator for the SeqStream.
    member this.GetEnumerator() = enumerator() :> IEnumerator 

  override this.CanRead = true
  override this.CanSeek = false
  override this.CanWrite = false
  override this.Flush() = ()
  override this.Length = data |> Seq.length |> int64
  override this.Position with get() = raise (NotSupportedException())
                         and set(v) = raise (NotSupportedException())
  override this.Seek(offset, origin) = raise (NotSupportedException())
  override this.SetLength(value) = raise (NotSupportedException())
  override this.Write(buffer, offset, count) = raise (NotSupportedException())
  override this.Dispose(disposing) = let d = enumerator() in d.Dispose()
                                     base.Dispose(disposing)
  override this.Read(buffer, offset, count) =
    Contract.Requires(buffer <> null)
    Contract.Requires(offset >= 0)
    Contract.Requires(count > 0)
    Contract.Requires(offset + count <= buffer.Length)

    let d = enumerator()
    let rec loop bytesRead =
      if d.MoveNext() && bytesRead < count
        then
          buffer.[bytesRead + offset] <- d.Current
          loop (bytesRead + 1)
        else bytesRead
    loop 0
    
  /// Returns the SeqStream as a UTF8 encoded string.
  override this.ToString() = Encoding.UTF8.GetString(data |> Seq.toArray)

  /// An empty SeqStream.
  static member Empty = new SeqStream(Seq.empty<byte>)

  /// Converts a string into a SeqStream.
  static member FromString(s:string) = new SeqStream(Encoding.UTF8.GetBytes(s))

  /// Converts a stream into a SeqStream.
  static member FromStream(stream:Stream, ?bufferSize) =
    let bufferSize = defaultArg bufferSize 1024
    Contract.Requires(stream <> null)
    Contract.Requires(bufferSize > 0)

    let buffer = Array.zeroCreate bufferSize
    let count = ref 0
    count := stream.Read(buffer, 0, buffer.Length)
    let bytes = seq {
      while !count > 0 do
        for i in [0..(!count-1)] do yield buffer.[i]
        count := stream.Read(buffer, 0, buffer.Length) }
    new SeqStream(bytes)

  /// Converts a FileInfo into a SeqStream.
  static member FromFileInfo(file:FileInfo) =
    Contract.Requires(file <> null)
    use stream = file.OpenRead()
    SeqStream.FromStream(stream, int stream.Length)

  /// Converts an object to a SeqStream.
  static member FromObject(ob) =
    let formatter = BinaryFormatter()
    use stream = new MemoryStream()
    try
      formatter.Serialize(stream, ob)
      SeqStream.FromStream(stream)
    with :? SerializationException as e -> SeqStream.Empty

  /// Converts a SeqStream into an object.
  member this.Cast<'a when 'a : null>() =
    let formatter = BinaryFormatter()
    use stream = new MemoryStream(data |> Seq.toArray)
    try formatter.Deserialize(stream) :?> 'a
    with e -> null

  /// Gets the enumerator for the SeqStream.
  member this.GetEnumerator() = enumerator()

  /// Transfers the bytes of the SeqStream into the specified stream
  member this.TransferTo (stream:Stream) =
    Contract.Requires(stream <> null)
    data |> Seq.iter (fun x -> stream.WriteByte(x))
namespace System
namespace System.Collections
namespace System.Collections.Generic
namespace System.Diagnostics
namespace System.Diagnostics.Contracts
namespace System.IO
namespace System.Runtime
namespace System.Runtime.Serialization
namespace System.Runtime.Serialization.Formatters
namespace System.Runtime.Serialization.Formatters.Binary
namespace System.Text
namespace System.Runtime.CompilerServices
Multiple items
type ExtensionAttribute =
  inherit Attribute
  new : unit -> ExtensionAttribute

Full name: System.Runtime.CompilerServices.ExtensionAttribute

--------------------
Runtime.CompilerServices.ExtensionAttribute() : unit
type Array =
  member Clone : unit -> obj
  member CopyTo : array:Array * index:int -> unit + 1 overload
  member GetEnumerator : unit -> IEnumerator
  member GetLength : dimension:int -> int
  member GetLongLength : dimension:int -> int64
  member GetLowerBound : dimension:int -> int
  member GetUpperBound : dimension:int -> int
  member GetValue : [<ParamArray>] indices:int[] -> obj + 7 overloads
  member Initialize : unit -> unit
  member IsFixedSize : bool
  ...

Full name: System.Array
val slice : start:int -> stop:int -> source:'a [] -> 'a []

Full name: Script.Array.slice


 Slices out a portion of the array from the start index up to the stop index.
val start : int
val stop : int
val source : 'a []
val stop' : int ref
Multiple items
val ref : value:'T -> 'T ref

Full name: Microsoft.FSharp.Core.Operators.ref

--------------------
type 'T ref = Ref<'T>

Full name: Microsoft.FSharp.Core.ref<_>
property Array.Length: int
val len : int
val i : int
val Slice : arr:'a [] * start:int * stop:int -> 'a []

Full name: Script.Array.Slice
val arr : 'a []
Multiple items
type SeqStream =
  inherit Stream
  interface IEnumerable<byte>
  new : data:seq<byte> -> SeqStream
  member Cast : unit -> 'a (requires 'a : null)
  override Dispose : disposing:bool -> unit
  override Flush : unit -> unit
  member GetEnumerator : unit -> IEnumerator<byte>
  override Read : buffer:byte [] * offset:int * count:int -> int
  override Seek : offset:int64 * origin:SeekOrigin -> int64
  override SetLength : value:int64 -> unit
  ...

Full name: Script.SeqStream


 Initializes a new instance of the SeqStream class.
 <see href="http://extensia.codeplex.com"/>


--------------------
new : data:seq<byte> -> SeqStream
val data : seq<byte>
Multiple items
val seq : sequence:seq<'T> -> seq<'T>

Full name: Microsoft.FSharp.Core.Operators.seq

--------------------
type seq<'T> = IEnumerable<'T>

Full name: Microsoft.FSharp.Collections.seq<_>
Multiple items
val byte : value:'T -> byte (requires member op_Explicit)

Full name: Microsoft.FSharp.Core.Operators.byte

--------------------
type byte = Byte

Full name: Microsoft.FSharp.Core.byte
Multiple items
type Stream =
  inherit MarshalByRefObject
  member BeginRead : buffer:byte[] * offset:int * count:int * callback:AsyncCallback * state:obj -> IAsyncResult
  member BeginWrite : buffer:byte[] * offset:int * count:int * callback:AsyncCallback * state:obj -> IAsyncResult
  member CanRead : bool
  member CanSeek : bool
  member CanTimeout : bool
  member CanWrite : bool
  member Close : unit -> unit
  member CopyTo : destination:Stream -> unit + 1 overload
  member Dispose : unit -> unit
  member EndRead : asyncResult:IAsyncResult -> int
  ...

Full name: System.IO.Stream

--------------------
Stream() : unit
type Contract =
  static member Assert : condition:bool -> unit + 1 overload
  static member Assume : condition:bool -> unit + 1 overload
  static member EndContractBlock : unit -> unit
  static member Ensures : condition:bool -> unit + 1 overload
  static member EnsuresOnThrow<'TException> : condition:bool -> unit + 1 overload
  static member Exists<'T> : collection:IEnumerable<'T> * predicate:Predicate<'T> -> bool + 1 overload
  static member ForAll<'T> : collection:IEnumerable<'T> * predicate:Predicate<'T> -> bool + 1 overload
  static member Invariant : condition:bool -> unit + 1 overload
  static member OldValue<'T> : value:'T -> 'T
  static member Requires : condition:bool -> unit + 3 overloads
  ...

Full name: System.Diagnostics.Contracts.Contract
Contract.Requires<'TException (requires 'TException :> exn)>(condition: bool) : unit
Contract.Requires(condition: bool) : unit
Contract.Requires<'TException (requires 'TException :> exn)>(condition: bool, userMessage: string) : unit
Contract.Requires(condition: bool, userMessage: string) : unit
val enumerator : (unit -> IEnumerator<byte>)
IEnumerable.GetEnumerator() : IEnumerator<byte>
Multiple items
type IEnumerable =
  member GetEnumerator : unit -> IEnumerator

Full name: System.Collections.IEnumerable

--------------------
type IEnumerable<'T> =
  member GetEnumerator : unit -> IEnumerator<'T>

Full name: System.Collections.Generic.IEnumerable<_>
val this : SeqStream
override SeqStream.GetEnumerator : unit -> IEnumerator<byte>

Full name: Script.SeqStream.GetEnumerator


 Gets the enumerator for the SeqStream.
override SeqStream.GetEnumerator : unit -> IEnumerator

Full name: Script.SeqStream.GetEnumerator


 Gets the enumerator for the SeqStream.
Multiple items
type IEnumerator =
  member Current : obj
  member MoveNext : unit -> bool
  member Reset : unit -> unit

Full name: System.Collections.IEnumerator

--------------------
type IEnumerator<'T> =
  member Current : 'T

Full name: System.Collections.Generic.IEnumerator<_>
override SeqStream.CanRead : bool

Full name: Script.SeqStream.CanRead
override SeqStream.CanSeek : bool

Full name: Script.SeqStream.CanSeek
override SeqStream.CanWrite : bool

Full name: Script.SeqStream.CanWrite
override SeqStream.Flush : unit -> unit

Full name: Script.SeqStream.Flush
override SeqStream.Length : int64

Full name: Script.SeqStream.Length
module Seq

from Microsoft.FSharp.Collections
val length : source:seq<'T> -> int

Full name: Microsoft.FSharp.Collections.Seq.length
Multiple items
val int64 : value:'T -> int64 (requires member op_Explicit)

Full name: Microsoft.FSharp.Core.Operators.int64

--------------------
type int64 = Int64

Full name: Microsoft.FSharp.Core.int64

--------------------
type int64<'Measure> = int64

Full name: Microsoft.FSharp.Core.int64<_>
override SeqStream.Position : int64 with set

Full name: Script.SeqStream.Position
val raise : exn:Exception -> 'T

Full name: Microsoft.FSharp.Core.Operators.raise
Multiple items
type NotSupportedException =
  inherit SystemException
  new : unit -> NotSupportedException + 2 overloads

Full name: System.NotSupportedException

--------------------
NotSupportedException() : unit
NotSupportedException(message: string) : unit
NotSupportedException(message: string, innerException: exn) : unit
val set : elements:seq<'T> -> Set<'T> (requires comparison)

Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.set
val v : int64
override SeqStream.Seek : offset:int64 * origin:SeekOrigin -> int64

Full name: Script.SeqStream.Seek
val offset : int64
val origin : SeekOrigin
override SeqStream.SetLength : value:int64 -> unit

Full name: Script.SeqStream.SetLength
val value : int64
override SeqStream.Write : buffer:byte [] * offset:int * count:int -> unit

Full name: Script.SeqStream.Write
val buffer : byte []
val offset : int
val count : int
override SeqStream.Dispose : disposing:bool -> unit

Full name: Script.SeqStream.Dispose
val disposing : bool
val d : IEnumerator<byte>
IDisposable.Dispose() : unit
override SeqStream.Read : buffer:byte [] * offset:int * count:int -> int

Full name: Script.SeqStream.Read
val loop : (int -> int)
val bytesRead : int
IEnumerator.MoveNext() : bool
property IEnumerator.Current: byte
override SeqStream.ToString : unit -> string

Full name: Script.SeqStream.ToString


 Returns the SeqStream as a UTF8 encoded string.
type Encoding =
  member BodyName : string
  member Clone : unit -> obj
  member CodePage : int
  member DecoderFallback : DecoderFallback with get, set
  member EncoderFallback : EncoderFallback with get, set
  member EncodingName : string
  member Equals : value:obj -> bool
  member GetByteCount : chars:char[] -> int + 3 overloads
  member GetBytes : chars:char[] -> byte[] + 5 overloads
  member GetCharCount : bytes:byte[] -> int + 2 overloads
  ...

Full name: System.Text.Encoding
property Encoding.UTF8: Encoding
Encoding.GetString(bytes: byte []) : string
Encoding.GetString(bytes: byte [], index: int, count: int) : string
val toArray : source:seq<'T> -> 'T []

Full name: Microsoft.FSharp.Collections.Seq.toArray
static member SeqStream.Empty : SeqStream

Full name: Script.SeqStream.Empty


 An empty SeqStream.
val empty<'T> : seq<'T>

Full name: Microsoft.FSharp.Collections.Seq.empty
static member SeqStream.FromString : s:string -> SeqStream

Full name: Script.SeqStream.FromString


 Converts a string into a SeqStream.
val s : string
Multiple items
val string : value:'T -> string

Full name: Microsoft.FSharp.Core.Operators.string

--------------------
type string = String

Full name: Microsoft.FSharp.Core.string
Encoding.GetBytes(s: string) : byte []
Encoding.GetBytes(chars: char []) : byte []
Encoding.GetBytes(chars: char [], index: int, count: int) : byte []
Encoding.GetBytes(chars: nativeptr<char>, charCount: int, bytes: nativeptr<byte>, byteCount: int) : int
Encoding.GetBytes(s: string, charIndex: int, charCount: int, bytes: byte [], byteIndex: int) : int
Encoding.GetBytes(chars: char [], charIndex: int, charCount: int, bytes: byte [], byteIndex: int) : int
static member SeqStream.FromStream : stream:Stream * ?bufferSize:int -> SeqStream

Full name: Script.SeqStream.FromStream


 Converts a stream into a SeqStream.
val stream : Stream
val bufferSize : int option
val bufferSize : int
val defaultArg : arg:'T option -> defaultValue:'T -> 'T

Full name: Microsoft.FSharp.Core.Operators.defaultArg
val zeroCreate : count:int -> 'T []

Full name: Microsoft.FSharp.Collections.Array.zeroCreate
val count : int ref
Stream.Read(buffer: byte [], offset: int, count: int) : int
val bytes : seq<byte>
static member SeqStream.FromFileInfo : file:FileInfo -> SeqStream

Full name: Script.SeqStream.FromFileInfo


 Converts a FileInfo into a SeqStream.
val file : FileInfo
Multiple items
type FileInfo =
  inherit FileSystemInfo
  new : fileName:string -> FileInfo
  member AppendText : unit -> StreamWriter
  member CopyTo : destFileName:string -> FileInfo + 1 overload
  member Create : unit -> FileStream
  member CreateText : unit -> StreamWriter
  member Decrypt : unit -> unit
  member Delete : unit -> unit
  member Directory : DirectoryInfo
  member DirectoryName : string
  member Encrypt : unit -> unit
  ...

Full name: System.IO.FileInfo

--------------------
FileInfo(fileName: string) : unit
val stream : FileStream
FileInfo.OpenRead() : FileStream
static member SeqStream.FromStream : stream:Stream * ?bufferSize:int -> SeqStream


 Converts a stream into a SeqStream.
Multiple items
val int : value:'T -> int (requires member op_Explicit)

Full name: Microsoft.FSharp.Core.Operators.int

--------------------
type int = int32

Full name: Microsoft.FSharp.Core.int

--------------------
type int<'Measure> = int

Full name: Microsoft.FSharp.Core.int<_>
property FileStream.Length: int64
static member SeqStream.FromObject : ob:'a -> SeqStream

Full name: Script.SeqStream.FromObject


 Converts an object to a SeqStream.
val ob : 'a
val formatter : BinaryFormatter
Multiple items
type BinaryFormatter =
  new : unit -> BinaryFormatter + 1 overload
  member AssemblyFormat : FormatterAssemblyStyle with get, set
  member Binder : SerializationBinder with get, set
  member Context : StreamingContext with get, set
  member Deserialize : serializationStream:Stream -> obj + 1 overload
  member DeserializeMethodResponse : serializationStream:Stream * handler:HeaderHandler * methodCallMessage:IMethodCallMessage -> obj
  member FilterLevel : TypeFilterLevel with get, set
  member Serialize : serializationStream:Stream * graph:obj -> unit + 1 overload
  member SurrogateSelector : ISurrogateSelector with get, set
  member TypeFormat : FormatterTypeStyle with get, set
  ...

Full name: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

--------------------
BinaryFormatter() : unit
BinaryFormatter(selector: ISurrogateSelector, context: StreamingContext) : unit
val stream : MemoryStream
Multiple items
type MemoryStream =
  inherit Stream
  new : unit -> MemoryStream + 6 overloads
  member CanRead : bool
  member CanSeek : bool
  member CanWrite : bool
  member Capacity : int with get, set
  member Flush : unit -> unit
  member GetBuffer : unit -> byte[]
  member Length : int64
  member Position : int64 with get, set
  member Read : buffer:byte[] * offset:int * count:int -> int
  ...

Full name: System.IO.MemoryStream

--------------------
MemoryStream() : unit
MemoryStream(capacity: int) : unit
MemoryStream(buffer: byte []) : unit
MemoryStream(buffer: byte [], writable: bool) : unit
MemoryStream(buffer: byte [], index: int, count: int) : unit
MemoryStream(buffer: byte [], index: int, count: int, writable: bool) : unit
MemoryStream(buffer: byte [], index: int, count: int, writable: bool, publiclyVisible: bool) : unit
BinaryFormatter.Serialize(serializationStream: Stream, graph: obj) : unit
BinaryFormatter.Serialize(serializationStream: Stream, graph: obj, headers: Runtime.Remoting.Messaging.Header []) : unit
Multiple items
type SerializationException =
  inherit SystemException
  new : unit -> SerializationException + 2 overloads

Full name: System.Runtime.Serialization.SerializationException

--------------------
SerializationException() : unit
SerializationException(message: string) : unit
SerializationException(message: string, innerException: exn) : unit
val e : SerializationException
property SeqStream.Empty: SeqStream


 An empty SeqStream.
member SeqStream.Cast : unit -> 'a (requires 'a : null)

Full name: Script.SeqStream.Cast


 Converts a SeqStream into an object.
BinaryFormatter.Deserialize(serializationStream: Stream) : obj
BinaryFormatter.Deserialize(serializationStream: Stream, handler: Runtime.Remoting.Messaging.HeaderHandler) : obj
val e : exn
member SeqStream.GetEnumerator : unit -> IEnumerator<byte>

Full name: Script.SeqStream.GetEnumerator


 Gets the enumerator for the SeqStream.
member SeqStream.TransferTo : stream:Stream -> unit

Full name: Script.SeqStream.TransferTo


 Transfers the bytes of the SeqStream into the specified stream
val iter : action:('T -> unit) -> source:seq<'T> -> unit

Full name: Microsoft.FSharp.Collections.Seq.iter
val x : byte
Stream.WriteByte(value: byte) : unit

More information

Link:http://fssnip.net/1s
Posted:13 years ago
Author:Ryan Riley
Tags: sequence , stream