Nullable.fs 8.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
// Copyright (c) Microsoft Corporation.  All Rights Reserved.  See License.txt in the project root for license information.

namespace Microsoft.FSharp.Linq

#nowarn "1204"

open System
open Microsoft.FSharp.Core
open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators

module NullableOperators =
D
Don Syme 已提交
12 13
    let (?>=) (x: Nullable<'T>) (y: 'T) =
        x.HasValue && x.Value >= y
14

D
Don Syme 已提交
15 16
    let (?>) (x: Nullable<'T>) (y: 'T) =
        x.HasValue && x.Value > y
17

D
Don Syme 已提交
18 19
    let (?<=) (x: Nullable<'T>) (y: 'T) =
        x.HasValue && x.Value <= y
20

D
Don Syme 已提交
21 22 23 24 25
    let (?<) (x: Nullable<'T>) (y: 'T) =
        x.HasValue && x.Value < y

    let (?=) (x: Nullable<'T>) (y: 'T) =
        x.HasValue && x.Value = y
26

D
Don Syme 已提交
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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
    let (?<>) (x: Nullable<'T>) (y: 'T) =
        not (x ?= y)

    let (>=?) (x: 'T) (y: Nullable<'T>) =
        y.HasValue && x >= y.Value

    let (>?) (x: 'T) (y: Nullable<'T>) =
        y.HasValue && x > y.Value

    let (<=?) (x: 'T) (y: Nullable<'T>) =
        y.HasValue && x <= y.Value

    let (<?) (x: 'T) (y: Nullable<'T>) =
        y.HasValue && x < y.Value

    let (=?) (x: 'T) (y: Nullable<'T>) =
        y.HasValue && x = y.Value

    let (<>?) (x: 'T) (y: Nullable<'T>) =
        not (x =? y)

    let (?>=?) (x: Nullable<'T>) (y: Nullable<'T>) =
        (x.HasValue && y.HasValue && x.Value >= y.Value)

    let (?>?) (x: Nullable<'T>) (y: Nullable<'T>) =
        (x.HasValue && y.HasValue && x.Value > y.Value)

    let (?<=?) (x: Nullable<'T>) (y: Nullable<'T>) =
        (x.HasValue && y.HasValue && x.Value <= y.Value)

    let (?<?) (x: Nullable<'T>) (y: Nullable<'T>) =
        (x.HasValue && y.HasValue && x.Value < y.Value)

    let (?=?) (x: Nullable<'T>) (y: Nullable<'T>) =
        (not x.HasValue && not y.HasValue)
        || (x.HasValue && y.HasValue && x.Value = y.Value)

    let (?<>?) (x: Nullable<'T>) (y: Nullable<'T>) =
        not (x ?=? y)

    let inline (?+) (x: Nullable<_>) y =
        if x.HasValue then
            Nullable(x.Value + y)
        else
            Nullable()

    let inline (+?) x (y: Nullable<_>) =
        if y.HasValue then
            Nullable(x + y.Value)
        else
            Nullable()

    let inline (?+?) (x: Nullable<_>) (y: Nullable<_>) =
        if x.HasValue && y.HasValue then
            Nullable(x.Value + y.Value)
        else
            Nullable()

    let inline (?-) (x: Nullable<_>) y =
        if x.HasValue then
            Nullable(x.Value - y)
        else
            Nullable()

    let inline (-?) x (y: Nullable<_>) =
        if y.HasValue then
            Nullable(x - y.Value)
        else
            Nullable()

    let inline (?-?) (x: Nullable<_>) (y: Nullable<_>) =
        if x.HasValue && y.HasValue then
            Nullable(x.Value - y.Value)
        else
            Nullable()

    let inline (?*) (x: Nullable<_>) y =
        if x.HasValue then
            Nullable(x.Value * y)
        else
            Nullable()

    let inline ( *? ) x (y: Nullable<_>) =
        if y.HasValue then
            Nullable(x * y.Value)
        else
            Nullable()

    let inline (?*?) (x: Nullable<_>) (y: Nullable<_>) =
        if x.HasValue && y.HasValue then
            Nullable(x.Value * y.Value)
        else
            Nullable()

    let inline (?%) (x: Nullable<_>) y =
        if x.HasValue then
            Nullable(x.Value % y)
        else
            Nullable()

    let inline (%?) x (y: Nullable<_>) =
        if y.HasValue then
            Nullable(x % y.Value)
        else
            Nullable()

    let inline (?%?) (x: Nullable<_>) (y: Nullable<_>) =
        if x.HasValue && y.HasValue then
            Nullable(x.Value % y.Value)
        else
            Nullable()

    let inline (?/) (x: Nullable<_>) y =
        if x.HasValue then
            Nullable(x.Value / y)
        else
            Nullable()

    let inline (/?) x (y: Nullable<_>) =
        if y.HasValue then
            Nullable(x / y.Value)
        else
            Nullable()

    let inline (?/?) (x: Nullable<_>) (y: Nullable<_>) =
        if x.HasValue && y.HasValue then
            Nullable(x.Value / y.Value)
        else
            Nullable()
