Skip to content

Implemented functions for maps and sets #5

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Mar 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard1.6;netstandard2.0</TargetFrameworks>
<TargetFramework>netstandard2.0</TargetFramework>
<Description>F# bindings for System.Collections.Immutable</Description>
<Copyright>Copyright © XperiAndri 2016</Copyright>
<AssemblyTitle>FSharp.Collections.Immutable</AssemblyTitle>
Expand All @@ -27,13 +27,8 @@
<Compile Include="sets.fs" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)'=='netstandard1.6'">
<PackageReference Update="FSharp.Core" Version="4.6.2" />
<PackageReference Update="System.ValueTuple" Version="4.5.0" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Collections.Immutable" Version="1.7.0" />
<PackageReference Include="System.Collections.Immutable" Version="5.0.0" />
</ItemGroup>

</Project>
63 changes: 33 additions & 30 deletions src/FSharp.Collections.Immutable/flat-list.fs
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ module FlatList =
////////// Building //////////

let moveFromBuilder (builder : FlatList<_>.Builder) : FlatList<_> =
checkNotNull "builder" builder
checkNotNull (nameof builder) builder
builder.MoveToImmutable()
let ofBuilder (builder : FlatList<_>.Builder) : FlatList<_> =
checkNotNull "builder" builder
checkNotNull (nameof builder) builder
builder.ToImmutable()

