Math.NET Numerics
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

68 lines
3.0 KiB

// (c) Microsoft Corporation 2005-2009.
#if INTERNALIZED_POWER_PACK
namespace Internal.Utilities
#else
namespace Microsoft.FSharp.Compatibility
#endif
open Microsoft.FSharp.Core
open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators
open Microsoft.FSharp.Core.Operators
open System.Collections.Generic
#if INTERNALIZED_POWER_PACK
type TaggedMap<'Key,'Value,'Tag when 'Tag :> IComparer<'Key> > = Internal.Utilities.Collections.Tagged.Map<'Key,'Value,'Tag>
type TaggedMap<'Key,'Value> = Internal.Utilities.Collections.Tagged.Map<'Key,'Value>
#else
type TaggedMap<'Key,'Value,'Tag when 'Tag :> IComparer<'Key> > = Microsoft.FSharp.Collections.Tagged.Map<'Key,'Value,'Tag>
type TaggedMap<'Key,'Value> = Microsoft.FSharp.Collections.Tagged.Map<'Key,'Value>
#endif
module Map =
/// For use when not opening the Map module, e.g. Map.t
type ('Key,'Value) t = Microsoft.FSharp.Collections.Map<'Key,'Value>
// Fold, right-to-left.
//
// NOTE: This matches OCaml behaviour
// However it differs from the behaviour of Set.fold which folds left-to-right.
//
let fold f (m:Map<_,_>) z =
Map.foldBack f m z
type Provider<'Key,'T,'Tag> when 'Tag :> IComparer<'Key> =
interface
abstract empty: TaggedMap<'Key,'T,'Tag>;
abstract add: 'Key -> 'T -> TaggedMap<'Key,'T,'Tag> -> TaggedMap<'Key,'T,'Tag>;
abstract find: 'Key -> TaggedMap<'Key,'T,'Tag> -> 'T;
abstract first: ('Key -> 'T -> 'U option) -> TaggedMap<'Key,'T,'Tag> -> 'U option;
abstract tryfind: 'Key -> TaggedMap<'Key,'T,'Tag> -> 'T option;
abstract remove: 'Key -> TaggedMap<'Key,'T,'Tag> -> TaggedMap<'Key,'T,'Tag>;
abstract mem: 'Key -> TaggedMap<'Key,'T,'Tag> -> bool;
abstract iter: ('Key -> 'T -> unit) -> TaggedMap<'Key,'T,'Tag> -> unit;
abstract map: ('T -> 'U) -> TaggedMap<'Key,'T,'Tag> -> TaggedMap<'Key,'U,'Tag>;
abstract mapi: ('Key -> 'T -> 'U) -> TaggedMap<'Key,'T,'Tag> -> TaggedMap<'Key,'U,'Tag>;
abstract fold: ('Key -> 'T -> 'State -> 'State) -> TaggedMap<'Key,'T,'Tag> -> 'State -> 'State
end
let MakeTagged (cf : 'Tag) : Provider<'Key,'Value,'Tag> when 'Tag :> IComparer<'Key> =
{ new Provider<_,_,_> with
member p.empty = TaggedMap<_,_,_>.Empty(cf);
member p.add k v m = m.Add(k,v);
member p.find x m = m.[x]
member p.first f m = m.First(f)
member p.tryfind k m = m.TryFind(k)
member p.remove x m = m.Remove(x)
member p.mem x m = m.ContainsKey(x)
member p.iter f m = m.Iterate(f)
member p.map f m = m.MapRange(f)
member p.mapi f m = m.Map(f)
member p.fold f m z = m.Fold f z }
type Provider<'Key,'Value> = Provider<'Key,'Value,IComparer<'Key>>
let Make cf = MakeTagged (ComparisonIdentity.FromFunction cf)