156 157 158 159 160

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
[<RequireQualifiedAccess>]
module Nullable =
    [<CompiledName("ToUInt8")>]
D
Don Syme 已提交
161 162 163 164 165
    let inline uint8 (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.byte value.Value)
        else
            Nullable()
166 167

    [<CompiledName("ToInt8")>]
D
Don Syme 已提交
168 169 170 171 172
    let inline int8 (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.sbyte value.Value)
        else
            Nullable()
173 174

    [<CompiledName("ToByte")>]
D
Don Syme 已提交
175 176 177 178 179
    let inline byte (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.byte value.Value)
        else
            Nullable()
180 181

    [<CompiledName("ToSByte")>]
D
Don Syme 已提交
182 183 184 185 186
    let inline sbyte (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.sbyte value.Value)
        else
            Nullable()
187 188

    [<CompiledName("ToInt16")>]
D
Don Syme 已提交
189 190 191 192 193
    let inline int16 (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.int16 value.Value)
        else
            Nullable()
194 195

    [<CompiledName("ToUInt16")>]
D
Don Syme 已提交
196 197 198 199 200
    let inline uint16 (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.uint16 value.Value)
        else
            Nullable()
201 202

    [<CompiledName("ToInt")>]
D
Don Syme 已提交
203 204 205 206 207
    let inline int (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.int value.Value)
        else
            Nullable()
208

209
    [<CompiledName("ToUInt")>]
D
Don Syme 已提交
210 211 212 213 214 215
    let inline uint (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.uint value.Value)
        else
            Nullable()

216
    [<CompiledName("ToEnum")>]
D
Don Syme 已提交
217 218 219 220 221
    let inline enum (value: Nullable<int32>) =
        if value.HasValue then
            Nullable(Operators.enum value.Value)
        else
            Nullable()
222 223

    [<CompiledName("ToInt32")>]
D
Don Syme 已提交
224 225 226 227 228
    let inline int32 (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.int32 value.Value)
        else
            Nullable()
229 230

    [<CompiledName("ToUInt32")>]
D
Don Syme 已提交
231 232 233 234 235
    let inline uint32 (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.uint32 value.Value)
        else
            Nullable()
236 237

    [<CompiledName("ToInt64")>]
D
Don Syme 已提交
238 239 240 241 242
    let inline int64 (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.int64 value.Value)
        else
            Nullable()
243 244

    [<CompiledName("ToUInt64")>]
D
Don Syme 已提交
245 246 247 248 249
    let inline uint64 (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.uint64 value.Value)
        else
            Nullable()
250 251

    [<CompiledName("ToFloat32")>]
D
Don Syme 已提交
252 253 254 255 256
    let inline float32 (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.float32 value.Value)
        else
            Nullable()
257 258

    [<CompiledName("ToFloat")>]
D
Don Syme 已提交
259 260 261 262 263
    let inline float (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.float value.Value)
        else
            Nullable()
264 265

    [<CompiledName("ToSingle")>]
D
Don Syme 已提交
266 267 268 269 270
    let inline single (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.float32 value.Value)
        else
            Nullable()
271 272

    [<CompiledName("ToDouble")>]
D
Don Syme 已提交
273 274 275 276 277
    let inline double (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.float value.Value)
        else
            Nullable()
278 279

    [<CompiledName("ToIntPtr")>]
D
Don Syme 已提交
280 281 282 283 284
    let inline nativeint (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.nativeint value.Value)
        else
            Nullable()
285 286

    [<CompiledName("ToUIntPtr")>]
D
Don Syme 已提交
287 288 289 290 291
    let inline unativeint (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.unativeint value.Value)
        else
            Nullable()
292 293

    [<CompiledName("ToDecimal")>]
D
Don Syme 已提交
294 295 296 297 298
    let inline decimal (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.decimal value.Value)
        else
            Nullable()
299 300

    [<CompiledName("ToChar")>]
D
Don Syme 已提交
301 302 303 304 305
    let inline char (value: Nullable<_>) =
        if value.HasValue then
            Nullable(Operators.char value.Value)
        else
            Nullable()