let builder () : FlatList<'T>.Builder = FlatListFactory.CreateBuilder()
Expand All @@ -35,7 +35,7 @@ module FlatList =
let inline internal checkNotDefault argName (list : FlatList<'T>) =
if list.IsDefault then invalidArg argName "Uninstantiated ImmutableArray/FlatList"

let inline internal check (list : FlatList<'T>) = checkNotDefault "list" list
let inline internal check (list : FlatList<'T>) = checkNotDefault (nameof list) list

let inline internal indexNotFound() = raise (System.Collections.Generic.KeyNotFoundException())

Expand All @@ -44,8 +44,8 @@ module FlatList =
let item index list = check list; list.[index]

let append list1 list2 : FlatList<'T> =
checkNotDefault "list1" list1
checkNotDefault "list2" list2
checkNotDefault (nameof list1) list1
checkNotDefault (nameof list2) list2
list1.AddRange(list2 : FlatList<_>)

/// Searches for the specified object and returns the zero-based index of the first occurrence within the range
Expand Down Expand Up @@ -107,7 +107,7 @@ module FlatList =
let removeRange index (count: int) list: FlatList<_> = check list; list.RemoveRange(index, count)

let blit source sourceIndex (destination: 'T[]) destinationIndex count =
checkNotDefault "source" source
checkNotDefault (nameof source) source
try
source.CopyTo(sourceIndex, destination, destinationIndex, count)
with
Expand All @@ -130,14 +130,14 @@ module FlatList =
let inline private builderWithLengthOf list = builderWith <| length list

module Builder =
let inline private check (builder: FlatList<'T>.Builder) = checkNotNull "builder" builder
let inline private check (builder: FlatList<'T>.Builder) = checkNotNull (nameof builder) builder

let add item builder = check builder; builder.Add(item)

////////// Loop-based //////////

let init count initializer =
if count < 0 then invalidArg "count" ErrorStrings.InputMustBeNonNegative
if count < 0 then invalidArg (nameof count) ErrorStrings.InputMustBeNonNegative
let builder = builderWith count
for i = 0 to count - 1 do
builder.Add <| initializer i
Expand Down Expand Up @@ -191,11 +191,11 @@ module FlatList =
action list.[i]

let iter2 action list1 list2 =
checkNotDefault "list1" list1
checkNotDefault "list2" list2
checkNotDefault (nameof list1) list1
checkNotDefault (nameof list2) list2
let f = OptimizedClosures.FSharpFunc<'T,'U, unit>.Adapt(action)
let len = length list1
if len <> length list2 then invalidArg "list2" ErrorStrings.ListsHaveDifferentLengths
if len <> length list2 then invalidArg (nameof list2) ErrorStrings.ListsHaveDifferentLengths
for i = 0 to len - 1 do
f.Invoke(list1.[i], list2.[i])

Expand All @@ -213,34 +213,37 @@ module FlatList =
ofBuilder builder

let map2 mapping list1 list2 =
checkNotDefault "list1" list1
checkNotDefault "list2" list2
checkNotDefault (nameof list1) list1
checkNotDefault (nameof list2) list2
let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(mapping)
let len1 = list1.Length
if len1 <> list2.Length then invalidArg "list2" ErrorStrings.ListsHaveDifferentLengths
if len1 <> list2.Length then invalidArg (nameof list2) ErrorStrings.ListsHaveDifferentLengths
let res = builderWith len1
for i = 0 to len1 - 1 do
res.Add <| f.Invoke(list1.[i], list2.[i])
moveFromBuilder res

let map3 mapping list1 list2 list3 =
checkNotDefault "list1" list1
checkNotDefault "list2" list2
checkNotDefault "list3" list3
checkNotDefault (nameof list1) list1
checkNotDefault (nameof list2) list2
checkNotDefault (nameof list3) list3
let f = OptimizedClosures.FSharpFunc<_,_,_,_>.Adapt(mapping)
let len1 = list1.Length
if not (len1 = list2.Length && len1 = list3.Length) then invalidArg "" ErrorStrings.ListsHaveDifferentLengths
if not (len1 = list2.Length)
then invalidArg (nameof list2) ErrorStrings.ListsHaveDifferentLengths
if not (len1 = list3.Length)
then invalidArg (nameof list3) ErrorStrings.ListsHaveDifferentLengths

let res = builderWith len1
for i = 0 to len1 - 1 do
res.Add <| f.Invoke(list1.[i], list2.[i], list3.[i])
moveFromBuilder res
let mapi2 mapping list1 list2 =
checkNotDefault "list1" list1
checkNotDefault "list2" list2
checkNotDefault (nameof list1) list1
checkNotDefault (nameof list2) list2
let f = OptimizedClosures.FSharpFunc<_,_,_,_>.Adapt(mapping)
let len1 = list1.Length
if len1 <> list2.Length then invalidArg "list2" ErrorStrings.ListsHaveDifferentLengths
if len1 <> list2.Length then invalidArg (nameof list2) ErrorStrings.ListsHaveDifferentLengths
let res = builderWith len1
for i = 0 to len1 - 1 do
res.Add <| f.Invoke(i,list1.[i], list2.[i])
Expand All @@ -254,11 +257,11 @@ module FlatList =
f.Invoke(i, list.[i])

let iteri2 action list1 list2 =
checkNotDefault "list1" list1
checkNotDefault "list2" list2
checkNotDefault (nameof list1) list1
checkNotDefault (nameof list2) list2
let f = OptimizedClosures.FSharpFunc<_,_,_,_>.Adapt(action)
let len1 = list1.Length
if len1 <> list2.Length then invalidArg "list2" ErrorStrings.ListsHaveDifferentLengths
if len1 <> list2.Length then invalidArg (nameof list2) ErrorStrings.ListsHaveDifferentLengths
for i = 0 to len1 - 1 do
f.Invoke(i,list1.[i], list2.[i])

Expand Down Expand Up @@ -287,11 +290,11 @@ module FlatList =
state

let exists2 predicate list1 list2 =
checkNotDefault "list1" list1
checkNotDefault "list2" list2
checkNotDefault (nameof list1) list1
checkNotDefault (nameof list2) list2
let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(predicate)
let len1 = list1.Length
if len1 <> list2.Length then invalidArg "list2" ErrorStrings.ListsHaveDifferentLengths
if len1 <> list2.Length then invalidArg (nameof list2) ErrorStrings.ListsHaveDifferentLengths
let rec loop i = i < len1 && (f.Invoke(list1.[i], list2.[i]) || loop (i+1))
loop 0

Expand All @@ -302,11 +305,11 @@ module FlatList =
loop 0

let forall2 predicate list1 list2 =
checkNotDefault "list1" list1
checkNotDefault "list2" list2
checkNotDefault (nameof list1) list1
checkNotDefault (nameof list2) list2
let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(predicate)
let len1 = list1.Length
if len1 <> list2.Length then invalidArg "list2" ErrorStrings.ListsHaveDifferentLengths
if len1 <> list2.Length then invalidArg (nameof list2) ErrorStrings.ListsHaveDifferentLengths
let rec loop i = i >= len1 || (f.Invoke(list1.[i], list2.[i]) && loop (i+1))
loop 0

Expand Down
10 changes: 5 additions & 5 deletions src/FSharp.Collections.Immutable/immutable-list.fs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#if INTERACTIVE
#if INTERACTIVE
namespace global
#else
namespace FSharp.Collections.Immutable
Expand All @@ -11,13 +11,13 @@ module ImmutableList =

////////// Factory //////////

let inline internal check (list: IImmutableList<_>) = checkNotNull "list" list
let inline internal check (list: IImmutableList<_>) = checkNotNull (nameof list) list

let inline empty<'T> = ImmutableList.Create<'T>()

let inline singleton<'T> (item : 'T) : ImmutableList<'T> = ImmutableList.Create<'T> (item)

let inline ofSeq (seq : 'T seq) = checkNotNull "seq" seq; ImmutableList.CreateRange seq
let inline ofSeq (seq : 'T seq) = checkNotNull (nameof seq) seq; ImmutableList.CreateRange seq

let inline ofBuilder (builder : ImmutableList<_>.Builder) = builder.ToImmutable()

Expand Down Expand Up @@ -183,7 +183,7 @@ module ImmutableList =
////////// Loop-based //////////

let concat lists =
checkNotNull "lists" lists
checkNotNull (nameof lists) lists
build <| fun result ->
for list in lists do
result.AddRange list
Expand Down Expand Up @@ -283,7 +283,7 @@ module ImmutableList =
let forall predicate list = check list; Seq.forall predicate list

let forall2 predicate (list1: IImmutableList<_>) (list2: IImmutableList<_>) =
checkNotNull "list1" list1; checkNotNull "list2" list2
checkNotNull (nameof list1) list1; checkNotNull (nameof list2) list2
Seq.forall2 predicate list1 list2

let iter action list = check list; Seq.iter action list
Expand Down
2 changes: 1 addition & 1 deletion src/FSharp.Collections.Immutable/indexed-seq.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
type IIndexedSeq<'T> = System.Collections.Generic.IReadOnlyList<'T>

module IndexedSeq =
let check (seq: IIndexedSeq<_>) = checkNotNull "seq" seq
let check (seq: IIndexedSeq<_>) = checkNotNull (nameof seq) seq
let item index seq = check seq; seq.[index]
let length seq = check seq; seq.Count

Expand Down
Loading