Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.40 KB | None | 0 0
  1. module Collections =
  2.  
  3.   //----------------------------------------------------------------------------
  4.   type CopyOnWriteArray<'a>(storage:'a array) =
  5.     member x.Length = storage.Length
  6.     member x.Item index = storage.[index]
  7.    
  8.     new (size:int) =
  9.       CopyOnWriteArray(Array.zeroCreate size)
  10.  
  11.     member x.SetValue(index, value) =
  12.       let size = if index >= storage.Length then index+1 else storage.Length
  13.       let copy = Array.zeroCreate size
  14.       System.Array.Copy(storage, copy, storage.Length)
  15.       copy.[index] <- value
  16.       CopyOnWriteArray<'a> copy
  17.  
  18.     member x.Tail =
  19.       if storage.Length = 0 then None
  20.       else
  21.         let size = storage.Length - 1
  22.         let copy = Array.zeroCreate size
  23.         System.Array.Copy(storage, 1, copy, 0, size)
  24.         Some(CopyOnWriteArray<'a> copy)
  25.        
  26.     member x.Head = if storage.Length = 0 then None else Some(storage.[0])
  27.     member x.Match = x.Head, x.Tail
  28.     member x.Append value = x.SetValue(storage.Length, value)
  29.     member x.Cons value =
  30.       let size = storage.Length + 1
  31.       let copy = Array.zeroCreate size
  32.       copy.[0] <- value
  33.       System.Array.Copy(storage, 0, copy, 1, storage.Length)
  34.       CopyOnWriteArray<'a> copy
  35.  
  36.     interface System.Collections.Generic.IEnumerable<'a> with
  37.       member x.GetEnumerator() = storage.GetEnumerator()
  38.       member x.GetEnumerator() =
  39.         (seq{for a in storage do yield a}).GetEnumerator()
  40.        
  41.   //----------------------------------------------------------------------------
  42.   module Operators =
  43.  
  44.     let (+<) value (array:CopyOnWriteArray<_>) = array.Cons value
  45.     let (>+) (array:CopyOnWriteArray<_>) value = array.Append value
  46.  
  47.   //----------------------------------------------------------------------------
  48.   module Operations =
  49.  
  50.     module CopyOnWriteArray =
  51.  
  52.       let zeroCreate<'a> (size:int) = CopyOnWriteArray<'a> size
  53.       let length (array:CopyOnWriteArray<_>) = array.Length
  54.       let head (array:CopyOnWriteArray<_>) = array.Head
  55.       let tail (array:CopyOnWriteArray<_>) = array.Tail
  56.       let append value (array:CopyOnWriteArray<_>) = array.Append value
  57.       let get index (array:CopyOnWriteArray<_>) = array.[index]
  58.       let set index value (array:CopyOnWriteArray<_>) =
  59.         array.SetValue(index, value)
  60.  
  61.       let (|Head|_|) (array:CopyOnWriteArray<_>) = array.Head
  62.       let (|Tail|_|) (array:CopyOnWriteArray<_>) = array.Tail
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement