Advertisement
Guest User

Untitled

a guest
May 24th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.04 KB | None | 0 0
  1. [<DomainType>]
  2. type Thing<'a> = { value : 'a; name : string }
  3.  
  4.  
  5. [<AutoOpen>]
  6. module Mutable =
  7.     [<AbstractClass>]
  8.     type MThing<'ma>() =
  9.        abstract member value: 'ma
  10.         abstract member name : IMod<string>
  11.  
  12.     type private MThingV<'a>(__initial : Thing<'a>) =
  13.         inherit MThing<IMod<'a>>()
  14.  
  15.        let mutable __current = __initial
  16.  
  17.        let _value = ResetMod(__initial.value)
  18.        let _name = ResetMod(__initial.name)
  19.  
  20.        override x.value = _value :> IMod<_>
  21.        override x.name = _name :> IMod<_>
  22.  
  23.        member x.Update(v : Thing<'a>) =
  24.             if not (System.Object.ReferenceEquals(__current, v)) then
  25.                 __current <- v
  26.                 _value.Update(v.value)
  27.                 _name.Update(v.name)
  28.  
  29.         interface IUpdatable<Thing<'a>> with
  30.            member x.Update v = x.Update v
  31.  
  32.    type private MThingD<'a, 'ma>(__initial : Thing<'a>, init : 'a -> 'ma, update : 'ma * 'a -> unit) =
  33.         inherit MThing<'ma>()
  34.  
  35.        let mutable __current = __initial
  36.  
  37.        let _value = init(__initial.value)
  38.        let _name = ResetMod(__initial.name)
  39.  
  40.        override x.value = _value
  41.        override x.name = _name :> IMod<_>
  42.  
  43.        member x.Update(v : Thing<'a>) =
  44.             if not (System.Object.ReferenceEquals(__current, v)) then
  45.                 __current <- v
  46.                 update(_value, v.value)
  47.                 _name.Update(v.name)
  48.  
  49.         interface IUpdatable<Thing<'a>> with
  50.            member x.Update v = x.Update v
  51.  
  52.    [<AbstractClass; Sealed; Extension>]
  53.    type MThing private() =
  54.        static member CreateV(v : Thing<'a>) =
  55.             MThingV<'a>(v) :> MThing<_>
  56.  
  57.        static member CreateD(v : Thing<'a>, init : 'a -> 'ma, update : 'ma * 'a -> unit) =
  58.             MThingD(v, init, update) :> MThing<_>
  59.        
  60.         [<Extension>]
  61.         static member Update(m : MThing<'ma>, v : Thing<'a>) =
  62.             match m :> obj with    
  63.                 | :? IUpdatable<Thing<'a>> as m -> m.Update(v)
  64.                | _ -> failwith "asdasds"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement