Advertisement
Guest User

Untitled

a guest
Mar 13th, 2014
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 6.08 KB | None | 0 0
  1. namespace Circuit
  2.  
  3. open System
  4. open System.Xml
  5. open UnityEngine
  6. open UnityEditor
  7. open Utils
  8.  
  9. module SlotMode =
  10.   type T
  11.     = In
  12.     | Out
  13.    
  14.   let In = T.In
  15.   let Out = T.Out
  16.  
  17.   let GetName s =
  18.     match s with
  19.     | In -> "In"
  20.     | Out -> "Out"
  21.  
  22.   let GetValue s =
  23.     match s with
  24.     | "In" -> In
  25.     | _ -> Out
  26.  
  27. type DataType = {
  28.   Id : Guid
  29.   Name : string
  30.   Color : Color
  31. }
  32.  
  33. and Slot = {
  34.   Id : Guid
  35.   TypeId : Guid
  36.   LinkId : Guid
  37.   Name : string
  38.   Mode : SlotMode.T
  39. } with
  40.   member x.AllowMultiple =
  41.     false
  42.  
  43. and NodeType = {
  44.   Id : Guid
  45.   Path : string
  46.   Color : Color
  47.   SlotsIn : Slot list
  48.   SlotsOut : Slot list
  49.   AttributesType : Type
  50. } with
  51.   member x.Name =
  52.     x.Path.Split '/' |> Array.last
  53.  
  54.   member x.AllowData =
  55.     false
  56.  
  57.   member x.HasGuid (id:Guid) =
  58.     let check (s:Slot) = s.Id = id
  59.     x.Id = id ||
  60.     x.SlotsIn |> List.exists check ||
  61.     x.SlotsOut |> List.exists check
  62.    
  63.   member x.HasSlot (s:Slot) =
  64.     let check (s':Slot) = s' = s
  65.     match s.Mode with
  66.     | SlotMode.In -> List.exists check x.SlotsIn
  67.     | SlotMode.Out -> List.exists check x.SlotsOut
  68.    
  69. and Node = {
  70.   Id : Guid
  71.   TypeId : Guid
  72.   Position : Vector2
  73.   SlotsIn : Slot list
  74.   SlotsOut : Slot list
  75.   Attributes : obj
  76. } with
  77.   member x.Enabled =
  78.     true
  79.  
  80.   member x.HasGuid (id:Guid) =
  81.     let check (s:Slot) = s.Id = id
  82.     x.Id = id ||
  83.     x.TypeId = id ||
  84.     x.SlotsIn |> List.exists check ||
  85.     x.SlotsOut |> List.exists check  
  86.  
  87. and LinkType = {
  88.   Id : Guid
  89.   Name : string
  90.   Color : Color
  91. } with
  92.   member x.AllowData =
  93.     false
  94.  
  95. and Link = {
  96.   Id : Guid
  97.   TypeId : Guid
  98.   SourceId : Guid
  99.   SourceSlotId : Guid
  100.   TargetId : Guid
  101.   TargetSlotId : Guid
  102. } with
  103.   member x.Enabled =
  104.     true
  105.  
  106.   member x.HasGuid (id:Guid) =
  107.     x.Id = id ||
  108.     x.TypeId = id ||
  109.     x.SourceId = id ||
  110.     x.SourceSlotId = id ||
  111.     x.TargetId = id ||
  112.     x.TargetSlotId = id
  113.  
  114. and Context = {
  115.   Id : Guid
  116.   Name : string
  117.   DataTypes : Map<Guid, DataType>
  118.   NodeTypes : Map<Guid, NodeType>
  119.   LinkTypes : Map<Guid, LinkType>
  120. } with
  121.   member x.HasGuid (id:Guid) =
  122.     x.Id = id ||
  123.     x.DataTypes.ContainsKey id ||
  124.     x.LinkTypes.ContainsKey id ||
  125.     x.NodeTypes |> Map.exists (fun _ n -> n.HasGuid id)
  126.  
  127.   member x.DataTypesSeq = seq { for kvp in x.DataTypes do yield kvp.Value }
  128.   member x.NodeTypesSeq = seq { for kvp in x.NodeTypes do yield kvp.Value }
  129.   member x.LinkTypesSeq = seq { for kvp in x.LinkTypes do yield kvp.Value }
  130.  
  131.   member x.HasDataType (dt:DataType) = x.DataTypes.ContainsKey(dt.Id) && x.DataTypes.[dt.Id] = dt
  132.   member x.HasNodeType (nt:NodeType) = x.NodeTypes.ContainsKey(nt.Id) && x.NodeTypes.[nt.Id] = nt
  133.   member x.HasLinkType (lt:LinkType) = x.LinkTypes.ContainsKey(lt.Id) && x.LinkTypes.[lt.Id] = lt
  134.  
  135.   member x.FindDataType (id:Guid) = Map.find id x.DataTypes
  136.   member x.FindNodeType (id:Guid) = Map.find id x.NodeTypes
  137.   member x.FindLinkType (id:Guid) = Map.find id x.LinkTypes
  138.  
  139.   member x.FindDataType (name:string) = Map.pick (fun _ (dt:DataType) -> if dt.Name = name then Some dt else None) x.DataTypes
  140.   member x.FindNodeType (name:string) = Map.pick (fun _ (nt:NodeType) -> if nt.Name = name then Some nt else None) x.NodeTypes
  141.   member x.FindLinkType (name:string) = Map.pick (fun _ (lt:LinkType) -> if lt.Name = name then Some lt else None) x.LinkTypes
  142.  
  143.   member x.VerifyGuidIsAvailable (id:Guid) = if x.HasGuid id then failwith "GUID already in use"
  144.   member x.VerifyHasDataType (dt:DataType) = if not (x.HasDataType dt) then failwith "DataType does not exist in context"
  145.   member x.VerifyHasNodeType (nt:NodeType) = if not (x.HasNodeType nt) then failwith "NodeType does not exist in context"
  146.   member x.VerifyHasLinkType (lt:LinkType) = if not (x.HasLinkType lt) then failwith "LinkType does not exist in context"
  147.  
  148.   member x.CreateCanvas (id:Guid, name:string) =
  149.     x.VerifyGuidIsAvailable id
  150.    
  151.     {
  152.       Id = id
  153.       Name = name
  154.       Context = x
  155.       Links = Map.empty
  156.       Nodes = Map.empty
  157.     }
  158.  
  159. and Canvas = {
  160.   Id : Guid
  161.   Context : Context
  162.   Name : string
  163.   Nodes : Map<Guid, Node>
  164.   Links : Map<Guid, Link>
  165. } with
  166.   member x.HasGuid (id:Guid) =  
  167.     x.Id = id ||
  168.     x.Nodes |> Map.exists (fun _ n -> n.HasGuid id) ||
  169.     x.Links |> Map.exists (fun _ l -> l.HasGuid id) ||
  170.     x.Context.HasGuid id
  171.  
  172.   member x.NodesSeq = seq { for kvp in x.Nodes do yield kvp.Value }
  173.   member x.LinksSeq = seq { for kvp in x.Links do yield kvp.Value }
  174.  
  175.   member x.HasNode (n:Node) = x.Nodes.ContainsKey n.Id && x.Nodes.[n.Id] = n
  176.   member x.HasLink (l:Link) = x.Links.ContainsKey l.Id && x.Links.[l.Id] = l
  177.  
  178.   member x.FindNode (id:Guid) = x.Nodes.[id]
  179.   member x.FindLink (id:Guid) = x.Links.[id]
  180.  
  181.   member x.VerifyGuidIsAvailable (id:Guid) = if x.HasGuid id then failwith "GUID already in use"
  182.   member x.VerifyHasNode (n:Node) = if not (x.HasNode n) then failwith "Node does not exist in canvas"
  183.   member x.VerifyHasLink (l:Link) = if not (x.HasLink l) then failwith "Link does not exist in canvas"
  184.   member x.VerifyNodeHasSlot (n:Node) (s:Slot) = if not (x.NodeHasSlot(n, s)) then failwith "Slot does not exist on node"
  185.  
  186.   member x.NodeHasLink (n:Node, s:Slot) =
  187.     x.VerifyHasNode n
  188.     x.VerifyNodeHasSlot n s
  189.  
  190.     match s.Mode with
  191.     | SlotMode.In -> Map.exists (fun k l -> l.TargetId = n.Id && l.TargetSlotId = s.Id) x.Links
  192.     | SlotMode.Out -> Map.exists (fun k l -> l.SourceId = n.Id && l.SourceSlotId = s.Id) x.Links
  193.  
  194.   member x.NodeHasSlot (n:Node, s:Slot) =
  195.     x.VerifyHasNode n
  196.  
  197.     let nt = x.Context.FindNodeType n.TypeId
  198.     match nt.HasSlot s, s.Mode with
  199.     | true , _   -> true
  200.     | false, SlotMode.In  -> n.SlotsIn |> List.existsItem s
  201.     | false, SlotMode.Out -> n.SlotsOut |> List.existsItem s
  202.  
  203.   member x.NodeSlotList (n:Node) =
  204.     let cx = x.Context
  205.     let nt = cx.FindNodeType n.TypeId
  206.  
  207.     seq {
  208.       yield! nt.SlotsIn
  209.       yield! n.SlotsIn
  210.       yield! nt.SlotsOut
  211.       yield! n.SlotsOut  
  212.     }
  213.  
  214.   member x.NodeFindSlot (n:Node, id:Guid) =
  215.     x.NodeSlotList(n) |> Seq.find (fun s -> s.Id = id)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement