octane 0.13.4 → 0.14.0
raw patch · 41 files changed
+1058/−729 lines, 41 filesdep +data-default-classdep +overloaded-recordssetup-changedPVP ok
version bump matches the API change (PVP)
Dependencies added: data-default-class, overloaded-records
API changes (from Hackage documentation)
- Octane.Type.CompressedWord: [limit] :: CompressedWord -> Word
- Octane.Type.CompressedWord: [value] :: CompressedWord -> Word
+ Octane.Type.Boolean: [booleanUnpack] :: Boolean -> Bool
+ Octane.Type.Boolean: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.Boolean.Boolean GHC.Types.Bool
+ Octane.Type.Boolean: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.Boolean.Boolean Octane.Type.Boolean.Boolean GHC.Types.Bool GHC.Types.Bool
+ Octane.Type.Boolean: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Types.Bool cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Boolean.Boolean) GHC.Types.Bool
+ Octane.Type.Boolean: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Types.Bool cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Boolean.Boolean) (Data.OverloadedRecords.Rec cs0 Octane.Type.Boolean.Boolean) GHC.Types.Bool GHC.Types.Bool
+ Octane.Type.CacheItem: [cacheItemCacheId] :: CacheItem -> Word32
+ Octane.Type.CacheItem: [cacheItemClassId] :: CacheItem -> Word32
+ Octane.Type.CacheItem: [cacheItemParentCacheId] :: CacheItem -> Word32
+ Octane.Type.CacheItem: [cacheItemProperties] :: CacheItem -> List CacheProperty
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.HasField "cacheId" Octane.Type.CacheItem.CacheItem Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.HasField "classId" Octane.Type.CacheItem.CacheItem Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.HasField "parentCacheId" Octane.Type.CacheItem.CacheItem Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.HasField "properties" Octane.Type.CacheItem.CacheItem (Octane.Type.List.List Octane.Type.CacheProperty.CacheProperty)
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyField "cacheId" Octane.Type.CacheItem.CacheItem Octane.Type.CacheItem.CacheItem Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyField "classId" Octane.Type.CacheItem.CacheItem Octane.Type.CacheItem.CacheItem Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyField "parentCacheId" Octane.Type.CacheItem.CacheItem Octane.Type.CacheItem.CacheItem Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyField "properties" Octane.Type.CacheItem.CacheItem Octane.Type.CacheItem.CacheItem (Octane.Type.List.List Octane.Type.CacheProperty.CacheProperty) (Octane.Type.List.List Octane.Type.CacheProperty.CacheProperty)
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyRec "cacheId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "cacheId" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyRec "cacheId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "cacheId" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyRec "classId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "classId" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyRec "classId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "classId" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyRec "parentCacheId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "parentCacheId" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyRec "parentCacheId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "parentCacheId" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyRec "properties" (Octane.Type.List.List Octane.Type.CacheProperty.CacheProperty) cs0 => Data.OverloadedRecords.HasField "properties" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) (Octane.Type.List.List Octane.Type.CacheProperty.CacheProperty)
+ Octane.Type.CacheItem: instance Data.OverloadedRecords.ModifyRec "properties" (Octane.Type.List.List Octane.Type.CacheProperty.CacheProperty) cs0 => Data.OverloadedRecords.ModifyField "properties" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheItem.CacheItem) (Octane.Type.List.List Octane.Type.CacheProperty.CacheProperty) (Octane.Type.List.List Octane.Type.CacheProperty.CacheProperty)
+ Octane.Type.CacheProperty: [cachePropertyObjectId] :: CacheProperty -> Word32
+ Octane.Type.CacheProperty: [cachePropertyStreamId] :: CacheProperty -> Word32
+ Octane.Type.CacheProperty: instance Data.OverloadedRecords.HasField "objectId" Octane.Type.CacheProperty.CacheProperty Octane.Type.Word32.Word32
+ Octane.Type.CacheProperty: instance Data.OverloadedRecords.HasField "streamId" Octane.Type.CacheProperty.CacheProperty Octane.Type.Word32.Word32
+ Octane.Type.CacheProperty: instance Data.OverloadedRecords.ModifyField "objectId" Octane.Type.CacheProperty.CacheProperty Octane.Type.CacheProperty.CacheProperty Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.CacheProperty: instance Data.OverloadedRecords.ModifyField "streamId" Octane.Type.CacheProperty.CacheProperty Octane.Type.CacheProperty.CacheProperty Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.CacheProperty: instance Data.OverloadedRecords.ModifyRec "objectId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "objectId" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheProperty.CacheProperty) Octane.Type.Word32.Word32
+ Octane.Type.CacheProperty: instance Data.OverloadedRecords.ModifyRec "objectId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "objectId" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheProperty.CacheProperty) (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheProperty.CacheProperty) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.CacheProperty: instance Data.OverloadedRecords.ModifyRec "streamId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "streamId" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheProperty.CacheProperty) Octane.Type.Word32.Word32
+ Octane.Type.CacheProperty: instance Data.OverloadedRecords.ModifyRec "streamId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "streamId" (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheProperty.CacheProperty) (Data.OverloadedRecords.Rec cs0 Octane.Type.CacheProperty.CacheProperty) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.ClassItem: [classItemName] :: ClassItem -> Text
+ Octane.Type.ClassItem: [classItemStreamId] :: ClassItem -> Word32
+ Octane.Type.ClassItem: instance Data.OverloadedRecords.HasField "name" Octane.Type.ClassItem.ClassItem Octane.Type.Text.Text
+ Octane.Type.ClassItem: instance Data.OverloadedRecords.HasField "streamId" Octane.Type.ClassItem.ClassItem Octane.Type.Word32.Word32
+ Octane.Type.ClassItem: instance Data.OverloadedRecords.ModifyField "name" Octane.Type.ClassItem.ClassItem Octane.Type.ClassItem.ClassItem Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.ClassItem: instance Data.OverloadedRecords.ModifyField "streamId" Octane.Type.ClassItem.ClassItem Octane.Type.ClassItem.ClassItem Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.ClassItem: instance Data.OverloadedRecords.ModifyRec "name" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.HasField "name" (Data.OverloadedRecords.Rec cs0 Octane.Type.ClassItem.ClassItem) Octane.Type.Text.Text
+ Octane.Type.ClassItem: instance Data.OverloadedRecords.ModifyRec "name" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.ModifyField "name" (Data.OverloadedRecords.Rec cs0 Octane.Type.ClassItem.ClassItem) (Data.OverloadedRecords.Rec cs0 Octane.Type.ClassItem.ClassItem) Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.ClassItem: instance Data.OverloadedRecords.ModifyRec "streamId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "streamId" (Data.OverloadedRecords.Rec cs0 Octane.Type.ClassItem.ClassItem) Octane.Type.Word32.Word32
+ Octane.Type.ClassItem: instance Data.OverloadedRecords.ModifyRec "streamId" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "streamId" (Data.OverloadedRecords.Rec cs0 Octane.Type.ClassItem.ClassItem) (Data.OverloadedRecords.Rec cs0 Octane.Type.ClassItem.ClassItem) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.CompressedWord: [compressedWordLimit] :: CompressedWord -> Word
+ Octane.Type.CompressedWord: [compressedWordValue] :: CompressedWord -> Word
+ Octane.Type.CompressedWord: instance Data.OverloadedRecords.HasField "limit" Octane.Type.CompressedWord.CompressedWord GHC.Types.Word
+ Octane.Type.CompressedWord: instance Data.OverloadedRecords.HasField "value" Octane.Type.CompressedWord.CompressedWord GHC.Types.Word
+ Octane.Type.CompressedWord: instance Data.OverloadedRecords.ModifyField "limit" Octane.Type.CompressedWord.CompressedWord Octane.Type.CompressedWord.CompressedWord GHC.Types.Word GHC.Types.Word
+ Octane.Type.CompressedWord: instance Data.OverloadedRecords.ModifyField "value" Octane.Type.CompressedWord.CompressedWord Octane.Type.CompressedWord.CompressedWord GHC.Types.Word GHC.Types.Word
+ Octane.Type.CompressedWord: instance Data.OverloadedRecords.ModifyRec "limit" GHC.Types.Word cs0 => Data.OverloadedRecords.HasField "limit" (Data.OverloadedRecords.Rec cs0 Octane.Type.CompressedWord.CompressedWord) GHC.Types.Word
+ Octane.Type.CompressedWord: instance Data.OverloadedRecords.ModifyRec "limit" GHC.Types.Word cs0 => Data.OverloadedRecords.ModifyField "limit" (Data.OverloadedRecords.Rec cs0 Octane.Type.CompressedWord.CompressedWord) (Data.OverloadedRecords.Rec cs0 Octane.Type.CompressedWord.CompressedWord) GHC.Types.Word GHC.Types.Word
+ Octane.Type.CompressedWord: instance Data.OverloadedRecords.ModifyRec "value" GHC.Types.Word cs0 => Data.OverloadedRecords.HasField "value" (Data.OverloadedRecords.Rec cs0 Octane.Type.CompressedWord.CompressedWord) GHC.Types.Word
+ Octane.Type.CompressedWord: instance Data.OverloadedRecords.ModifyRec "value" GHC.Types.Word cs0 => Data.OverloadedRecords.ModifyField "value" (Data.OverloadedRecords.Rec cs0 Octane.Type.CompressedWord.CompressedWord) (Data.OverloadedRecords.Rec cs0 Octane.Type.CompressedWord.CompressedWord) GHC.Types.Word GHC.Types.Word
+ Octane.Type.Dictionary: [dictionaryUnpack] :: Dictionary a -> (Map Text a)
+ Octane.Type.Dictionary: instance Data.OverloadedRecords.HasField "unpack" (Octane.Type.Dictionary.Dictionary a0) (Data.Map.Base.Map Octane.Type.Text.Text a0)
+ Octane.Type.Dictionary: instance Data.OverloadedRecords.ModifyField "unpack" (Octane.Type.Dictionary.Dictionary a0) (Octane.Type.Dictionary.Dictionary a0) (Data.Map.Base.Map Octane.Type.Text.Text a0) (Data.Map.Base.Map Octane.Type.Text.Text a0)
+ Octane.Type.Dictionary: instance Data.OverloadedRecords.ModifyRec "unpack" (Data.Map.Base.Map Octane.Type.Text.Text a0) cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 (Octane.Type.Dictionary.Dictionary a0)) (Data.Map.Base.Map Octane.Type.Text.Text a0)
+ Octane.Type.Dictionary: instance Data.OverloadedRecords.ModifyRec "unpack" (Data.Map.Base.Map Octane.Type.Text.Text a0) cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 (Octane.Type.Dictionary.Dictionary a0)) (Data.OverloadedRecords.Rec cs0 (Octane.Type.Dictionary.Dictionary a0)) (Data.Map.Base.Map Octane.Type.Text.Text a0) (Data.Map.Base.Map Octane.Type.Text.Text a0)
+ Octane.Type.Float32: [float32Unpack] :: Float32 -> Float
+ Octane.Type.Float32: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.Float32.Float32 GHC.Types.Float
+ Octane.Type.Float32: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.Float32.Float32 Octane.Type.Float32.Float32 GHC.Types.Float GHC.Types.Float
+ Octane.Type.Float32: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Types.Float cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Float32.Float32) GHC.Types.Float
+ Octane.Type.Float32: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Types.Float cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Float32.Float32) (Data.OverloadedRecords.Rec cs0 Octane.Type.Float32.Float32) GHC.Types.Float GHC.Types.Float
+ Octane.Type.Frame: [frameDelta] :: Frame -> Float32
+ Octane.Type.Frame: [frameIsKeyFrame] :: Frame -> Bool
+ Octane.Type.Frame: [frameNumber] :: Frame -> Word
+ Octane.Type.Frame: [frameReplications] :: Frame -> [Replication]
+ Octane.Type.Frame: [frameTime] :: Frame -> Float32
+ Octane.Type.Frame: instance Data.OverloadedRecords.HasField "delta" Octane.Type.Frame.Frame Octane.Type.Float32.Float32
+ Octane.Type.Frame: instance Data.OverloadedRecords.HasField "isKeyFrame" Octane.Type.Frame.Frame GHC.Types.Bool
+ Octane.Type.Frame: instance Data.OverloadedRecords.HasField "number" Octane.Type.Frame.Frame GHC.Types.Word
+ Octane.Type.Frame: instance Data.OverloadedRecords.HasField "replications" Octane.Type.Frame.Frame [Octane.Type.Replication.Replication]
+ Octane.Type.Frame: instance Data.OverloadedRecords.HasField "time" Octane.Type.Frame.Frame Octane.Type.Float32.Float32
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyField "delta" Octane.Type.Frame.Frame Octane.Type.Frame.Frame Octane.Type.Float32.Float32 Octane.Type.Float32.Float32
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyField "isKeyFrame" Octane.Type.Frame.Frame Octane.Type.Frame.Frame GHC.Types.Bool GHC.Types.Bool
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyField "number" Octane.Type.Frame.Frame Octane.Type.Frame.Frame GHC.Types.Word GHC.Types.Word
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyField "replications" Octane.Type.Frame.Frame Octane.Type.Frame.Frame [Octane.Type.Replication.Replication] [Octane.Type.Replication.Replication]
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyField "time" Octane.Type.Frame.Frame Octane.Type.Frame.Frame Octane.Type.Float32.Float32 Octane.Type.Float32.Float32
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyRec "delta" Octane.Type.Float32.Float32 cs0 => Data.OverloadedRecords.HasField "delta" (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) Octane.Type.Float32.Float32
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyRec "delta" Octane.Type.Float32.Float32 cs0 => Data.OverloadedRecords.ModifyField "delta" (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) Octane.Type.Float32.Float32 Octane.Type.Float32.Float32
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyRec "isKeyFrame" GHC.Types.Bool cs0 => Data.OverloadedRecords.HasField "isKeyFrame" (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) GHC.Types.Bool
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyRec "isKeyFrame" GHC.Types.Bool cs0 => Data.OverloadedRecords.ModifyField "isKeyFrame" (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) GHC.Types.Bool GHC.Types.Bool
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyRec "number" GHC.Types.Word cs0 => Data.OverloadedRecords.HasField "number" (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) GHC.Types.Word
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyRec "number" GHC.Types.Word cs0 => Data.OverloadedRecords.ModifyField "number" (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) GHC.Types.Word GHC.Types.Word
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyRec "replications" [Octane.Type.Replication.Replication] cs0 => Data.OverloadedRecords.HasField "replications" (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) [Octane.Type.Replication.Replication]
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyRec "replications" [Octane.Type.Replication.Replication] cs0 => Data.OverloadedRecords.ModifyField "replications" (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) [Octane.Type.Replication.Replication] [Octane.Type.Replication.Replication]
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyRec "time" Octane.Type.Float32.Float32 cs0 => Data.OverloadedRecords.HasField "time" (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) Octane.Type.Float32.Float32
+ Octane.Type.Frame: instance Data.OverloadedRecords.ModifyRec "time" Octane.Type.Float32.Float32 cs0 => Data.OverloadedRecords.ModifyField "time" (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) (Data.OverloadedRecords.Rec cs0 Octane.Type.Frame.Frame) Octane.Type.Float32.Float32 Octane.Type.Float32.Float32
+ Octane.Type.Initialization: [initializationLocation] :: Initialization -> Maybe (Vector Int)
+ Octane.Type.Initialization: [initializationRotation] :: Initialization -> Maybe (Vector Int8)
+ Octane.Type.Initialization: instance Data.OverloadedRecords.HasField "location" Octane.Type.Initialization.Initialization (GHC.Base.Maybe (Octane.Type.Vector.Vector GHC.Types.Int))
+ Octane.Type.Initialization: instance Data.OverloadedRecords.HasField "rotation" Octane.Type.Initialization.Initialization (GHC.Base.Maybe (Octane.Type.Vector.Vector Octane.Type.Int8.Int8))
+ Octane.Type.Initialization: instance Data.OverloadedRecords.ModifyField "location" Octane.Type.Initialization.Initialization Octane.Type.Initialization.Initialization (GHC.Base.Maybe (Octane.Type.Vector.Vector GHC.Types.Int)) (GHC.Base.Maybe (Octane.Type.Vector.Vector GHC.Types.Int))
+ Octane.Type.Initialization: instance Data.OverloadedRecords.ModifyField "rotation" Octane.Type.Initialization.Initialization Octane.Type.Initialization.Initialization (GHC.Base.Maybe (Octane.Type.Vector.Vector Octane.Type.Int8.Int8)) (GHC.Base.Maybe (Octane.Type.Vector.Vector Octane.Type.Int8.Int8))
+ Octane.Type.Initialization: instance Data.OverloadedRecords.ModifyRec "location" (GHC.Base.Maybe (Octane.Type.Vector.Vector GHC.Types.Int)) cs0 => Data.OverloadedRecords.HasField "location" (Data.OverloadedRecords.Rec cs0 Octane.Type.Initialization.Initialization) (GHC.Base.Maybe (Octane.Type.Vector.Vector GHC.Types.Int))
+ Octane.Type.Initialization: instance Data.OverloadedRecords.ModifyRec "location" (GHC.Base.Maybe (Octane.Type.Vector.Vector GHC.Types.Int)) cs0 => Data.OverloadedRecords.ModifyField "location" (Data.OverloadedRecords.Rec cs0 Octane.Type.Initialization.Initialization) (Data.OverloadedRecords.Rec cs0 Octane.Type.Initialization.Initialization) (GHC.Base.Maybe (Octane.Type.Vector.Vector GHC.Types.Int)) (GHC.Base.Maybe (Octane.Type.Vector.Vector GHC.Types.Int))
+ Octane.Type.Initialization: instance Data.OverloadedRecords.ModifyRec "rotation" (GHC.Base.Maybe (Octane.Type.Vector.Vector Octane.Type.Int8.Int8)) cs0 => Data.OverloadedRecords.HasField "rotation" (Data.OverloadedRecords.Rec cs0 Octane.Type.Initialization.Initialization) (GHC.Base.Maybe (Octane.Type.Vector.Vector Octane.Type.Int8.Int8))
+ Octane.Type.Initialization: instance Data.OverloadedRecords.ModifyRec "rotation" (GHC.Base.Maybe (Octane.Type.Vector.Vector Octane.Type.Int8.Int8)) cs0 => Data.OverloadedRecords.ModifyField "rotation" (Data.OverloadedRecords.Rec cs0 Octane.Type.Initialization.Initialization) (Data.OverloadedRecords.Rec cs0 Octane.Type.Initialization.Initialization) (GHC.Base.Maybe (Octane.Type.Vector.Vector Octane.Type.Int8.Int8)) (GHC.Base.Maybe (Octane.Type.Vector.Vector Octane.Type.Int8.Int8))
+ Octane.Type.Int32: [int32Unpack] :: Int32 -> Int32
+ Octane.Type.Int32: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.Int32.Int32 GHC.Int.Int32
+ Octane.Type.Int32: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.Int32.Int32 Octane.Type.Int32.Int32 GHC.Int.Int32 GHC.Int.Int32
+ Octane.Type.Int32: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Int.Int32 cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Int32.Int32) GHC.Int.Int32
+ Octane.Type.Int32: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Int.Int32 cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Int32.Int32) (Data.OverloadedRecords.Rec cs0 Octane.Type.Int32.Int32) GHC.Int.Int32 GHC.Int.Int32
+ Octane.Type.Int8: [int8Unpack] :: Int8 -> Int8
+ Octane.Type.Int8: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.Int8.Int8 GHC.Int.Int8
+ Octane.Type.Int8: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.Int8.Int8 Octane.Type.Int8.Int8 GHC.Int.Int8 GHC.Int.Int8
+ Octane.Type.Int8: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Int.Int8 cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Int8.Int8) GHC.Int.Int8
+ Octane.Type.Int8: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Int.Int8 cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Int8.Int8) (Data.OverloadedRecords.Rec cs0 Octane.Type.Int8.Int8) GHC.Int.Int8 GHC.Int.Int8
+ Octane.Type.KeyFrame: [keyFrameFrame] :: KeyFrame -> Word32
+ Octane.Type.KeyFrame: [keyFramePosition] :: KeyFrame -> Word32
+ Octane.Type.KeyFrame: [keyFrameTime] :: KeyFrame -> Float32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.HasField "frame" Octane.Type.KeyFrame.KeyFrame Octane.Type.Word32.Word32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.HasField "position" Octane.Type.KeyFrame.KeyFrame Octane.Type.Word32.Word32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.HasField "time" Octane.Type.KeyFrame.KeyFrame Octane.Type.Float32.Float32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.ModifyField "frame" Octane.Type.KeyFrame.KeyFrame Octane.Type.KeyFrame.KeyFrame Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.ModifyField "position" Octane.Type.KeyFrame.KeyFrame Octane.Type.KeyFrame.KeyFrame Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.ModifyField "time" Octane.Type.KeyFrame.KeyFrame Octane.Type.KeyFrame.KeyFrame Octane.Type.Float32.Float32 Octane.Type.Float32.Float32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.ModifyRec "frame" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "frame" (Data.OverloadedRecords.Rec cs0 Octane.Type.KeyFrame.KeyFrame) Octane.Type.Word32.Word32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.ModifyRec "frame" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "frame" (Data.OverloadedRecords.Rec cs0 Octane.Type.KeyFrame.KeyFrame) (Data.OverloadedRecords.Rec cs0 Octane.Type.KeyFrame.KeyFrame) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.ModifyRec "position" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "position" (Data.OverloadedRecords.Rec cs0 Octane.Type.KeyFrame.KeyFrame) Octane.Type.Word32.Word32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.ModifyRec "position" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "position" (Data.OverloadedRecords.Rec cs0 Octane.Type.KeyFrame.KeyFrame) (Data.OverloadedRecords.Rec cs0 Octane.Type.KeyFrame.KeyFrame) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.ModifyRec "time" Octane.Type.Float32.Float32 cs0 => Data.OverloadedRecords.HasField "time" (Data.OverloadedRecords.Rec cs0 Octane.Type.KeyFrame.KeyFrame) Octane.Type.Float32.Float32
+ Octane.Type.KeyFrame: instance Data.OverloadedRecords.ModifyRec "time" Octane.Type.Float32.Float32 cs0 => Data.OverloadedRecords.ModifyField "time" (Data.OverloadedRecords.Rec cs0 Octane.Type.KeyFrame.KeyFrame) (Data.OverloadedRecords.Rec cs0 Octane.Type.KeyFrame.KeyFrame) Octane.Type.Float32.Float32 Octane.Type.Float32.Float32
+ Octane.Type.List: [listUnpack] :: List a -> [a]
+ Octane.Type.List: instance Data.OverloadedRecords.HasField "unpack" (Octane.Type.List.List a0) [a0]
+ Octane.Type.List: instance Data.OverloadedRecords.ModifyField "unpack" (Octane.Type.List.List a0) (Octane.Type.List.List a0) [a0] [a0]
+ Octane.Type.List: instance Data.OverloadedRecords.ModifyRec "unpack" [a0] cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 (Octane.Type.List.List a0)) [a0]
+ Octane.Type.List: instance Data.OverloadedRecords.ModifyRec "unpack" [a0] cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 (Octane.Type.List.List a0)) (Data.OverloadedRecords.Rec cs0 (Octane.Type.List.List a0)) [a0] [a0]
+ Octane.Type.Mark: [markFrame] :: Mark -> Word32
+ Octane.Type.Mark: [markLabel] :: Mark -> Text
+ Octane.Type.Mark: instance Data.OverloadedRecords.HasField "frame" Octane.Type.Mark.Mark Octane.Type.Word32.Word32
+ Octane.Type.Mark: instance Data.OverloadedRecords.HasField "label" Octane.Type.Mark.Mark Octane.Type.Text.Text
+ Octane.Type.Mark: instance Data.OverloadedRecords.ModifyField "frame" Octane.Type.Mark.Mark Octane.Type.Mark.Mark Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.Mark: instance Data.OverloadedRecords.ModifyField "label" Octane.Type.Mark.Mark Octane.Type.Mark.Mark Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.Mark: instance Data.OverloadedRecords.ModifyRec "frame" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "frame" (Data.OverloadedRecords.Rec cs0 Octane.Type.Mark.Mark) Octane.Type.Word32.Word32
+ Octane.Type.Mark: instance Data.OverloadedRecords.ModifyRec "frame" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "frame" (Data.OverloadedRecords.Rec cs0 Octane.Type.Mark.Mark) (Data.OverloadedRecords.Rec cs0 Octane.Type.Mark.Mark) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.Mark: instance Data.OverloadedRecords.ModifyRec "label" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.HasField "label" (Data.OverloadedRecords.Rec cs0 Octane.Type.Mark.Mark) Octane.Type.Text.Text
+ Octane.Type.Mark: instance Data.OverloadedRecords.ModifyRec "label" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.ModifyField "label" (Data.OverloadedRecords.Rec cs0 Octane.Type.Mark.Mark) (Data.OverloadedRecords.Rec cs0 Octane.Type.Mark.Mark) Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.Message: [messageContent] :: Message -> Text
+ Octane.Type.Message: [messageFrame] :: Message -> Word32
+ Octane.Type.Message: [messageName] :: Message -> Text
+ Octane.Type.Message: instance Data.OverloadedRecords.HasField "content" Octane.Type.Message.Message Octane.Type.Text.Text
+ Octane.Type.Message: instance Data.OverloadedRecords.HasField "frame" Octane.Type.Message.Message Octane.Type.Word32.Word32
+ Octane.Type.Message: instance Data.OverloadedRecords.HasField "name" Octane.Type.Message.Message Octane.Type.Text.Text
+ Octane.Type.Message: instance Data.OverloadedRecords.ModifyField "content" Octane.Type.Message.Message Octane.Type.Message.Message Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.Message: instance Data.OverloadedRecords.ModifyField "frame" Octane.Type.Message.Message Octane.Type.Message.Message Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.Message: instance Data.OverloadedRecords.ModifyField "name" Octane.Type.Message.Message Octane.Type.Message.Message Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.Message: instance Data.OverloadedRecords.ModifyRec "content" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.HasField "content" (Data.OverloadedRecords.Rec cs0 Octane.Type.Message.Message) Octane.Type.Text.Text
+ Octane.Type.Message: instance Data.OverloadedRecords.ModifyRec "content" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.ModifyField "content" (Data.OverloadedRecords.Rec cs0 Octane.Type.Message.Message) (Data.OverloadedRecords.Rec cs0 Octane.Type.Message.Message) Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.Message: instance Data.OverloadedRecords.ModifyRec "frame" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "frame" (Data.OverloadedRecords.Rec cs0 Octane.Type.Message.Message) Octane.Type.Word32.Word32
+ Octane.Type.Message: instance Data.OverloadedRecords.ModifyRec "frame" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "frame" (Data.OverloadedRecords.Rec cs0 Octane.Type.Message.Message) (Data.OverloadedRecords.Rec cs0 Octane.Type.Message.Message) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.Message: instance Data.OverloadedRecords.ModifyRec "name" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.HasField "name" (Data.OverloadedRecords.Rec cs0 Octane.Type.Message.Message) Octane.Type.Text.Text
+ Octane.Type.Message: instance Data.OverloadedRecords.ModifyRec "name" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.ModifyField "name" (Data.OverloadedRecords.Rec cs0 Octane.Type.Message.Message) (Data.OverloadedRecords.Rec cs0 Octane.Type.Message.Message) Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.OptimizedReplay: [optimizedReplayCache] :: OptimizedReplay -> List CacheItem
+ Octane.Type.OptimizedReplay: [optimizedReplayClasses] :: OptimizedReplay -> List ClassItem
+ Octane.Type.OptimizedReplay: [optimizedReplayFrames] :: OptimizedReplay -> [Frame]
+ Octane.Type.OptimizedReplay: [optimizedReplayKeyFrames] :: OptimizedReplay -> List KeyFrame
+ Octane.Type.OptimizedReplay: [optimizedReplayLabel] :: OptimizedReplay -> Text
+ Octane.Type.OptimizedReplay: [optimizedReplayLevels] :: OptimizedReplay -> List Text
+ Octane.Type.OptimizedReplay: [optimizedReplayMarks] :: OptimizedReplay -> List Mark
+ Octane.Type.OptimizedReplay: [optimizedReplayMessages] :: OptimizedReplay -> List Message
+ Octane.Type.OptimizedReplay: [optimizedReplayNames] :: OptimizedReplay -> List Text
+ Octane.Type.OptimizedReplay: [optimizedReplayObjects] :: OptimizedReplay -> List Text
+ Octane.Type.OptimizedReplay: [optimizedReplayPackages] :: OptimizedReplay -> List Text
+ Octane.Type.OptimizedReplay: [optimizedReplayProperties] :: OptimizedReplay -> Dictionary Property
+ Octane.Type.OptimizedReplay: [optimizedReplayVersion1] :: OptimizedReplay -> Word32
+ Octane.Type.OptimizedReplay: [optimizedReplayVersion2] :: OptimizedReplay -> Word32
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "cache" Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "classes" Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "frames" Octane.Type.OptimizedReplay.OptimizedReplay [Octane.Type.Frame.Frame]
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "keyFrames" Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "label" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.Text.Text
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "levels" Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "marks" Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "messages" Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "names" Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "objects" Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "packages" Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "properties" Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "version1" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.Word32.Word32
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.HasField "version2" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.Word32.Word32
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "cache" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "classes" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "frames" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay [Octane.Type.Frame.Frame] [Octane.Type.Frame.Frame]
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "keyFrames" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "label" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "levels" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "marks" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Mark.Mark) (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "messages" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Message.Message) (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "names" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "objects" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "packages" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "properties" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "version1" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyField "version2" Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.OptimizedReplay.OptimizedReplay Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "cache" (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) cs0 => Data.OverloadedRecords.HasField "cache" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "cache" (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) cs0 => Data.OverloadedRecords.ModifyField "cache" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "classes" (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) cs0 => Data.OverloadedRecords.HasField "classes" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "classes" (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) cs0 => Data.OverloadedRecords.ModifyField "classes" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "frames" [Octane.Type.Frame.Frame] cs0 => Data.OverloadedRecords.HasField "frames" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) [Octane.Type.Frame.Frame]
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "frames" [Octane.Type.Frame.Frame] cs0 => Data.OverloadedRecords.ModifyField "frames" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) [Octane.Type.Frame.Frame] [Octane.Type.Frame.Frame]
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "keyFrames" (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) cs0 => Data.OverloadedRecords.HasField "keyFrames" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "keyFrames" (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) cs0 => Data.OverloadedRecords.ModifyField "keyFrames" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "label" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.HasField "label" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) Octane.Type.Text.Text
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "label" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.ModifyField "label" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "levels" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "levels" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "levels" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "levels" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "marks" (Octane.Type.List.List Octane.Type.Mark.Mark) cs0 => Data.OverloadedRecords.HasField "marks" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "marks" (Octane.Type.List.List Octane.Type.Mark.Mark) cs0 => Data.OverloadedRecords.ModifyField "marks" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Mark.Mark) (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "messages" (Octane.Type.List.List Octane.Type.Message.Message) cs0 => Data.OverloadedRecords.HasField "messages" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "messages" (Octane.Type.List.List Octane.Type.Message.Message) cs0 => Data.OverloadedRecords.ModifyField "messages" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Message.Message) (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "names" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "names" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "names" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "names" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "objects" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "objects" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "objects" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "objects" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "packages" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "packages" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "packages" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "packages" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "properties" (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) cs0 => Data.OverloadedRecords.HasField "properties" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "properties" (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) cs0 => Data.OverloadedRecords.ModifyField "properties" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "version1" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "version1" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) Octane.Type.Word32.Word32
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "version1" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "version1" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "version2" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "version2" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) Octane.Type.Word32.Word32
+ Octane.Type.OptimizedReplay: instance Data.OverloadedRecords.ModifyRec "version2" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "version2" (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.OptimizedReplay.OptimizedReplay) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: [rawReplayContentCRC] :: RawReplay -> Word32
+ Octane.Type.RawReplay: [rawReplayContentSize] :: RawReplay -> Word32
+ Octane.Type.RawReplay: [rawReplayContent] :: RawReplay -> ByteString
+ Octane.Type.RawReplay: [rawReplayFooter] :: RawReplay -> ByteString
+ Octane.Type.RawReplay: [rawReplayHeaderCRC] :: RawReplay -> Word32
+ Octane.Type.RawReplay: [rawReplayHeaderSize] :: RawReplay -> Word32
+ Octane.Type.RawReplay: [rawReplayHeader] :: RawReplay -> ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.HasField "content" Octane.Type.RawReplay.RawReplay Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.HasField "contentCRC" Octane.Type.RawReplay.RawReplay Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.HasField "contentSize" Octane.Type.RawReplay.RawReplay Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.HasField "footer" Octane.Type.RawReplay.RawReplay Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.HasField "header" Octane.Type.RawReplay.RawReplay Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.HasField "headerCRC" Octane.Type.RawReplay.RawReplay Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.HasField "headerSize" Octane.Type.RawReplay.RawReplay Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyField "content" Octane.Type.RawReplay.RawReplay Octane.Type.RawReplay.RawReplay Data.ByteString.Lazy.Internal.ByteString Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyField "contentCRC" Octane.Type.RawReplay.RawReplay Octane.Type.RawReplay.RawReplay Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyField "contentSize" Octane.Type.RawReplay.RawReplay Octane.Type.RawReplay.RawReplay Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyField "footer" Octane.Type.RawReplay.RawReplay Octane.Type.RawReplay.RawReplay Data.ByteString.Lazy.Internal.ByteString Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyField "header" Octane.Type.RawReplay.RawReplay Octane.Type.RawReplay.RawReplay Data.ByteString.Lazy.Internal.ByteString Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyField "headerCRC" Octane.Type.RawReplay.RawReplay Octane.Type.RawReplay.RawReplay Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyField "headerSize" Octane.Type.RawReplay.RawReplay Octane.Type.RawReplay.RawReplay Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "content" Data.ByteString.Lazy.Internal.ByteString cs0 => Data.OverloadedRecords.HasField "content" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "content" Data.ByteString.Lazy.Internal.ByteString cs0 => Data.OverloadedRecords.ModifyField "content" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Data.ByteString.Lazy.Internal.ByteString Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "contentCRC" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "contentCRC" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "contentCRC" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "contentCRC" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "contentSize" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "contentSize" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "contentSize" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "contentSize" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "footer" Data.ByteString.Lazy.Internal.ByteString cs0 => Data.OverloadedRecords.HasField "footer" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "footer" Data.ByteString.Lazy.Internal.ByteString cs0 => Data.OverloadedRecords.ModifyField "footer" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Data.ByteString.Lazy.Internal.ByteString Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "header" Data.ByteString.Lazy.Internal.ByteString cs0 => Data.OverloadedRecords.HasField "header" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "header" Data.ByteString.Lazy.Internal.ByteString cs0 => Data.OverloadedRecords.ModifyField "header" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Data.ByteString.Lazy.Internal.ByteString Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "headerCRC" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "headerCRC" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "headerCRC" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "headerCRC" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "headerSize" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "headerSize" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Octane.Type.Word32.Word32
+ Octane.Type.RawReplay: instance Data.OverloadedRecords.ModifyRec "headerSize" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "headerSize" (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) (Data.OverloadedRecords.Rec cs0 Octane.Type.RawReplay.RawReplay) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.RemoteId: [playStationIdName] :: PlayStationId -> Text
+ Octane.Type.RemoteId: [playStationIdUnknown] :: PlayStationId -> ByteString
+ Octane.Type.RemoteId: [splitscreenIdUnpack] :: SplitscreenId -> Maybe Int
+ Octane.Type.RemoteId: [steamIdUnpack] :: SteamId -> Word64
+ Octane.Type.RemoteId: [xboxIdUnpack] :: XboxId -> Word64
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.HasField "name" Octane.Type.RemoteId.PlayStationId Octane.Type.Text.Text
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.HasField "unknown" Octane.Type.RemoteId.PlayStationId Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.RemoteId.SplitscreenId (GHC.Base.Maybe GHC.Types.Int)
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.RemoteId.SteamId Octane.Type.Word64.Word64
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.RemoteId.XboxId Octane.Type.Word64.Word64
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyField "name" Octane.Type.RemoteId.PlayStationId Octane.Type.RemoteId.PlayStationId Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyField "unknown" Octane.Type.RemoteId.PlayStationId Octane.Type.RemoteId.PlayStationId Data.ByteString.Lazy.Internal.ByteString Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.RemoteId.SplitscreenId Octane.Type.RemoteId.SplitscreenId (GHC.Base.Maybe GHC.Types.Int) (GHC.Base.Maybe GHC.Types.Int)
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.RemoteId.SteamId Octane.Type.RemoteId.SteamId Octane.Type.Word64.Word64 Octane.Type.Word64.Word64
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.RemoteId.XboxId Octane.Type.RemoteId.XboxId Octane.Type.Word64.Word64 Octane.Type.Word64.Word64
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyRec "name" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.HasField "name" (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.PlayStationId) Octane.Type.Text.Text
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyRec "name" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.ModifyField "name" (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.PlayStationId) (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.PlayStationId) Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyRec "unknown" Data.ByteString.Lazy.Internal.ByteString cs0 => Data.OverloadedRecords.HasField "unknown" (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.PlayStationId) Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyRec "unknown" Data.ByteString.Lazy.Internal.ByteString cs0 => Data.OverloadedRecords.ModifyField "unknown" (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.PlayStationId) (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.PlayStationId) Data.ByteString.Lazy.Internal.ByteString Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyRec "unpack" (GHC.Base.Maybe GHC.Types.Int) cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.SplitscreenId) (GHC.Base.Maybe GHC.Types.Int)
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyRec "unpack" (GHC.Base.Maybe GHC.Types.Int) cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.SplitscreenId) (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.SplitscreenId) (GHC.Base.Maybe GHC.Types.Int) (GHC.Base.Maybe GHC.Types.Int)
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyRec "unpack" Octane.Type.Word64.Word64 cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.SteamId) Octane.Type.Word64.Word64
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyRec "unpack" Octane.Type.Word64.Word64 cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.XboxId) Octane.Type.Word64.Word64
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyRec "unpack" Octane.Type.Word64.Word64 cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.SteamId) (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.SteamId) Octane.Type.Word64.Word64 Octane.Type.Word64.Word64
+ Octane.Type.RemoteId: instance Data.OverloadedRecords.ModifyRec "unpack" Octane.Type.Word64.Word64 cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.XboxId) (Data.OverloadedRecords.Rec cs0 Octane.Type.RemoteId.XboxId) Octane.Type.Word64.Word64 Octane.Type.Word64.Word64
+ Octane.Type.Replay: [replayFrames] :: Replay -> [Frame]
+ Octane.Type.Replay: [replayLevels] :: Replay -> [Text]
+ Octane.Type.Replay: [replayMessages] :: Replay -> Map Text Text
+ Octane.Type.Replay: [replayMetadata] :: Replay -> Map Text Property
+ Octane.Type.Replay: [replayPackages] :: Replay -> [Text]
+ Octane.Type.Replay: [replayTickMarks] :: Replay -> Map Text Text
+ Octane.Type.Replay: [replayVersion] :: Replay -> Version
+ Octane.Type.Replay: instance Data.OverloadedRecords.HasField "frames" Octane.Type.Replay.Replay [Octane.Type.Frame.Frame]
+ Octane.Type.Replay: instance Data.OverloadedRecords.HasField "levels" Octane.Type.Replay.Replay [Data.Text.Internal.Text]
+ Octane.Type.Replay: instance Data.OverloadedRecords.HasField "messages" Octane.Type.Replay.Replay (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text)
+ Octane.Type.Replay: instance Data.OverloadedRecords.HasField "metadata" Octane.Type.Replay.Replay (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Property.Property)
+ Octane.Type.Replay: instance Data.OverloadedRecords.HasField "packages" Octane.Type.Replay.Replay [Data.Text.Internal.Text]
+ Octane.Type.Replay: instance Data.OverloadedRecords.HasField "tickMarks" Octane.Type.Replay.Replay (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text)
+ Octane.Type.Replay: instance Data.OverloadedRecords.HasField "version" Octane.Type.Replay.Replay Data.Version.Version
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyField "frames" Octane.Type.Replay.Replay Octane.Type.Replay.Replay [Octane.Type.Frame.Frame] [Octane.Type.Frame.Frame]
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyField "levels" Octane.Type.Replay.Replay Octane.Type.Replay.Replay [Data.Text.Internal.Text] [Data.Text.Internal.Text]
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyField "messages" Octane.Type.Replay.Replay Octane.Type.Replay.Replay (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text) (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text)
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyField "metadata" Octane.Type.Replay.Replay Octane.Type.Replay.Replay (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Property.Property) (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Property.Property)
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyField "packages" Octane.Type.Replay.Replay Octane.Type.Replay.Replay [Data.Text.Internal.Text] [Data.Text.Internal.Text]
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyField "tickMarks" Octane.Type.Replay.Replay Octane.Type.Replay.Replay (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text) (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text)
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyField "version" Octane.Type.Replay.Replay Octane.Type.Replay.Replay Data.Version.Version Data.Version.Version
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "frames" [Octane.Type.Frame.Frame] cs0 => Data.OverloadedRecords.HasField "frames" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) [Octane.Type.Frame.Frame]
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "frames" [Octane.Type.Frame.Frame] cs0 => Data.OverloadedRecords.ModifyField "frames" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) [Octane.Type.Frame.Frame] [Octane.Type.Frame.Frame]
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "levels" [Data.Text.Internal.Text] cs0 => Data.OverloadedRecords.HasField "levels" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) [Data.Text.Internal.Text]
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "levels" [Data.Text.Internal.Text] cs0 => Data.OverloadedRecords.ModifyField "levels" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) [Data.Text.Internal.Text] [Data.Text.Internal.Text]
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "messages" (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text) cs0 => Data.OverloadedRecords.HasField "messages" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text)
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "messages" (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text) cs0 => Data.OverloadedRecords.ModifyField "messages" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text) (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text)
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "metadata" (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Property.Property) cs0 => Data.OverloadedRecords.HasField "metadata" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Property.Property)
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "metadata" (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Property.Property) cs0 => Data.OverloadedRecords.ModifyField "metadata" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Property.Property) (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Property.Property)
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "packages" [Data.Text.Internal.Text] cs0 => Data.OverloadedRecords.HasField "packages" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) [Data.Text.Internal.Text]
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "packages" [Data.Text.Internal.Text] cs0 => Data.OverloadedRecords.ModifyField "packages" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) [Data.Text.Internal.Text] [Data.Text.Internal.Text]
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "tickMarks" (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text) cs0 => Data.OverloadedRecords.HasField "tickMarks" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text)
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "tickMarks" (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text) cs0 => Data.OverloadedRecords.ModifyField "tickMarks" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text) (Data.Map.Base.Map Data.Text.Internal.Text Data.Text.Internal.Text)
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "version" Data.Version.Version cs0 => Data.OverloadedRecords.HasField "version" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) Data.Version.Version
+ Octane.Type.Replay: instance Data.OverloadedRecords.ModifyRec "version" Data.Version.Version cs0 => Data.OverloadedRecords.ModifyField "version" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replay.Replay) Data.Version.Version Data.Version.Version
+ Octane.Type.ReplayWithFrames: [replayWithFramesCache] :: ReplayWithFrames -> List CacheItem
+ Octane.Type.ReplayWithFrames: [replayWithFramesClasses] :: ReplayWithFrames -> List ClassItem
+ Octane.Type.ReplayWithFrames: [replayWithFramesFrames] :: ReplayWithFrames -> [Frame]
+ Octane.Type.ReplayWithFrames: [replayWithFramesKeyFrames] :: ReplayWithFrames -> List KeyFrame
+ Octane.Type.ReplayWithFrames: [replayWithFramesLabel] :: ReplayWithFrames -> Text
+ Octane.Type.ReplayWithFrames: [replayWithFramesLevels] :: ReplayWithFrames -> List Text
+ Octane.Type.ReplayWithFrames: [replayWithFramesMarks] :: ReplayWithFrames -> List Mark
+ Octane.Type.ReplayWithFrames: [replayWithFramesMessages] :: ReplayWithFrames -> List Message
+ Octane.Type.ReplayWithFrames: [replayWithFramesNames] :: ReplayWithFrames -> List Text
+ Octane.Type.ReplayWithFrames: [replayWithFramesObjects] :: ReplayWithFrames -> List Text
+ Octane.Type.ReplayWithFrames: [replayWithFramesPackages] :: ReplayWithFrames -> List Text
+ Octane.Type.ReplayWithFrames: [replayWithFramesProperties] :: ReplayWithFrames -> Dictionary Property
+ Octane.Type.ReplayWithFrames: [replayWithFramesVersion1] :: ReplayWithFrames -> Word32
+ Octane.Type.ReplayWithFrames: [replayWithFramesVersion2] :: ReplayWithFrames -> Word32
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "cache" Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "classes" Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "frames" Octane.Type.ReplayWithFrames.ReplayWithFrames [Octane.Type.Frame.Frame]
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "keyFrames" Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "label" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.Text.Text
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "levels" Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "marks" Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "messages" Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "names" Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "objects" Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "packages" Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "properties" Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "version1" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.HasField "version2" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "cache" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "classes" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "frames" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames [Octane.Type.Frame.Frame] [Octane.Type.Frame.Frame]
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "keyFrames" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "label" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "levels" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "marks" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Mark.Mark) (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "messages" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Message.Message) (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "names" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "objects" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "packages" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "properties" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "version1" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyField "version2" Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.ReplayWithFrames.ReplayWithFrames Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "cache" (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) cs0 => Data.OverloadedRecords.HasField "cache" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "cache" (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) cs0 => Data.OverloadedRecords.ModifyField "cache" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "classes" (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) cs0 => Data.OverloadedRecords.HasField "classes" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "classes" (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) cs0 => Data.OverloadedRecords.ModifyField "classes" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "frames" [Octane.Type.Frame.Frame] cs0 => Data.OverloadedRecords.HasField "frames" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) [Octane.Type.Frame.Frame]
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "frames" [Octane.Type.Frame.Frame] cs0 => Data.OverloadedRecords.ModifyField "frames" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) [Octane.Type.Frame.Frame] [Octane.Type.Frame.Frame]
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "keyFrames" (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) cs0 => Data.OverloadedRecords.HasField "keyFrames" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "keyFrames" (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) cs0 => Data.OverloadedRecords.ModifyField "keyFrames" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "label" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.HasField "label" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) Octane.Type.Text.Text
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "label" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.ModifyField "label" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "levels" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "levels" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "levels" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "levels" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "marks" (Octane.Type.List.List Octane.Type.Mark.Mark) cs0 => Data.OverloadedRecords.HasField "marks" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "marks" (Octane.Type.List.List Octane.Type.Mark.Mark) cs0 => Data.OverloadedRecords.ModifyField "marks" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Mark.Mark) (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "messages" (Octane.Type.List.List Octane.Type.Message.Message) cs0 => Data.OverloadedRecords.HasField "messages" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "messages" (Octane.Type.List.List Octane.Type.Message.Message) cs0 => Data.OverloadedRecords.ModifyField "messages" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Message.Message) (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "names" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "names" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "names" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "names" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "objects" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "objects" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "objects" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "objects" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "packages" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "packages" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "packages" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "packages" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "properties" (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) cs0 => Data.OverloadedRecords.HasField "properties" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "properties" (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) cs0 => Data.OverloadedRecords.ModifyField "properties" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "version1" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "version1" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "version1" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "version1" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "version2" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "version2" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithFrames: instance Data.OverloadedRecords.ModifyRec "version2" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "version2" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithFrames.ReplayWithFrames) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesCache] :: ReplayWithoutFrames -> List CacheItem
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesClasses] :: ReplayWithoutFrames -> List ClassItem
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesKeyFrames] :: ReplayWithoutFrames -> List KeyFrame
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesLabel] :: ReplayWithoutFrames -> Text
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesLevels] :: ReplayWithoutFrames -> List Text
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesMarks] :: ReplayWithoutFrames -> List Mark
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesMessages] :: ReplayWithoutFrames -> List Message
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesNames] :: ReplayWithoutFrames -> List Text
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesObjects] :: ReplayWithoutFrames -> List Text
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesPackages] :: ReplayWithoutFrames -> List Text
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesProperties] :: ReplayWithoutFrames -> Dictionary Property
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesStream] :: ReplayWithoutFrames -> Stream
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesVersion1] :: ReplayWithoutFrames -> Word32
+ Octane.Type.ReplayWithoutFrames: [replayWithoutFramesVersion2] :: ReplayWithoutFrames -> Word32
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "cache" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "classes" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "keyFrames" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "label" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.Text.Text
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "levels" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "marks" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "messages" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "names" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "objects" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "packages" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "properties" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "stream" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.Stream.Stream
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "version1" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.HasField "version2" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "cache" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "classes" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "keyFrames" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "label" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "levels" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "marks" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Mark.Mark) (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "messages" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Message.Message) (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "names" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "objects" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "packages" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "properties" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "stream" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.Stream.Stream Octane.Type.Stream.Stream
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "version1" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyField "version2" Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "cache" (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) cs0 => Data.OverloadedRecords.HasField "cache" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "cache" (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) cs0 => Data.OverloadedRecords.ModifyField "cache" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem) (Octane.Type.List.List Octane.Type.CacheItem.CacheItem)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "classes" (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) cs0 => Data.OverloadedRecords.HasField "classes" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "classes" (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) cs0 => Data.OverloadedRecords.ModifyField "classes" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem) (Octane.Type.List.List Octane.Type.ClassItem.ClassItem)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "keyFrames" (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) cs0 => Data.OverloadedRecords.HasField "keyFrames" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "keyFrames" (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) cs0 => Data.OverloadedRecords.ModifyField "keyFrames" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame) (Octane.Type.List.List Octane.Type.KeyFrame.KeyFrame)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "label" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.HasField "label" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) Octane.Type.Text.Text
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "label" Octane.Type.Text.Text cs0 => Data.OverloadedRecords.ModifyField "label" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) Octane.Type.Text.Text Octane.Type.Text.Text
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "levels" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "levels" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "levels" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "levels" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "marks" (Octane.Type.List.List Octane.Type.Mark.Mark) cs0 => Data.OverloadedRecords.HasField "marks" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "marks" (Octane.Type.List.List Octane.Type.Mark.Mark) cs0 => Data.OverloadedRecords.ModifyField "marks" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Mark.Mark) (Octane.Type.List.List Octane.Type.Mark.Mark)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "messages" (Octane.Type.List.List Octane.Type.Message.Message) cs0 => Data.OverloadedRecords.HasField "messages" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "messages" (Octane.Type.List.List Octane.Type.Message.Message) cs0 => Data.OverloadedRecords.ModifyField "messages" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Message.Message) (Octane.Type.List.List Octane.Type.Message.Message)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "names" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "names" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "names" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "names" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "objects" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "objects" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "objects" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "objects" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "packages" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.HasField "packages" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "packages" (Octane.Type.List.List Octane.Type.Text.Text) cs0 => Data.OverloadedRecords.ModifyField "packages" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.List.List Octane.Type.Text.Text) (Octane.Type.List.List Octane.Type.Text.Text)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "properties" (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) cs0 => Data.OverloadedRecords.HasField "properties" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "properties" (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) cs0 => Data.OverloadedRecords.ModifyField "properties" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property) (Octane.Type.Dictionary.Dictionary Octane.Type.Property.Property)
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "stream" Octane.Type.Stream.Stream cs0 => Data.OverloadedRecords.HasField "stream" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) Octane.Type.Stream.Stream
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "stream" Octane.Type.Stream.Stream cs0 => Data.OverloadedRecords.ModifyField "stream" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) Octane.Type.Stream.Stream Octane.Type.Stream.Stream
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "version1" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "version1" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "version1" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "version1" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "version2" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.HasField "version2" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) Octane.Type.Word32.Word32
+ Octane.Type.ReplayWithoutFrames: instance Data.OverloadedRecords.ModifyRec "version2" Octane.Type.Word32.Word32 cs0 => Data.OverloadedRecords.ModifyField "version2" (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) (Data.OverloadedRecords.Rec cs0 Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames) Octane.Type.Word32.Word32 Octane.Type.Word32.Word32
+ Octane.Type.Replication: [replicationActorId] :: Replication -> CompressedWord
+ Octane.Type.Replication: [replicationClassName] :: Replication -> Text
+ Octane.Type.Replication: [replicationInitialization] :: Replication -> Maybe Initialization
+ Octane.Type.Replication: [replicationObjectName] :: Replication -> Text
+ Octane.Type.Replication: [replicationProperties] :: Replication -> Map Text Value
+ Octane.Type.Replication: [replicationState] :: Replication -> State
+ Octane.Type.Replication: instance Data.OverloadedRecords.HasField "actorId" Octane.Type.Replication.Replication Octane.Type.CompressedWord.CompressedWord
+ Octane.Type.Replication: instance Data.OverloadedRecords.HasField "className" Octane.Type.Replication.Replication Data.Text.Internal.Text
+ Octane.Type.Replication: instance Data.OverloadedRecords.HasField "initialization" Octane.Type.Replication.Replication (GHC.Base.Maybe Octane.Type.Initialization.Initialization)
+ Octane.Type.Replication: instance Data.OverloadedRecords.HasField "objectName" Octane.Type.Replication.Replication Data.Text.Internal.Text
+ Octane.Type.Replication: instance Data.OverloadedRecords.HasField "properties" Octane.Type.Replication.Replication (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Value.Value)
+ Octane.Type.Replication: instance Data.OverloadedRecords.HasField "state" Octane.Type.Replication.Replication Octane.Type.State.State
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyField "actorId" Octane.Type.Replication.Replication Octane.Type.Replication.Replication Octane.Type.CompressedWord.CompressedWord Octane.Type.CompressedWord.CompressedWord
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyField "className" Octane.Type.Replication.Replication Octane.Type.Replication.Replication Data.Text.Internal.Text Data.Text.Internal.Text
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyField "initialization" Octane.Type.Replication.Replication Octane.Type.Replication.Replication (GHC.Base.Maybe Octane.Type.Initialization.Initialization) (GHC.Base.Maybe Octane.Type.Initialization.Initialization)
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyField "objectName" Octane.Type.Replication.Replication Octane.Type.Replication.Replication Data.Text.Internal.Text Data.Text.Internal.Text
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyField "properties" Octane.Type.Replication.Replication Octane.Type.Replication.Replication (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Value.Value) (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Value.Value)
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyField "state" Octane.Type.Replication.Replication Octane.Type.Replication.Replication Octane.Type.State.State Octane.Type.State.State
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "actorId" Octane.Type.CompressedWord.CompressedWord cs0 => Data.OverloadedRecords.HasField "actorId" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) Octane.Type.CompressedWord.CompressedWord
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "actorId" Octane.Type.CompressedWord.CompressedWord cs0 => Data.OverloadedRecords.ModifyField "actorId" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) Octane.Type.CompressedWord.CompressedWord Octane.Type.CompressedWord.CompressedWord
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "className" Data.Text.Internal.Text cs0 => Data.OverloadedRecords.HasField "className" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) Data.Text.Internal.Text
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "className" Data.Text.Internal.Text cs0 => Data.OverloadedRecords.ModifyField "className" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) Data.Text.Internal.Text Data.Text.Internal.Text
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "initialization" (GHC.Base.Maybe Octane.Type.Initialization.Initialization) cs0 => Data.OverloadedRecords.HasField "initialization" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) (GHC.Base.Maybe Octane.Type.Initialization.Initialization)
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "initialization" (GHC.Base.Maybe Octane.Type.Initialization.Initialization) cs0 => Data.OverloadedRecords.ModifyField "initialization" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) (GHC.Base.Maybe Octane.Type.Initialization.Initialization) (GHC.Base.Maybe Octane.Type.Initialization.Initialization)
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "objectName" Data.Text.Internal.Text cs0 => Data.OverloadedRecords.HasField "objectName" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) Data.Text.Internal.Text
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "objectName" Data.Text.Internal.Text cs0 => Data.OverloadedRecords.ModifyField "objectName" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) Data.Text.Internal.Text Data.Text.Internal.Text
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "properties" (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Value.Value) cs0 => Data.OverloadedRecords.HasField "properties" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Value.Value)
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "properties" (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Value.Value) cs0 => Data.OverloadedRecords.ModifyField "properties" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Value.Value) (Data.Map.Base.Map Data.Text.Internal.Text Octane.Type.Value.Value)
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "state" Octane.Type.State.State cs0 => Data.OverloadedRecords.HasField "state" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) Octane.Type.State.State
+ Octane.Type.Replication: instance Data.OverloadedRecords.ModifyRec "state" Octane.Type.State.State cs0 => Data.OverloadedRecords.ModifyField "state" (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) (Data.OverloadedRecords.Rec cs0 Octane.Type.Replication.Replication) Octane.Type.State.State Octane.Type.State.State
+ Octane.Type.Stream: [streamUnpack] :: Stream -> ByteString
+ Octane.Type.Stream: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.Stream.Stream Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.Stream: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.Stream.Stream Octane.Type.Stream.Stream Data.ByteString.Lazy.Internal.ByteString Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.Stream: instance Data.OverloadedRecords.ModifyRec "unpack" Data.ByteString.Lazy.Internal.ByteString cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Stream.Stream) Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.Stream: instance Data.OverloadedRecords.ModifyRec "unpack" Data.ByteString.Lazy.Internal.ByteString cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Stream.Stream) (Data.OverloadedRecords.Rec cs0 Octane.Type.Stream.Stream) Data.ByteString.Lazy.Internal.ByteString Data.ByteString.Lazy.Internal.ByteString
+ Octane.Type.Text: [textUnpack] :: Text -> Text
+ Octane.Type.Text: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.Text.Text Data.Text.Internal.Text
+ Octane.Type.Text: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.Text.Text Octane.Type.Text.Text Data.Text.Internal.Text Data.Text.Internal.Text
+ Octane.Type.Text: instance Data.OverloadedRecords.ModifyRec "unpack" Data.Text.Internal.Text cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Text.Text) Data.Text.Internal.Text
+ Octane.Type.Text: instance Data.OverloadedRecords.ModifyRec "unpack" Data.Text.Internal.Text cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Text.Text) (Data.OverloadedRecords.Rec cs0 Octane.Type.Text.Text) Data.Text.Internal.Text Data.Text.Internal.Text
+ Octane.Type.Vector: [vectorX] :: Vector a -> a
+ Octane.Type.Vector: [vectorY] :: Vector a -> a
+ Octane.Type.Vector: [vectorZ] :: Vector a -> a
+ Octane.Type.Vector: instance Data.OverloadedRecords.HasField "x" (Octane.Type.Vector.Vector a0) a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.HasField "y" (Octane.Type.Vector.Vector a0) a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.HasField "z" (Octane.Type.Vector.Vector a0) a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.ModifyField "x" (Octane.Type.Vector.Vector a0) (Octane.Type.Vector.Vector a0) a0 a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.ModifyField "y" (Octane.Type.Vector.Vector a0) (Octane.Type.Vector.Vector a0) a0 a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.ModifyField "z" (Octane.Type.Vector.Vector a0) (Octane.Type.Vector.Vector a0) a0 a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.ModifyRec "x" a0 cs0 => Data.OverloadedRecords.HasField "x" (Data.OverloadedRecords.Rec cs0 (Octane.Type.Vector.Vector a0)) a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.ModifyRec "x" a0 cs0 => Data.OverloadedRecords.ModifyField "x" (Data.OverloadedRecords.Rec cs0 (Octane.Type.Vector.Vector a0)) (Data.OverloadedRecords.Rec cs0 (Octane.Type.Vector.Vector a0)) a0 a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.ModifyRec "y" a0 cs0 => Data.OverloadedRecords.HasField "y" (Data.OverloadedRecords.Rec cs0 (Octane.Type.Vector.Vector a0)) a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.ModifyRec "y" a0 cs0 => Data.OverloadedRecords.ModifyField "y" (Data.OverloadedRecords.Rec cs0 (Octane.Type.Vector.Vector a0)) (Data.OverloadedRecords.Rec cs0 (Octane.Type.Vector.Vector a0)) a0 a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.ModifyRec "z" a0 cs0 => Data.OverloadedRecords.HasField "z" (Data.OverloadedRecords.Rec cs0 (Octane.Type.Vector.Vector a0)) a0
+ Octane.Type.Vector: instance Data.OverloadedRecords.ModifyRec "z" a0 cs0 => Data.OverloadedRecords.ModifyField "z" (Data.OverloadedRecords.Rec cs0 (Octane.Type.Vector.Vector a0)) (Data.OverloadedRecords.Rec cs0 (Octane.Type.Vector.Vector a0)) a0 a0
+ Octane.Type.Word16: [word16Unpack] :: Word16 -> Word16
+ Octane.Type.Word16: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.Word16.Word16 GHC.Word.Word16
+ Octane.Type.Word16: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.Word16.Word16 Octane.Type.Word16.Word16 GHC.Word.Word16 GHC.Word.Word16
+ Octane.Type.Word16: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Word.Word16 cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Word16.Word16) GHC.Word.Word16
+ Octane.Type.Word16: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Word.Word16 cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Word16.Word16) (Data.OverloadedRecords.Rec cs0 Octane.Type.Word16.Word16) GHC.Word.Word16 GHC.Word.Word16
+ Octane.Type.Word32: [word32Unpack] :: Word32 -> Word32
+ Octane.Type.Word32: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.Word32.Word32 GHC.Word.Word32
+ Octane.Type.Word32: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.Word32.Word32 Octane.Type.Word32.Word32 GHC.Word.Word32 GHC.Word.Word32
+ Octane.Type.Word32: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Word.Word32 cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Word32.Word32) GHC.Word.Word32
+ Octane.Type.Word32: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Word.Word32 cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Word32.Word32) (Data.OverloadedRecords.Rec cs0 Octane.Type.Word32.Word32) GHC.Word.Word32 GHC.Word.Word32
+ Octane.Type.Word64: [word64Unpack] :: Word64 -> Word64
+ Octane.Type.Word64: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.Word64.Word64 GHC.Word.Word64
+ Octane.Type.Word64: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.Word64.Word64 Octane.Type.Word64.Word64 GHC.Word.Word64 GHC.Word.Word64
+ Octane.Type.Word64: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Word.Word64 cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Word64.Word64) GHC.Word.Word64
+ Octane.Type.Word64: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Word.Word64 cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Word64.Word64) (Data.OverloadedRecords.Rec cs0 Octane.Type.Word64.Word64) GHC.Word.Word64 GHC.Word.Word64
+ Octane.Type.Word8: [word8Unpack] :: Word8 -> Word8
+ Octane.Type.Word8: instance Data.OverloadedRecords.HasField "unpack" Octane.Type.Word8.Word8 GHC.Word.Word8
+ Octane.Type.Word8: instance Data.OverloadedRecords.ModifyField "unpack" Octane.Type.Word8.Word8 Octane.Type.Word8.Word8 GHC.Word.Word8 GHC.Word.Word8
+ Octane.Type.Word8: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Word.Word8 cs0 => Data.OverloadedRecords.HasField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Word8.Word8) GHC.Word.Word8
+ Octane.Type.Word8: instance Data.OverloadedRecords.ModifyRec "unpack" GHC.Word.Word8 cs0 => Data.OverloadedRecords.ModifyField "unpack" (Data.OverloadedRecords.Rec cs0 Octane.Type.Word8.Word8) (Data.OverloadedRecords.Rec cs0 Octane.Type.Word8.Word8) GHC.Word.Word8 GHC.Word.Word8
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "classId" Octane.Utility.Parser.Thing GHC.Types.Int
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "classMap" Octane.Utility.Parser.Context Octane.Utility.Parser.ClassMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "className" Octane.Utility.Parser.Thing Data.Text.Internal.Text
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "classPropertyMap" Octane.Utility.Parser.Context Octane.Utility.Parser.ClassPropertyMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "flag" Octane.Utility.Parser.Thing Octane.Type.Boolean.Boolean
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "initialization" Octane.Utility.Parser.Thing Octane.Type.Initialization.Initialization
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "keyFrames" Octane.Utility.Parser.Context (Data.Set.Base.Set GHC.Types.Word)
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "objectId" Octane.Utility.Parser.Thing Octane.Type.Int32.Int32
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "objectMap" Octane.Utility.Parser.Context Octane.Utility.Parser.ObjectMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "objectName" Octane.Utility.Parser.Thing Data.Text.Internal.Text
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "things" Octane.Utility.Parser.Context (Data.IntMap.Base.IntMap Octane.Utility.Parser.Thing)
+ Octane.Utility.Parser: instance Data.OverloadedRecords.HasField "version" Octane.Utility.Parser.Context Data.Version.Version
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "classId" Octane.Utility.Parser.Thing Octane.Utility.Parser.Thing GHC.Types.Int GHC.Types.Int
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "classMap" Octane.Utility.Parser.Context Octane.Utility.Parser.Context Octane.Utility.Parser.ClassMap Octane.Utility.Parser.ClassMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "className" Octane.Utility.Parser.Thing Octane.Utility.Parser.Thing Data.Text.Internal.Text Data.Text.Internal.Text
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "classPropertyMap" Octane.Utility.Parser.Context Octane.Utility.Parser.Context Octane.Utility.Parser.ClassPropertyMap Octane.Utility.Parser.ClassPropertyMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "flag" Octane.Utility.Parser.Thing Octane.Utility.Parser.Thing Octane.Type.Boolean.Boolean Octane.Type.Boolean.Boolean
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "initialization" Octane.Utility.Parser.Thing Octane.Utility.Parser.Thing Octane.Type.Initialization.Initialization Octane.Type.Initialization.Initialization
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "keyFrames" Octane.Utility.Parser.Context Octane.Utility.Parser.Context (Data.Set.Base.Set GHC.Types.Word) (Data.Set.Base.Set GHC.Types.Word)
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "objectId" Octane.Utility.Parser.Thing Octane.Utility.Parser.Thing Octane.Type.Int32.Int32 Octane.Type.Int32.Int32
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "objectMap" Octane.Utility.Parser.Context Octane.Utility.Parser.Context Octane.Utility.Parser.ObjectMap Octane.Utility.Parser.ObjectMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "objectName" Octane.Utility.Parser.Thing Octane.Utility.Parser.Thing Data.Text.Internal.Text Data.Text.Internal.Text
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "things" Octane.Utility.Parser.Context Octane.Utility.Parser.Context (Data.IntMap.Base.IntMap Octane.Utility.Parser.Thing) (Data.IntMap.Base.IntMap Octane.Utility.Parser.Thing)
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyField "version" Octane.Utility.Parser.Context Octane.Utility.Parser.Context Data.Version.Version Data.Version.Version
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "classId" GHC.Types.Int cs0 => Data.OverloadedRecords.HasField "classId" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) GHC.Types.Int
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "classId" GHC.Types.Int cs0 => Data.OverloadedRecords.ModifyField "classId" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) GHC.Types.Int GHC.Types.Int
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "classMap" Octane.Utility.Parser.ClassMap cs0 => Data.OverloadedRecords.HasField "classMap" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) Octane.Utility.Parser.ClassMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "classMap" Octane.Utility.Parser.ClassMap cs0 => Data.OverloadedRecords.ModifyField "classMap" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) Octane.Utility.Parser.ClassMap Octane.Utility.Parser.ClassMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "className" Data.Text.Internal.Text cs0 => Data.OverloadedRecords.HasField "className" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) Data.Text.Internal.Text
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "className" Data.Text.Internal.Text cs0 => Data.OverloadedRecords.ModifyField "className" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) Data.Text.Internal.Text Data.Text.Internal.Text
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "classPropertyMap" Octane.Utility.Parser.ClassPropertyMap cs0 => Data.OverloadedRecords.HasField "classPropertyMap" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) Octane.Utility.Parser.ClassPropertyMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "classPropertyMap" Octane.Utility.Parser.ClassPropertyMap cs0 => Data.OverloadedRecords.ModifyField "classPropertyMap" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) Octane.Utility.Parser.ClassPropertyMap Octane.Utility.Parser.ClassPropertyMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "flag" Octane.Type.Boolean.Boolean cs0 => Data.OverloadedRecords.HasField "flag" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) Octane.Type.Boolean.Boolean
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "flag" Octane.Type.Boolean.Boolean cs0 => Data.OverloadedRecords.ModifyField "flag" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) Octane.Type.Boolean.Boolean Octane.Type.Boolean.Boolean
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "initialization" Octane.Type.Initialization.Initialization cs0 => Data.OverloadedRecords.HasField "initialization" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) Octane.Type.Initialization.Initialization
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "initialization" Octane.Type.Initialization.Initialization cs0 => Data.OverloadedRecords.ModifyField "initialization" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) Octane.Type.Initialization.Initialization Octane.Type.Initialization.Initialization
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "keyFrames" (Data.Set.Base.Set GHC.Types.Word) cs0 => Data.OverloadedRecords.HasField "keyFrames" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) (Data.Set.Base.Set GHC.Types.Word)
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "keyFrames" (Data.Set.Base.Set GHC.Types.Word) cs0 => Data.OverloadedRecords.ModifyField "keyFrames" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) (Data.Set.Base.Set GHC.Types.Word) (Data.Set.Base.Set GHC.Types.Word)
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "objectId" Octane.Type.Int32.Int32 cs0 => Data.OverloadedRecords.HasField "objectId" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) Octane.Type.Int32.Int32
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "objectId" Octane.Type.Int32.Int32 cs0 => Data.OverloadedRecords.ModifyField "objectId" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) Octane.Type.Int32.Int32 Octane.Type.Int32.Int32
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "objectMap" Octane.Utility.Parser.ObjectMap cs0 => Data.OverloadedRecords.HasField "objectMap" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) Octane.Utility.Parser.ObjectMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "objectMap" Octane.Utility.Parser.ObjectMap cs0 => Data.OverloadedRecords.ModifyField "objectMap" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) Octane.Utility.Parser.ObjectMap Octane.Utility.Parser.ObjectMap
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "objectName" Data.Text.Internal.Text cs0 => Data.OverloadedRecords.HasField "objectName" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) Data.Text.Internal.Text
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "objectName" Data.Text.Internal.Text cs0 => Data.OverloadedRecords.ModifyField "objectName" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Thing) Data.Text.Internal.Text Data.Text.Internal.Text
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "things" (Data.IntMap.Base.IntMap Octane.Utility.Parser.Thing) cs0 => Data.OverloadedRecords.HasField "things" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) (Data.IntMap.Base.IntMap Octane.Utility.Parser.Thing)
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "things" (Data.IntMap.Base.IntMap Octane.Utility.Parser.Thing) cs0 => Data.OverloadedRecords.ModifyField "things" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) (Data.IntMap.Base.IntMap Octane.Utility.Parser.Thing) (Data.IntMap.Base.IntMap Octane.Utility.Parser.Thing)
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "version" Data.Version.Version cs0 => Data.OverloadedRecords.HasField "version" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) Data.Version.Version
+ Octane.Utility.Parser: instance Data.OverloadedRecords.ModifyRec "version" Data.Version.Version cs0 => Data.OverloadedRecords.ModifyField "version" (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) (Data.OverloadedRecords.Rec cs0 Octane.Utility.Parser.Context) Data.Version.Version Data.Version.Version
Files
- Setup.hs +2/−0
- library/Octane/Data.hs +12/−6
- library/Octane/Type/Boolean.hs +17/−7
- library/Octane/Type/CacheItem.hs +20/−10
- library/Octane/Type/CacheProperty.hs +16/−6
- library/Octane/Type/ClassItem.hs +16/−6
- library/Octane/Type/CompressedWord.hs +38/−22
- library/Octane/Type/Dictionary.hs +16/−7
- library/Octane/Type/Float32.hs +15/−5
- library/Octane/Type/Frame.hs +37/−29
- library/Octane/Type/Initialization.hs +18/−8
- library/Octane/Type/Int32.hs +16/−6
- library/Octane/Type/Int8.hs +16/−6
- library/Octane/Type/KeyFrame.hs +19/−9
- library/Octane/Type/List.hs +16/−7
- library/Octane/Type/Mark.hs +16/−6
- library/Octane/Type/Message.hs +18/−8
- library/Octane/Type/OptimizedReplay.hs +56/−47
- library/Octane/Type/Property.hs +6/−5
- library/Octane/Type/RawReplay.hs +28/−22
- library/Octane/Type/RemoteId.hs +71/−55
- library/Octane/Type/Replay.hs +85/−71
- library/Octane/Type/ReplayWithFrames.hs +66/−55
- library/Octane/Type/ReplayWithoutFrames.hs +61/−34
- library/Octane/Type/Replication.hs +16/−7
- library/Octane/Type/Stream.hs +14/−4
- library/Octane/Type/Text.hs +15/−5
- library/Octane/Type/Value.hs +1/−1
- library/Octane/Type/Vector.hs +30/−19
- library/Octane/Type/Word16.hs +16/−6
- library/Octane/Type/Word32.hs +16/−6
- library/Octane/Type/Word64.hs +16/−6
- library/Octane/Type/Word8.hs +16/−6
- library/Octane/Utility/ClassPropertyMap.hs +20/−24
- library/Octane/Utility/Generator.hs +8/−6
- library/Octane/Utility/Optimizer.hs +20/−19
- library/Octane/Utility/Parser.hs +181/−180
- octane.cabal +3/−1
- package.yaml +3/−1
- stack.yaml +1/−1
- test-suite/Main.hs +1/−0
Setup.hs view
@@ -1,3 +1,5 @@+module Main (main) where+ import qualified Distribution.Simple
library/Octane/Data.hs view
@@ -25,7 +25,8 @@ -- >>> Map.lookup "TheWorld:PersistentLevel.InMapScoreboard_TA" classes -- Just "TAGame.InMapScoreboard_TA" classes :: Map.Map StrictText.Text StrictText.Text-classes = Embed.decodeMap $(FileEmbed.embedFile "data/classes.json")+classes = Embed.decodeMap+ $(FileEmbed.embedFile "data/classes.json") -- | A set of classes that have an initial location vector.@@ -33,7 +34,8 @@ -- >>> Set.member "TAGame.Ball_TA" classesWithLocation -- True classesWithLocation :: Set.Set StrictText.Text-classesWithLocation = Embed.decodeSet $(FileEmbed.embedFile "data/classes-with-location.json")+classesWithLocation = Embed.decodeSet+ $(FileEmbed.embedFile "data/classes-with-location.json") -- | A set of classes that have an initial rotation vector.@@ -41,7 +43,8 @@ -- >>> Set.member "TAGame.Ball_TA" classesWithRotation -- True classesWithRotation :: Set.Set StrictText.Text-classesWithRotation = Embed.decodeSet $(FileEmbed.embedFile "data/classes-with-rotation.json")+classesWithRotation = Embed.decodeSet+ $(FileEmbed.embedFile "data/classes-with-rotation.json") -- | A one-to-one mapping between game mode IDs and their names.@@ -49,7 +52,8 @@ -- >>> Bimap.lookup 1 gameModes :: Maybe StrictText.Text -- Just "Hockey" gameModes :: Bimap.Bimap Int StrictText.Text-gameModes = Embed.decodeBimap $(FileEmbed.embedFile "data/game-modes.json")+gameModes = Embed.decodeBimap+ $(FileEmbed.embedFile "data/game-modes.json") -- | A one-to-one mapping between product IDs and their names.@@ -57,7 +61,8 @@ -- >>> Bimap.lookup 1 products :: Maybe StrictText.Text -- Just "Antenna_8Ball" products :: Bimap.Bimap Word StrictText.Text-products = Embed.decodeBimap $(FileEmbed.embedFile "data/products.json")+products = Embed.decodeBimap+ $(FileEmbed.embedFile "data/products.json") -- | A mapping between property names and their serialized type.@@ -65,4 +70,5 @@ -- >>> Map.lookup "Engine.Actor:bBlockActors" properties -- Just "boolean" properties :: Map.Map StrictText.Text StrictText.Text-properties = Embed.decodeMap $(FileEmbed.embedFile "data/properties.json")+properties = Embed.decodeMap+ $(FileEmbed.embedFile "data/properties.json")
library/Octane/Type/Boolean.hs view
@@ -1,5 +1,11 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Boolean (Boolean(..)) where @@ -11,6 +17,8 @@ import qualified Data.Binary.Bits as BinaryBit import qualified Data.Binary.Bits.Get as BinaryBit import qualified Data.Binary.Bits.Put as BinaryBit+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics -- $setup@@ -20,14 +28,16 @@ -- | A boolean value. newtype Boolean = Boolean- { unpack :: Bool+ { booleanUnpack :: Bool } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''Boolean)+ -- | Stored in the last bit of a byte. Decoding will fail if the byte is -- anything other than @0b00000000@ or @0b00000001@. -- -- >>> Binary.decode "\x01" :: Boolean--- Boolean {unpack = True}+-- Boolean {booleanUnpack = True} -- -- >>> Binary.encode (Boolean True) -- "\SOH"@@ -40,7 +50,7 @@ _ -> fail ("Unexpected Boolean value " ++ show value) put boolean = boolean- & unpack+ & #unpack & fromEnum & fromIntegral & Binary.putWord8@@ -48,7 +58,7 @@ -- | Stored as a bit. -- -- >>> Binary.runGet (BinaryBit.runBitGet (BinaryBit.getBits 0)) "\x80" :: Boolean--- Boolean {unpack = True}+-- Boolean {booleanUnpack = True} -- -- >>> Binary.runPut (BinaryBit.runBitPut (BinaryBit.putBits 0 (Boolean True))) -- "\128"@@ -58,7 +68,7 @@ value & Boolean & pure putBits _ boolean = boolean- & unpack+ & #unpack & BinaryBit.putBool instance DeepSeq.NFData Boolean where@@ -69,5 +79,5 @@ -- "true" instance Aeson.ToJSON Boolean where toJSON boolean = boolean- & unpack+ & #unpack & Aeson.toJSON
library/Octane/Type/CacheItem.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.CacheItem (CacheItem(..)) where @@ -8,6 +14,8 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Binary as Binary+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.CacheProperty as CacheProperty import qualified Octane.Type.List as List@@ -19,20 +27,22 @@ -- | An item in the class net cache map. data CacheItem = CacheItem- { classId :: Word32.Word32+ { cacheItemClassId :: Word32.Word32 -- ^ The class ID.- , parentCacheId :: Word32.Word32+ , cacheItemParentCacheId :: Word32.Word32 -- ^ The cache ID of the parent class.- , cacheId :: Word32.Word32+ , cacheItemCacheId :: Word32.Word32 -- ^ The cache ID of the class.- , properties :: List.List CacheProperty.CacheProperty+ , cacheItemProperties :: List.List CacheProperty.CacheProperty -- ^ The properties that belong to this class. } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''CacheItem)+ -- | Fields are stored one after the other in order. -- -- >>> Binary.decode "\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00" :: CacheItem--- CacheItem {classId = 0x00000001, parentCacheId = 0x00000002, cacheId = 0x00000003, properties = fromList []}+-- CacheItem {cacheItemClassId = 0x00000001, cacheItemParentCacheId = 0x00000002, cacheItemCacheId = 0x00000003, cacheItemProperties = fromList []} -- -- >>> Binary.encode (CacheItem 1 2 3 []) -- "\SOH\NUL\NUL\NUL\STX\NUL\NUL\NUL\ETX\NUL\NUL\NUL\NUL\NUL\NUL\NUL"@@ -44,9 +54,9 @@ <*> Binary.get put cacheItem = do- cacheItem & classId & Binary.put- cacheItem & parentCacheId & Binary.put- cacheItem & cacheId & Binary.put- cacheItem & properties & Binary.put+ cacheItem & #classId & Binary.put+ cacheItem & #parentCacheId & Binary.put+ cacheItem & #cacheId & Binary.put+ cacheItem & #properties & Binary.put instance DeepSeq.NFData CacheItem where
library/Octane/Type/CacheProperty.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.CacheProperty (CacheProperty(..)) where @@ -8,22 +14,26 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Binary as Binary+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.Word32 as Word32 -- | A property on an item in the class net cache map. data CacheProperty = CacheProperty- { objectId :: Word32.Word32+ { cachePropertyObjectId :: Word32.Word32 -- ^ The object's ID.- , streamId :: Word32.Word32+ , cachePropertyStreamId :: Word32.Word32 -- ^ The object's ID in the network stream. } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''CacheProperty)+ -- | Fields are stored one after the other in order. -- -- >>> Binary.decode "\x01\x00\x00\x00\x02\x00\x00\x00" :: CacheProperty--- CacheProperty {objectId = 0x00000001, streamId = 0x00000002}+-- CacheProperty {cachePropertyObjectId = 0x00000001, cachePropertyStreamId = 0x00000002} -- -- >>> Binary.encode (CacheProperty 1 2) -- "\SOH\NUL\NUL\NUL\STX\NUL\NUL\NUL"@@ -33,7 +43,7 @@ <*> Binary.get put cacheProperty = do- cacheProperty & objectId & Binary.put- cacheProperty & streamId & Binary.put+ cacheProperty & #objectId & Binary.put+ cacheProperty & #streamId & Binary.put instance DeepSeq.NFData CacheProperty where
library/Octane/Type/ClassItem.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.ClassItem (ClassItem(..)) where @@ -8,6 +14,8 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Binary as Binary+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.Text as Text import qualified Octane.Type.Word32 as Word32@@ -16,16 +24,18 @@ -- | A class (like @Core.Object@) and it's associated ID in the net stream -- (like @0@). data ClassItem = ClassItem- { name :: Text.Text+ { classItemName :: Text.Text -- ^ The class's name.- , streamId :: Word32.Word32+ , classItemStreamId :: Word32.Word32 -- ^ The class's ID in the network stream. } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''ClassItem)+ -- | Fields are stored one after the other in order. -- -- >>> Binary.decode "\x02\x00\x00\x00\x4b\x00\x01\x00\x00\x00" :: ClassItem--- ClassItem {name = "K", streamId = 0x00000001}+-- ClassItem {classItemName = "K", classItemStreamId = 0x00000001} -- -- >>> Binary.encode (ClassItem "K" 1) -- "\STX\NUL\NUL\NULK\NUL\SOH\NUL\NUL\NUL"@@ -35,7 +45,7 @@ <*> Binary.get put classItem = do- classItem & name & Binary.put- classItem & streamId & Binary.put+ classItem & #name & Binary.put+ classItem & #streamId & Binary.put instance DeepSeq.NFData ClassItem where
library/Octane/Type/CompressedWord.hs view
@@ -1,7 +1,19 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} -module Octane.Type.CompressedWord (CompressedWord(..), fromCompressedWord) where+module Octane.Type.CompressedWord+ ( CompressedWord(..)+ , fromCompressedWord+ ) where import Data.Aeson ((.=)) import Data.Function ((&))@@ -12,6 +24,8 @@ import qualified Data.Binary.Bits.Get as BinaryBit import qualified Data.Binary.Bits.Put as BinaryBit import qualified Data.Bits as Bits+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.Boolean as Boolean @@ -25,33 +39,35 @@ -- limit, or the number of bits necessary to reach the limit has been reached, -- whichever comes first. data CompressedWord = CompressedWord- { limit :: Word- , value :: Word+ { compressedWordLimit :: Word+ , compressedWordValue :: Word } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''CompressedWord)+ -- | Abuses the first argument to 'BinaryBit.getBits' as the maximum value. -- -- >>> Binary.runGet (BinaryBit.runBitGet (BinaryBit.getBits 4)) "\x7f" :: CompressedWord--- CompressedWord {limit = 4, value = 2}+-- CompressedWord {compressedWordLimit = 4, compressedWordValue = 2} -- -- >>> Binary.runPut (BinaryBit.runBitPut (BinaryBit.putBits 0 (CompressedWord 4 2))) -- "\128" instance BinaryBit.BinaryBit CompressedWord where getBits n = do- let theLimit = fromIntegral n- theValue <- getStep theLimit (bitSize theLimit) 0 0- pure (CompressedWord theLimit theValue)+ let limit = fromIntegral n+ value <- getStep limit (bitSize limit) 0 0+ pure (CompressedWord limit value) putBits _ compressedWord = do- let theLimit = fromIntegral (limit compressedWord)- let theValue = fromIntegral (value compressedWord)- let maxBits = bitSize theLimit+ let limit = fromIntegral (#limit compressedWord)+ let value = fromIntegral (#value compressedWord)+ let maxBits = bitSize limit let upper = (2 ^ (maxBits - 1)) - 1- let lower = theLimit - upper- let numBits = if lower > theValue || theValue > upper+ let lower = limit - upper+ let numBits = if lower > value || value > upper then maxBits else maxBits - 1- BinaryBit.putWord64be numBits theValue+ BinaryBit.putWord64be numBits value instance DeepSeq.NFData CompressedWord where @@ -61,8 +77,8 @@ -- "{\"Value\":1,\"Limit\":2}" instance Aeson.ToJSON CompressedWord where toJSON compressedWord = Aeson.object- [ "Limit" .= limit compressedWord- , "Value" .= value compressedWord+ [ "Limit" .= #limit compressedWord+ , "Value" .= #value compressedWord ] @@ -72,7 +88,7 @@ -- >>> fromCompressedWord (CompressedWord 2 1) :: Int -- 1 fromCompressedWord :: (Integral a) => CompressedWord -> a-fromCompressedWord compressedWord = compressedWord & value & fromIntegral+fromCompressedWord compressedWord = compressedWord & #value & fromIntegral bitSize :: (Integral a, Integral b) => a -> b@@ -80,11 +96,11 @@ getStep :: Word -> Word -> Word -> Word -> BinaryBit.BitGet Word-getStep theLimit maxBits position theValue = do+getStep limit maxBits position value = do let x = Bits.shiftL 1 (fromIntegral position)- if position < maxBits && theValue + x <= theLimit+ if position < maxBits && value + x <= limit then do- bit <- BinaryBit.getBits 0- let newValue = if Boolean.unpack bit then theValue + x else theValue- getStep theLimit maxBits (position + 1) newValue- else pure theValue+ (bit :: Boolean.Boolean) <- BinaryBit.getBits 0+ let newValue = if #unpack bit then value + x else value+ getStep limit maxBits (position + 1) newValue+ else pure value
library/Octane/Type/Dictionary.hs view
@@ -1,6 +1,11 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} module Octane.Type.Dictionary (Dictionary(..)) where@@ -10,7 +15,9 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Aeson as Aeson import qualified Data.Binary as Binary+import qualified Data.Default.Class as Default import qualified Data.Map.Strict as Map+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Exts as Exts import qualified GHC.Generics as Generics import qualified Octane.Type.Text as Text@@ -22,9 +29,11 @@ -- | A mapping between text and arbitrary values. newtype Dictionary a = Dictionary- { unpack :: (Map.Map Text.Text a)+ { dictionaryUnpack :: (Map.Map Text.Text a) } deriving (Eq, Generics.Generic) +$(OverloadedRecords.overloadedRecord Default.def ''Dictionary)+ -- | Elements are stored with the key first, then the value. The dictionary -- ends when a key is @"None"@. --@@ -43,7 +52,7 @@ elements & Map.union element & Dictionary & pure put dictionary = do- dictionary & unpack & Map.assocs & mapM_ putElement+ dictionary & #unpack & Map.assocs & mapM_ putElement noneKey & Binary.put -- | Allows creating 'Dictionary' values with 'Exts.fromList'. Also allows@@ -56,7 +65,7 @@ fromList items = Dictionary (Map.fromList items) - toList dictionary = Map.toList (unpack dictionary)+ toList dictionary = Map.toList (#unpack dictionary) instance (DeepSeq.NFData a) => DeepSeq.NFData (Dictionary a) where @@ -65,7 +74,7 @@ -- >>> show ([("one", 1)] :: Dictionary Int) -- "fromList [(\"one\",1)]" instance (Show a) => Show (Dictionary a) where- show dictionary = show (unpack dictionary)+ show dictionary = show (#unpack dictionary) -- | Encoded directly as a JSON object. --@@ -73,8 +82,8 @@ -- "{\"one\":1}" instance (Aeson.ToJSON a) => Aeson.ToJSON (Dictionary a) where toJSON dictionary = dictionary- & unpack- & Map.mapKeys Text.unpack+ & #unpack+ & Map.mapKeys #unpack & Aeson.toJSON
library/Octane/Type/Float32.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Float32 (Float32(..)) where @@ -16,6 +22,8 @@ import qualified Data.Binary.IEEE754 as IEEE754 import qualified Data.Binary.Put as Binary import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Utility.Endian as Endian @@ -26,9 +34,11 @@ -- | A 32-bit float. newtype Float32 = Float32- { unpack :: Float+ { float32Unpack :: Float } deriving (Eq, Fractional, Generics.Generic, Num, Ord) +$(OverloadedRecords.overloadedRecord Default.def ''Float32)+ -- | Little-endian. -- -- >>> Binary.decode "\x9a\x99\x99\x3f" :: Float32@@ -42,7 +52,7 @@ value & Float32 & pure put float32 = float32- & unpack+ & #unpack & IEEE754.putFloat32le -- | Little-endian with the bits in each byte reversed.@@ -75,7 +85,7 @@ -- >>> show (1.2 :: Float32) -- "1.2" instance Show Float32 where- show float32 = show (unpack float32)+ show float32 = show (#unpack float32) -- | Encoded directly as a JSON number. --@@ -83,5 +93,5 @@ -- "1.2" instance Aeson.ToJSON Float32 where toJSON float32 = float32- & unpack+ & #unpack & Aeson.toJSON
library/Octane/Type/Frame.hs view
@@ -1,7 +1,13 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Frame (Frame(..)) where @@ -12,13 +18,13 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Aeson as Aeson import qualified Data.Bimap as Bimap+import qualified Data.Default.Class as Default import qualified Data.Map.Strict as Map+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.Text as StrictText import qualified GHC.Generics as Generics import qualified Octane.Data as Data-import qualified Octane.Type.CompressedWord as CompressedWord import qualified Octane.Type.Float32 as Float32-import qualified Octane.Type.Initialization as Initialization import qualified Octane.Type.Replication as Replication import qualified Octane.Type.State as State import qualified Octane.Type.Value as Value@@ -31,29 +37,31 @@ -- This cannot be an instance of 'Data.Binary.Bits.BinaryBit' because it -- requires out-of-band information (the class property map) to decode. data Frame = Frame- { number :: Word+ { frameNumber :: Word -- ^ This frame's number in the network stream. Starts at 0.- , isKeyFrame :: Bool+ , frameIsKeyFrame :: Bool -- ^ Is this frame a key frame?- , time :: Float32.Float32+ , frameTime :: Float32.Float32 -- ^ The since the start of the match that this frame occurred.- , delta :: Float32.Float32+ , frameDelta :: Float32.Float32 -- ^ The time between the last frame and this one.- , replications :: [Replication.Replication]+ , frameReplications :: [Replication.Replication] -- ^ A list of all the replications in this frame. } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''Frame)+ instance DeepSeq.NFData Frame where instance Aeson.ToJSON Frame where toJSON frame = Aeson.object- [ "Number" .= number frame- , "IsKeyFrame" .= isKeyFrame frame- , "Time" .= time frame- , "Delta" .= delta frame- , "Spawned" .= (frame & replications & getSpawned)- , "Updated" .= (frame & replications & getUpdated)- , "Destroyed" .= (frame & replications & getDestroyed)+ [ "Number" .= #number frame+ , "IsKeyFrame" .= #isKeyFrame frame+ , "Time" .= #time frame+ , "Delta" .= #delta frame+ , "Spawned" .= (frame & #replications & getSpawned)+ , "Updated" .= (frame & #replications & getUpdated)+ , "Destroyed" .= (frame & #replications & getDestroyed) ] @@ -62,12 +70,12 @@ instance Aeson.ToJSON Spawned where toJSON (Spawned xs) = xs & map (\ x -> do- let k = x & Replication.actorId & CompressedWord.value & show & StrictText.pack+ let k = x & #actorId & #value & show & StrictText.pack let v = Aeson.object- [ "Name" .= Replication.objectName x- , "Class" .= Replication.className x- , "Position" .= (x & Replication.initialization & fmap Initialization.location)- , "Rotation" .= (x & Replication.initialization & fmap Initialization.rotation)+ [ "Name" .= #objectName x+ , "Class" .= #className x+ , "Position" .= (x & #initialization & fmap #location)+ , "Rotation" .= (x & #initialization & fmap #rotation) ] (k, v)) & Map.fromList@@ -76,7 +84,7 @@ getSpawned :: [Replication.Replication] -> Spawned getSpawned xs = xs & filter (\ x -> x- & Replication.state+ & #state & (== State.SOpening)) & Spawned @@ -87,12 +95,12 @@ toJSON (Updated xs) = xs & map (\ x -> do let k = x- & Replication.actorId- & CompressedWord.value+ & #actorId+ & #value & show & StrictText.pack let v = x- & Replication.properties+ & #properties & Map.map (\ value -> Aeson.object [ "Type" .= getType value , "Value" .= getValue value@@ -105,10 +113,10 @@ getUpdated :: [Replication.Replication] -> Updated getUpdated xs = xs & filter (\ x -> x- & Replication.state+ & #state & (== State.SExisting)) & filter (\ x -> x- & Replication.properties+ & #properties & null & not) & Updated@@ -118,14 +126,14 @@ instance Aeson.ToJSON Destroyed where toJSON (Destroyed xs) = xs- & map Replication.actorId- & map CompressedWord.value+ & map #actorId+ & map #value & Aeson.toJSON getDestroyed :: [Replication.Replication] -> Destroyed getDestroyed xs = xs & filter (\ x -> x- & Replication.state+ & #state & (== State.SClosing)) & Destroyed
library/Octane/Type/Initialization.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Initialization ( Initialization(..)@@ -11,6 +17,8 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Binary.Bits.Get as BinaryBit import qualified Data.Binary.Bits.Put as BinaryBit+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.Set as Set import qualified Data.Text as StrictText import qualified GHC.Generics as Generics@@ -24,34 +32,36 @@ -- This cannot be an instance of 'Data.Binary.Bits.BinaryBit' because it -- requires out-of-band information (the class name) to decode. data Initialization = Initialization- { location :: Maybe (Vector.Vector Int)+ { initializationLocation :: Maybe (Vector.Vector Int) -- ^ The instance's initial position.- , rotation :: Maybe (Vector.Vector Int8.Int8)+ , initializationRotation :: Maybe (Vector.Vector Int8.Int8) -- ^ The instance's initial rotation. } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''Initialization)+ instance DeepSeq.NFData Initialization where -- | Gets the 'Initialization' for a given class. getInitialization :: StrictText.Text -> BinaryBit.BitGet Initialization getInitialization className = do- location' <- if Set.member className Data.classesWithLocation+ location <- if Set.member className Data.classesWithLocation then fmap Just Vector.getIntVector else pure Nothing- rotation' <- if Set.member className Data.classesWithRotation+ rotation <- if Set.member className Data.classesWithRotation then fmap Just Vector.getInt8Vector else pure Nothing- pure Initialization { location = location', rotation = rotation' }+ pure Initialization { initializationLocation = location, initializationRotation = rotation } -- | Puts the 'Initialization'. Note that unlike 'getInitialization', this does -- not require the class name. putInitialization :: Initialization -> BinaryBit.BitPut () putInitialization initialization = do- case location initialization of+ case #location initialization of Nothing -> pure () Just x -> Vector.putIntVector x- case rotation initialization of+ case #rotation initialization of Nothing -> pure () Just x -> Vector.putInt8Vector x
library/Octane/Type/Int32.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Int32 (Int32(..), fromInt32, toInt32) where @@ -15,16 +21,20 @@ import qualified Data.Binary.Get as Binary import qualified Data.Binary.Put as Binary import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Default.Class as Default import qualified Data.Int as Int+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Utility.Endian as Endian -- | A 32-bit signed integer. newtype Int32 = Int32- { unpack :: Int.Int32+ { int32Unpack :: Int.Int32 } deriving (Eq, Generics.Generic, Num, Ord) +$(OverloadedRecords.overloadedRecord Default.def ''Int32)+ -- | Little-endian. -- -- >>> Binary.decode "\x01\x00\x00\x00" :: Int32@@ -38,7 +48,7 @@ pure (Int32 value) put int32 = do- let value = unpack int32+ let value = #unpack int32 Binary.putInt32le value -- | Little-endian with the bits in each byte reversed.@@ -71,7 +81,7 @@ -- >>> show (1 :: Int32) -- "1" instance Show Int32 where- show int32 = show (unpack int32)+ show int32 = show (#unpack int32) -- | Encoded as a JSON number directly. --@@ -79,7 +89,7 @@ -- "1" instance Aeson.ToJSON Int32 where toJSON int32 = int32- & unpack+ & #unpack & Aeson.toJSON @@ -88,7 +98,7 @@ -- >>> fromInt32 1 :: Int.Int32 -- 1 fromInt32 :: (Integral a) => Int32 -> a-fromInt32 int32 = fromIntegral (unpack int32)+fromInt32 int32 = fromIntegral (#unpack int32) -- | Converts any 'Integral' value into a 'Int32'.
library/Octane/Type/Int8.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Int8 (Int8(..), fromInt8, toInt8) where @@ -15,7 +21,9 @@ import qualified Data.Binary.Get as Binary import qualified Data.Binary.Put as Binary import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Default.Class as Default import qualified Data.Int as Int+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Utility.Endian as Endian @@ -26,9 +34,11 @@ -- | A 8-bit signed integer. newtype Int8 = Int8- { unpack :: Int.Int8+ { int8Unpack :: Int.Int8 } deriving (Eq, Generics.Generic, Num, Ord) +$(OverloadedRecords.overloadedRecord Default.def ''Int8)+ -- | >>> Binary.decode "\x01" :: Int8 -- 1 --@@ -40,7 +50,7 @@ pure (Int8 value) put int8 = do- let value = unpack int8+ let value = #unpack int8 Binary.putInt8 value -- | Stored with the bits reversed.@@ -73,7 +83,7 @@ -- >>> show (1 :: Int8) -- "1" instance Show Int8 where- show int8 = show (unpack int8)+ show int8 = show (#unpack int8) -- | Encoded directly as a JSON number. --@@ -81,7 +91,7 @@ -- "1" instance Aeson.ToJSON Int8 where toJSON int8 = int8- & unpack+ & #unpack & Aeson.toJSON @@ -90,7 +100,7 @@ -- >>> fromInt8 1 :: Int.Int8 -- 1 fromInt8 :: (Integral a) => Int8 -> a-fromInt8 int8 = fromIntegral (unpack int8)+fromInt8 int8 = fromIntegral (#unpack int8) -- | Converts any 'Integral' value into a 'Int8'.
library/Octane/Type/KeyFrame.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.KeyFrame (KeyFrame(..)) where @@ -8,6 +14,8 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Binary as Binary+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.Float32 as Float32 import qualified Octane.Type.Word32 as Word32@@ -15,20 +23,22 @@ -- | A key frame. data KeyFrame = KeyFrame- { time :: Float32.Float32+ { keyFrameTime :: Float32.Float32 -- ^ When this key frame occurred.- , frame :: Word32.Word32+ , keyFrameFrame :: Word32.Word32 -- ^ Which frame this key frame corresponds to.- , position :: Word32.Word32+ , keyFramePosition :: Word32.Word32 -- ^ The bit position of the start of this key frame in the network stream. } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''KeyFrame)+ -- | Stored with the fields one after the other in order. -- -- >>> Binary.decode "\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00" :: KeyFrame--- KeyFrame {time = 0.0, frame = 0x00000001, position = 0x00000002}+-- KeyFrame {keyFrameTime = 0.0, keyFrameFrame = 0x00000001, keyFramePosition = 0x00000002} ----- >>> Binary.encode (KeyFrame { time = 0, frame = 1, position = 2 })+-- >>> Binary.encode (KeyFrame 0 1 2) -- "\NUL\NUL\NUL\NUL\SOH\NUL\NUL\NUL\STX\NUL\NUL\NUL" instance Binary.Binary KeyFrame where get = KeyFrame@@ -37,8 +47,8 @@ <*> Binary.get put keyFrame = do- keyFrame & time & Binary.put- keyFrame & frame & Binary.put- keyFrame & position & Binary.put+ keyFrame & #time & Binary.put+ keyFrame & #frame & Binary.put+ keyFrame & #position & Binary.put instance DeepSeq.NFData KeyFrame where
library/Octane/Type/List.hs view
@@ -1,5 +1,10 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} module Octane.Type.List (List(..)) where@@ -10,6 +15,8 @@ import qualified Control.Monad as Monad import qualified Data.Aeson as Aeson import qualified Data.Binary as Binary+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Exts as Exts import qualified GHC.Generics as Generics import qualified Octane.Type.Word32 as Word32@@ -20,9 +27,11 @@ -- | A list of values. newtype List a = List- { unpack :: [a]+ { listUnpack :: [a] } deriving (Eq, Generics.Generic, Ord) +$(OverloadedRecords.overloadedRecord Default.def ''List)+ -- | Prefixed with the number of elements in the list. -- -- >>> Binary.decode "\x01\x00\x00\x00\x02" :: List Int8@@ -37,8 +46,8 @@ elements & List & pure put list = do- list & unpack & length & fromIntegral & Word32.Word32 & Binary.put- list & unpack & mapM_ Binary.put+ list & #unpack & length & fromIntegral & Word32.Word32 & Binary.put+ list & #unpack & mapM_ Binary.put -- | Allows creating 'List' values with 'Exts.fromList'. Also allows 'List' -- literals with the @OverloadedLists@ extension.@@ -50,14 +59,14 @@ fromList items = List items - toList list = unpack list+ toList list = #unpack list instance (DeepSeq.NFData a) => DeepSeq.NFData (List a) where -- | >>> show ([2] :: List Int) -- "fromList [2]" instance (Show a) => Show (List a) where- show list = "fromList " ++ show (unpack list)+ show list = "fromList " ++ show (#unpack list) -- | Encoded as a JSON array directly. --@@ -65,5 +74,5 @@ -- "[2]" instance (Aeson.ToJSON a) => Aeson.ToJSON (List a) where toJSON list = list- & unpack+ & #unpack & Aeson.toJSON
library/Octane/Type/Mark.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Mark (Mark(..)) where @@ -8,23 +14,27 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Binary as Binary+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.Text as Text import qualified Octane.Type.Word32 as Word32 -- | A tick mark on the replay. Both goals and saves make tick marks. data Mark = Mark- { label :: Text.Text+ { markLabel :: Text.Text -- ^ The description of the tick mark. Typically something like -- @"Team0Goal"@ or @"Team1Save"@ or @"User"@.- , frame :: Word32.Word32+ , markFrame :: Word32.Word32 -- ^ Which frame this tick mark corresponds to. } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''Mark)+ -- | Fields are stored one after the other in order. -- -- >>> Binary.decode "\x02\x00\x00\x00\x4b\x00\x01\x00\x00\x00" :: Mark--- Mark {label = "K", frame = 0x00000001}+-- Mark {markLabel = "K", markFrame = 0x00000001} -- -- >>> Binary.encode (Mark "K" 1) -- "\STX\NUL\NUL\NULK\NUL\SOH\NUL\NUL\NUL"@@ -34,7 +44,7 @@ <*> Binary.get put mark = do- mark & label & Binary.put- mark & frame & Binary.put+ mark & #label & Binary.put+ mark & #frame & Binary.put instance DeepSeq.NFData Mark
library/Octane/Type/Message.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Message (Message(..)) where @@ -8,24 +14,28 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Binary as Binary+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.Text as Text import qualified Octane.Type.Word32 as Word32 -- | A debugging message. Replays do not have any of these anymore. data Message = Message- { frame :: Word32.Word32+ { messageFrame :: Word32.Word32 -- ^ The frame this message corresponds to.- , name :: Text.Text+ , messageName :: Text.Text -- ^ The primary player name.- , content :: Text.Text+ , messageContent :: Text.Text -- ^ The actual content of the message. } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''Message)+ -- | Fields stored in order, one after the other. -- -- >>> Binary.decode "\x01\x00\x00\x00\x02\x00\x00\x00\x41\x00\x02\x00\x00\x00\x42\x00" :: Message--- Message {frame = 0x00000001, name = "A", content = "B"}+-- Message {messageFrame = 0x00000001, messageName = "A", messageContent = "B"} -- -- >>> Binary.encode (Message 1 "A" "B") -- "\SOH\NUL\NUL\NUL\STX\NUL\NUL\NULA\NUL\STX\NUL\NUL\NULB\NUL"@@ -36,8 +46,8 @@ <*> Binary.get put message = do- message & frame & Binary.put- message & name & Binary.put- message & content & Binary.put+ message & #frame & Binary.put+ message & #name & Binary.put+ message & #content & Binary.put instance DeepSeq.NFData Message where
library/Octane/Type/OptimizedReplay.hs view
@@ -1,7 +1,13 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.OptimizedReplay ( OptimizedReplay(..)@@ -13,6 +19,8 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Binary as Binary+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.CacheItem as CacheItem import qualified Octane.Type.ClassItem as ClassItem@@ -34,22 +42,24 @@ -- -- See 'Octane.Type.Replay.Replay'. data OptimizedReplay = OptimizedReplay- { version1 :: Word32.Word32- , version2 :: Word32.Word32- , label :: Text.Text- , properties :: Dictionary.Dictionary Property.Property- , levels :: List.List Text.Text- , keyFrames :: List.List KeyFrame.KeyFrame- , frames :: [Frame.Frame]- , messages :: List.List Message.Message- , marks :: List.List Mark.Mark- , packages :: List.List Text.Text- , objects :: List.List Text.Text- , names :: List.List Text.Text- , classes :: List.List ClassItem.ClassItem- , cache :: List.List CacheItem.CacheItem+ { optimizedReplayVersion1 :: Word32.Word32+ , optimizedReplayVersion2 :: Word32.Word32+ , optimizedReplayLabel :: Text.Text+ , optimizedReplayProperties :: Dictionary.Dictionary Property.Property+ , optimizedReplayLevels :: List.List Text.Text+ , optimizedReplayKeyFrames :: List.List KeyFrame.KeyFrame+ , optimizedReplayFrames :: [Frame.Frame]+ , optimizedReplayMessages :: List.List Message.Message+ , optimizedReplayMarks :: List.List Mark.Mark+ , optimizedReplayPackages :: List.List Text.Text+ , optimizedReplayObjects :: List.List Text.Text+ , optimizedReplayNames :: List.List Text.Text+ , optimizedReplayClasses :: List.List ClassItem.ClassItem+ , optimizedReplayCache :: List.List CacheItem.CacheItem } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''OptimizedReplay)+ instance Binary.Binary OptimizedReplay where get = do replayWithFrames <- Binary.get@@ -66,41 +76,40 @@ -- Operates in a 'Monad' so that it can 'fail' somewhat gracefully. fromReplayWithFrames :: (Monad m) => ReplayWithFrames.ReplayWithFrames -> m OptimizedReplay fromReplayWithFrames replayWithFrames = do- pure OptimizedReplay- { version1 = replayWithFrames & ReplayWithFrames.version1- , version2 = replayWithFrames & ReplayWithFrames.version2- , label = replayWithFrames & ReplayWithFrames.label- , properties = replayWithFrames & ReplayWithFrames.properties- , levels = replayWithFrames & ReplayWithFrames.levels- , keyFrames = replayWithFrames & ReplayWithFrames.keyFrames- , frames = replayWithFrames & ReplayWithFrames.frames & Optimizer.optimizeFrames- , messages = replayWithFrames & ReplayWithFrames.messages- , marks = replayWithFrames & ReplayWithFrames.marks- , packages = replayWithFrames & ReplayWithFrames.packages- , objects = replayWithFrames & ReplayWithFrames.objects- , names = replayWithFrames & ReplayWithFrames.names- , classes = replayWithFrames & ReplayWithFrames.classes- , cache = replayWithFrames & ReplayWithFrames.cache- }+ let frames = replayWithFrames & #frames & Optimizer.optimizeFrames+ pure (OptimizedReplay+ (#version1 replayWithFrames)+ (#version2 replayWithFrames)+ (#label replayWithFrames)+ (#properties replayWithFrames)+ (#levels replayWithFrames)+ (#keyFrames replayWithFrames)+ frames+ (#messages replayWithFrames)+ (#marks replayWithFrames)+ (#packages replayWithFrames)+ (#objects replayWithFrames)+ (#names replayWithFrames)+ (#classes replayWithFrames)+ (#cache replayWithFrames)) -- | Converts an 'OptimizedReplay' into a 'ReplayWithFrames.ReplayWithFrames'. -- Operates in a 'Monad' so that it can 'fail' somewhat gracefully. toReplayWithFrames :: (Monad m) => OptimizedReplay -> m ReplayWithFrames.ReplayWithFrames toReplayWithFrames optimizedReplay = do- pure ReplayWithFrames.ReplayWithFrames- { ReplayWithFrames.version1 = optimizedReplay & version1- , ReplayWithFrames.version2 = optimizedReplay & version2- , ReplayWithFrames.label = optimizedReplay & label- , ReplayWithFrames.properties = optimizedReplay & properties- , ReplayWithFrames.levels = optimizedReplay & levels- , ReplayWithFrames.keyFrames = optimizedReplay & keyFrames- , ReplayWithFrames.frames = optimizedReplay & frames- , ReplayWithFrames.messages = optimizedReplay & messages- , ReplayWithFrames.marks = optimizedReplay & marks- , ReplayWithFrames.packages = optimizedReplay & packages- , ReplayWithFrames.objects = optimizedReplay & objects- , ReplayWithFrames.names = optimizedReplay & names- , ReplayWithFrames.classes = optimizedReplay & classes- , ReplayWithFrames.cache = optimizedReplay & cache- }+ pure (ReplayWithFrames.ReplayWithFrames+ (#version1 optimizedReplay)+ (#version2 optimizedReplay)+ (#label optimizedReplay)+ (#properties optimizedReplay)+ (#levels optimizedReplay)+ (#keyFrames optimizedReplay)+ (#frames optimizedReplay)+ (#messages optimizedReplay)+ (#marks optimizedReplay)+ (#packages optimizedReplay)+ (#objects optimizedReplay)+ (#names optimizedReplay)+ (#classes optimizedReplay)+ (#cache optimizedReplay))
library/Octane/Type/Property.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StrictData #-} @@ -21,6 +21,7 @@ import qualified Octane.Type.Word64 as Word64 +-- TODO: Split these into individual data types like RemoteId. -- | A metadata property. All properties have a size, but only some actually -- use it. The value stored in the property can be an array, a boolean, and -- so on.@@ -77,14 +78,14 @@ _ | kind == floatProperty -> do size <- Binary.get- value <- case Word64.unpack size of+ value <- case #unpack size of 4 -> Binary.get x -> fail ("unknown FloatProperty size " ++ show x) value & FloatProperty size & pure _ | kind == intProperty -> do size <- Binary.get- value <- case Word64.unpack size of+ value <- case #unpack size of 4 -> Binary.get x -> fail ("unknown IntProperty size " ++ show x) value & IntProperty size & pure@@ -96,7 +97,7 @@ _ | kind == qWordProperty -> do size <- Binary.get- value <- case Word64.unpack size of+ value <- case #unpack size of 8 -> Binary.get x -> fail ("unknown QWordProperty size " ++ show x) value & QWordProperty size & pure@@ -106,7 +107,7 @@ value <- Binary.get value & StrProperty size & pure - _ -> fail ("unknown property type " ++ show (Text.unpack kind))+ _ -> fail ("unknown property type " ++ show (#unpack kind)) put property = case property of
library/Octane/Type/RawReplay.hs view
@@ -1,12 +1,14 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}-{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} -module Octane.Type.RawReplay- ( RawReplay(..)- , newRawReplay- ) where+module Octane.Type.RawReplay (RawReplay(..), newRawReplay) where import qualified Control.DeepSeq as DeepSeq import qualified Control.Monad as Monad@@ -14,6 +16,8 @@ import qualified Data.Binary.Get as Binary import qualified Data.Binary.Put as Binary import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Utility.CRC as CRC import qualified Octane.Type.Word32 as Word32@@ -25,24 +29,26 @@ -- -- See 'Octane.Type.ReplayWithoutFrames.ReplayWithoutFrames'. data RawReplay = RawReplay- { headerSize :: Word32.Word32+ { rawReplayHeaderSize :: Word32.Word32 -- ^ The byte size of the first section.- , headerCRC :: Word32.Word32+ , rawReplayHeaderCRC :: Word32.Word32 -- ^ The CRC of the first section.- , header :: LazyBytes.ByteString+ , rawReplayHeader :: LazyBytes.ByteString -- ^ The first section.- , contentSize :: Word32.Word32+ , rawReplayContentSize :: Word32.Word32 -- ^ The byte size of the second section.- , contentCRC :: Word32.Word32+ , rawReplayContentCRC :: Word32.Word32 -- ^ The CRC of the second section.- , content :: LazyBytes.ByteString+ , rawReplayContent :: LazyBytes.ByteString -- ^ The second section.- , footer :: LazyBytes.ByteString+ , rawReplayFooter :: LazyBytes.ByteString -- ^ Arbitrary data after the second section. In replays generated by -- Rocket League, this is always empty. However it is not technically -- invalid to put something here. } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''RawReplay)+ -- | Decoding will fail if the CRCs don't match, but it is possible to encode -- invalid replays. That means @decode (encode rawReplay)@ can fail. instance Binary.Binary RawReplay where@@ -59,18 +65,18 @@ footer <- Binary.getRemainingLazyByteString - pure RawReplay { .. }+ pure (RawReplay headerSize headerCRC header contentSize contentCRC content footer) put replay = do- Binary.put (headerSize replay)- Binary.put (headerCRC replay)- Binary.putLazyByteString (header replay)+ Binary.put (#headerSize replay)+ Binary.put (#headerCRC replay)+ Binary.putLazyByteString (#header replay) - Binary.put (contentSize replay)- Binary.put (contentCRC replay)- Binary.putLazyByteString (content replay)+ Binary.put (#contentSize replay)+ Binary.put (#contentCRC replay)+ Binary.putLazyByteString (#content replay) - Binary.putLazyByteString (footer replay)+ Binary.putLazyByteString (#footer replay) instance DeepSeq.NFData RawReplay where @@ -89,7 +95,7 @@ let contentSize = Word32.toWord32 (LazyBytes.length content) let contentCRC = Word32.Word32 (CRC.crc32 content) - RawReplay { .. }+ RawReplay headerSize headerCRC header contentSize contentCRC content footer checkCRC :: (Monad m) => Word32.Word32 -> LazyBytes.ByteString -> m ()
library/Octane/Type/RemoteId.hs view
@@ -1,7 +1,13 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.RemoteId ( RemoteId(..)@@ -20,6 +26,8 @@ import qualified Data.Binary.Bits.Get as BinaryBit import qualified Data.Binary.Bits.Put as BinaryBit import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.Text as StrictText import qualified Data.Text.Encoding as Encoding import qualified GHC.Generics as Generics@@ -33,50 +41,17 @@ -- >>> import qualified Data.Binary.Put as Binary --- | A player's canonical remote ID. This is the best way to uniquely identify--- players-data RemoteId- = RemotePlayStationId PlayStationId- | RemoteSplitscreenId SplitscreenId- | RemoteSteamId SteamId- | RemoteXboxId XboxId- deriving (Eq, Generics.Generic, Show)--instance DeepSeq.NFData RemoteId where---- | Encodes the remote ID as an object with "Type" and "Value" keys.------ >>> Aeson.encode (RemoteSteamId (SteamId 1))--- "{\"Value\":1,\"Type\":\"Steam\"}"-instance Aeson.ToJSON RemoteId where- toJSON remoteId = case remoteId of- RemotePlayStationId x -> Aeson.object- [ "Type" .= ("PlayStation" :: Text.Text)- , "Value" .= Aeson.toJSON x- ]- RemoteSplitscreenId x -> Aeson.object- [ "Type" .= ("Splitscreen" :: Text.Text)- , "Value" .= Aeson.toJSON x- ]- RemoteSteamId x -> Aeson.object- [ "Type" .= ("Steam" :: Text.Text)- , "Value" .= Aeson.toJSON x- ]- RemoteXboxId x -> Aeson.object- [ "Type" .= ("Xbox" :: Text.Text)- , "Value" .= Aeson.toJSON x- ]-- data PlayStationId = PlayStationId- { playStationName :: Text.Text- , playStationUnknown :: LazyBytes.ByteString+ { playStationIdName :: Text.Text+ , playStationIdUnknown :: LazyBytes.ByteString } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''PlayStationId)+ -- | Each part is stored as exactly 16 bits. -- -- >>> Binary.runGet (BinaryBit.runBitGet (BinaryBit.getBits 0)) "\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80" :: PlayStationId--- PlayStationId {playStationName = "B", playStationUnknown = "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\SOH"}+-- PlayStationId {playStationIdName = "B", playStationIdUnknown = "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\SOH"} -- -- >>> Binary.runPut (BinaryBit.runBitPut (BinaryBit.putBits 0 (PlayStationId "A" "\x01"))) -- "\130\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\128"@@ -98,8 +73,8 @@ putBits _ playStationId = do playStationId- & playStationName- & Text.unpack+ & #name+ & #unpack & StrictText.justifyLeft 16 '\x00' & StrictText.take 16 & Text.encodeLatin1@@ -107,7 +82,7 @@ & BinaryBit.putByteString playStationId- & playStationUnknown+ & #unknown & LazyBytes.toStrict & Endian.reverseBitsInStrictBytes & BinaryBit.putByteString@@ -118,9 +93,9 @@ -- "{\"Unknown\":\"0x42\",\"Name\":\"A\"}" instance Aeson.ToJSON PlayStationId where toJSON playStationId = Aeson.object- [ "Name" .= playStationName playStationId+ [ "Name" .= #name playStationId , "Unknown" .= (playStationId- & playStationUnknown+ & #unknown & LazyBytes.unpack & concatMap (Printf.printf "%02x") & ("0x" ++)@@ -129,13 +104,15 @@ newtype SplitscreenId = SplitscreenId- { unpackSplitscreenId :: Maybe Int+ { splitscreenIdUnpack :: Maybe Int } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''SplitscreenId)+ -- | Stored as a bare byte string. -- -- >>> Binary.runGet (BinaryBit.runBitGet (BinaryBit.getBits 0)) "\x00\x00\x00" :: SplitscreenId--- SplitscreenId {unpackSplitscreenId = Just 0}+-- SplitscreenId {splitscreenIdUnpack = Just 0} -- -- >>> Binary.runPut (BinaryBit.runBitPut (BinaryBit.putBits 0 (SplitscreenId (Just 0)))) -- "\NUL\NUL\NUL"@@ -161,17 +138,19 @@ -- >>> Aeson.encode (SplitscreenId (Just 0)) -- "0" instance Aeson.ToJSON SplitscreenId where- toJSON splitscreenId = splitscreenId & unpackSplitscreenId & Aeson.toJSON+ toJSON splitscreenId = splitscreenId & #unpack & Aeson.toJSON newtype SteamId = SteamId- { unpackSteamId :: Word64.Word64+ { steamIdUnpack :: Word64.Word64 } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''SteamId)+ -- | Stored as a plain 'Word64.Word64'. -- -- >>> Binary.runGet (BinaryBit.runBitGet (BinaryBit.getBits 0)) "\x80\x00\x00\x00\x00\x00\x00\x00" :: SteamId--- SteamId {unpackSteamId = 0x0000000000000001}+-- SteamId {steamIdUnpack = 0x0000000000000001} -- -- >>> Binary.runPut (BinaryBit.runBitPut (BinaryBit.putBits 0 (SteamId 1))) -- "\128\NUL\NUL\NUL\NUL\NUL\NUL\NUL"@@ -180,7 +159,7 @@ steamId <- BinaryBit.getBits 0 pure (SteamId steamId) - putBits _ steamId = steamId & unpackSteamId & BinaryBit.putBits 0+ putBits _ steamId = steamId & #unpack & BinaryBit.putBits 0 instance DeepSeq.NFData SteamId where @@ -189,17 +168,19 @@ -- >>> Aeson.encode (SteamId 1) -- "1" instance Aeson.ToJSON SteamId where- toJSON steamId = steamId & unpackSteamId & Aeson.toJSON+ toJSON steamId = steamId & #unpack & Aeson.toJSON newtype XboxId = XboxId- { unpackXboxId :: Word64.Word64+ { xboxIdUnpack :: Word64.Word64 } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''XboxId)+ -- | Stored as a plain 'Word64.Word64'. -- -- >>> Binary.runGet (BinaryBit.runBitGet (BinaryBit.getBits 0)) "\x80\x00\x00\x00\x00\x00\x00\x00" :: XboxId--- XboxId {unpackXboxId = 0x0000000000000001}+-- XboxId {xboxIdUnpack = 0x0000000000000001} -- -- >>> Binary.runPut (BinaryBit.runBitPut (BinaryBit.putBits 0 (XboxId 1))) -- "\128\NUL\NUL\NUL\NUL\NUL\NUL\NUL"@@ -208,7 +189,7 @@ xboxId <- BinaryBit.getBits 0 pure (XboxId xboxId) - putBits _ xboxId = xboxId & unpackXboxId & BinaryBit.putBits 0+ putBits _ xboxId = xboxId & #unpack & BinaryBit.putBits 0 instance DeepSeq.NFData XboxId where@@ -218,4 +199,39 @@ -- >>> Aeson.encode (XboxId 1) -- "1" instance Aeson.ToJSON XboxId where- toJSON xboxId = xboxId & unpackXboxId & Aeson.toJSON+ toJSON xboxId = xboxId & #unpack & Aeson.toJSON+++-- | A player's canonical remote ID. This is the best way to uniquely identify+-- players+data RemoteId+ = RemotePlayStationId PlayStationId+ | RemoteSplitscreenId SplitscreenId+ | RemoteSteamId SteamId+ | RemoteXboxId XboxId+ deriving (Eq, Generics.Generic, Show)++instance DeepSeq.NFData RemoteId where++-- | Encodes the remote ID as an object with "Type" and "Value" keys.+--+-- >>> Aeson.encode (RemoteSteamId (SteamId 1))+-- "{\"Value\":1,\"Type\":\"Steam\"}"+instance Aeson.ToJSON RemoteId where+ toJSON remoteId = case remoteId of+ RemotePlayStationId x -> Aeson.object+ [ "Type" .= ("PlayStation" :: Text.Text)+ , "Value" .= Aeson.toJSON x+ ]+ RemoteSplitscreenId x -> Aeson.object+ [ "Type" .= ("Splitscreen" :: Text.Text)+ , "Value" .= Aeson.toJSON x+ ]+ RemoteSteamId x -> Aeson.object+ [ "Type" .= ("Steam" :: Text.Text)+ , "Value" .= Aeson.toJSON x+ ]+ RemoteXboxId x -> Aeson.object+ [ "Type" .= ("Xbox" :: Text.Text)+ , "Value" .= Aeson.toJSON x+ ]
library/Octane/Type/Replay.hs view
@@ -1,9 +1,19 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} -module Octane.Type.Replay (Replay(..), fromOptimizedReplay, toOptimizedReplay) where+module Octane.Type.Replay+ ( Replay(..)+ , fromOptimizedReplay+ , toOptimizedReplay+ ) where import Data.Aeson ((.=)) import Data.Function ((&))@@ -11,7 +21,9 @@ import qualified Control.DeepSeq as DeepSeq import qualified Data.Aeson as Aeson import qualified Data.Binary as Binary-import qualified Data.Map as Map+import qualified Data.Default.Class as Default+import qualified Data.Map.Strict as Map+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.Text as StrictText import qualified Data.Version as Version import qualified GHC.Generics as Generics@@ -31,8 +43,8 @@ -- to work with. It can be converted all the way back down to a -- 'Octane.Type.RawReplay.RawReplay' for serialization. data Replay = Replay- { version :: Version.Version- , metadata :: Map.Map StrictText.Text Property.Property+ { replayVersion :: Version.Version+ , replayMetadata :: Map.Map StrictText.Text Property.Property -- ^ High-level metadata about the replay. Only one key is actually -- required to be able to view the replay in Rocket League: --@@ -72,13 +84,15 @@ -- team. This value is not validated, so you can put absurd values like -- @99@. To get an "unfair" team size like 1v4, you must set the -- @"bUnfairBots"@ 'Property.BoolProperty' to @True@.- , levels :: [StrictText.Text]- , messages :: Map.Map StrictText.Text StrictText.Text- , tickMarks :: Map.Map StrictText.Text StrictText.Text- , packages :: [StrictText.Text]- , frames :: [Frame.Frame]+ , replayLevels :: [StrictText.Text]+ , replayMessages :: Map.Map StrictText.Text StrictText.Text+ , replayTickMarks :: Map.Map StrictText.Text StrictText.Text+ , replayPackages :: [StrictText.Text]+ , replayFrames :: [Frame.Frame] } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''Replay)+ instance Binary.Binary Replay where get = do optimizedReplay <- Binary.get@@ -92,13 +106,13 @@ instance Aeson.ToJSON Replay where toJSON replay = Aeson.object- [ "Version" .= version replay- , "Metadata" .= metadata replay- , "Levels" .= levels replay- , "Messages" .= messages replay- , "TickMarks" .= tickMarks replay- , "Packages" .= packages replay- , "Frames" .= frames replay+ [ "Version" .= #version replay+ , "Metadata" .= #metadata replay+ , "Levels" .= #levels replay+ , "Messages" .= #messages replay+ , "TickMarks" .= #tickMarks replay+ , "Packages" .= #packages replay+ , "Frames" .= #frames replay ] @@ -107,52 +121,52 @@ fromOptimizedReplay :: (Monad m) => OptimizedReplay.OptimizedReplay -> m Replay fromOptimizedReplay optimizedReplay = do pure Replay- { version =- [ OptimizedReplay.version1 optimizedReplay- , OptimizedReplay.version2 optimizedReplay+ { replayVersion =+ [ #version1 optimizedReplay+ , #version2 optimizedReplay ] & map Word32.fromWord32 & Version.makeVersion- , metadata = optimizedReplay- & OptimizedReplay.properties- & Dictionary.unpack- & Map.mapKeys Text.unpack- , levels = optimizedReplay- & OptimizedReplay.levels- & List.unpack- & map Text.unpack- , messages = optimizedReplay- & OptimizedReplay.messages- & List.unpack+ , replayMetadata = optimizedReplay+ & #properties+ & #unpack+ & Map.mapKeys #unpack+ , replayLevels = optimizedReplay+ & #levels+ & #unpack+ & map #unpack+ , replayMessages = optimizedReplay+ & #messages+ & #unpack & map (\ message -> do let key = message- & Message.frame- & Word32.unpack+ & #frame+ & #unpack & show & StrictText.pack let value = message- & Message.content- & Text.unpack+ & #content+ & #unpack (key, value)) & Map.fromList- , tickMarks = optimizedReplay- & OptimizedReplay.marks- & List.unpack+ , replayTickMarks = optimizedReplay+ & #marks+ & #unpack & map (\ mark -> do let key = mark- & Mark.frame- & Word32.unpack+ & #frame+ & #unpack & show & StrictText.pack let value = mark- & Mark.label- & Text.unpack+ & #label+ & #unpack (key, value)) & Map.fromList- , packages = optimizedReplay- & OptimizedReplay.packages- & List.unpack- & map Text.unpack- , frames = optimizedReplay- & OptimizedReplay.frames+ , replayPackages = optimizedReplay+ & #packages+ & #unpack+ & map #unpack+ , replayFrames = optimizedReplay+ & #frames } @@ -161,54 +175,54 @@ toOptimizedReplay :: (Monad m) => Replay -> m OptimizedReplay.OptimizedReplay toOptimizedReplay replay = do let [version1, version2] = replay- & version+ & #version & Version.versionBranch & map Word32.toWord32 -- Key frames aren't important for replays. Mark the first frame as a key -- frame and the rest as regular frames. let frames_ = replay- & frames+ & #frames & zip [0 :: Int ..]- & map (\ (index, frame) -> frame { Frame.isKeyFrame = index == 0 })+ & map (\ (index, frame) -> frame { Frame.frameIsKeyFrame = index == 0 }) pure OptimizedReplay.OptimizedReplay- { OptimizedReplay.version1 = version1- , OptimizedReplay.version2 = version2- , OptimizedReplay.label = "TAGame.Replay_Soccar_TA"- , OptimizedReplay.properties = replay & metadata & Map.mapKeys Text.Text & Dictionary.Dictionary- , OptimizedReplay.levels = replay & levels & map Text.Text & List.List- , OptimizedReplay.keyFrames = frames_- & filter Frame.isKeyFrame+ { OptimizedReplay.optimizedReplayVersion1 = version1+ , OptimizedReplay.optimizedReplayVersion2 = version2+ , OptimizedReplay.optimizedReplayLabel = "TAGame.Replay_Soccar_TA"+ , OptimizedReplay.optimizedReplayProperties = replay & #metadata & Map.mapKeys Text.Text & Dictionary.Dictionary+ , OptimizedReplay.optimizedReplayLevels = replay & #levels & map Text.Text & List.List+ , OptimizedReplay.optimizedReplayKeyFrames = frames_+ & filter #isKeyFrame & map (\ frame -> KeyFrame.KeyFrame- (Frame.time frame)- (frame & Frame.number & Word32.toWord32)+ (#time frame)+ (frame & #number & Word32.toWord32) 0) & List.List- , OptimizedReplay.frames = frames_- , OptimizedReplay.messages = replay- & messages+ , OptimizedReplay.optimizedReplayFrames = frames_+ , OptimizedReplay.optimizedReplayMessages = replay+ & #messages & Map.toList & map (\ (key, value) -> do let frame = key & StrictText.unpack & read & Word32.Word32 let content = value & Text.Text Message.Message frame "" content) & List.List- , OptimizedReplay.marks = replay- & tickMarks+ , OptimizedReplay.optimizedReplayMarks = replay+ & #tickMarks & Map.toList & map (\ (key, value) -> do let label = value & Text.Text let frame = key & StrictText.unpack & read & Word32.Word32 Mark.Mark label frame) & List.List- , OptimizedReplay.packages = replay- & packages+ , OptimizedReplay.optimizedReplayPackages = replay+ & #packages & map Text.Text & List.List- , OptimizedReplay.objects = List.List [] -- TODO+ , OptimizedReplay.optimizedReplayObjects = List.List [] -- TODO -- TODO: This list is usually empty. Also the parser doesn't use it at -- all. Is it safe for it to always be empty?- , OptimizedReplay.names = List.List []- , OptimizedReplay.classes = List.List [] -- TODO- , OptimizedReplay.cache = List.List [] -- TODO+ , OptimizedReplay.optimizedReplayNames = List.List []+ , OptimizedReplay.optimizedReplayClasses = List.List [] -- TODO+ , OptimizedReplay.optimizedReplayCache = List.List [] -- TODO }
library/Octane/Type/ReplayWithFrames.hs view
@@ -1,13 +1,23 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}--module Octane.Type.ReplayWithFrames (ReplayWithFrames(..), fromReplayWithoutFrames, toReplayWithoutFrames) where+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} -import Data.Function ((&))+module Octane.Type.ReplayWithFrames+ ( ReplayWithFrames(..)+ , fromReplayWithoutFrames+ , toReplayWithoutFrames+ ) where import qualified Control.DeepSeq as DeepSeq import qualified Data.Binary as Binary+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.CacheItem as CacheItem import qualified Octane.Type.ClassItem as ClassItem@@ -30,22 +40,24 @@ -- -- See 'Octane.Type.OptimizedReplay.OptimizedReplay'. data ReplayWithFrames = ReplayWithFrames- { version1 :: Word32.Word32- , version2 :: Word32.Word32- , label :: Text.Text- , properties :: Dictionary.Dictionary Property.Property- , levels :: List.List Text.Text- , keyFrames :: List.List KeyFrame.KeyFrame- , frames :: [Frame.Frame]- , messages :: List.List Message.Message- , marks :: List.List Mark.Mark- , packages :: List.List Text.Text- , objects :: List.List Text.Text- , names :: List.List Text.Text- , classes :: List.List ClassItem.ClassItem- , cache :: List.List CacheItem.CacheItem+ { replayWithFramesVersion1 :: Word32.Word32+ , replayWithFramesVersion2 :: Word32.Word32+ , replayWithFramesLabel :: Text.Text+ , replayWithFramesProperties :: Dictionary.Dictionary Property.Property+ , replayWithFramesLevels :: List.List Text.Text+ , replayWithFramesKeyFrames :: List.List KeyFrame.KeyFrame+ , replayWithFramesFrames :: [Frame.Frame]+ , replayWithFramesMessages :: List.List Message.Message+ , replayWithFramesMarks :: List.List Mark.Mark+ , replayWithFramesPackages :: List.List Text.Text+ , replayWithFramesObjects :: List.List Text.Text+ , replayWithFramesNames :: List.List Text.Text+ , replayWithFramesClasses :: List.List ClassItem.ClassItem+ , replayWithFramesCache :: List.List CacheItem.CacheItem } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''ReplayWithFrames)+ instance Binary.Binary ReplayWithFrames where get = do replayWithoutFrames <- Binary.get@@ -62,46 +74,45 @@ -- Operates in a 'Monad' so that it can 'fail' somewhat gracefully. fromReplayWithoutFrames :: (Monad m) => ReplayWithoutFrames.ReplayWithoutFrames -> m ReplayWithFrames fromReplayWithoutFrames replayWithoutFrames = do- pure ReplayWithFrames- { version1 = replayWithoutFrames & ReplayWithoutFrames.version1- , version2 = replayWithoutFrames & ReplayWithoutFrames.version2- , label = replayWithoutFrames & ReplayWithoutFrames.label- , properties = replayWithoutFrames & ReplayWithoutFrames.properties- , levels = replayWithoutFrames & ReplayWithoutFrames.levels- , keyFrames = replayWithoutFrames & ReplayWithoutFrames.keyFrames- , frames = replayWithoutFrames & Parser.parseStream- , messages = replayWithoutFrames & ReplayWithoutFrames.messages- , marks = replayWithoutFrames & ReplayWithoutFrames.marks- , packages = replayWithoutFrames & ReplayWithoutFrames.packages- , objects = replayWithoutFrames & ReplayWithoutFrames.objects- , names = replayWithoutFrames & ReplayWithoutFrames.names- , classes = replayWithoutFrames & ReplayWithoutFrames.classes- , cache = replayWithoutFrames & ReplayWithoutFrames.cache- }+ pure (ReplayWithFrames+ (#version1 replayWithoutFrames)+ (#version2 replayWithoutFrames)+ (#label replayWithoutFrames)+ (#properties replayWithoutFrames)+ (#levels replayWithoutFrames)+ (#keyFrames replayWithoutFrames)+ (Parser.parseStream replayWithoutFrames)+ (#messages replayWithoutFrames)+ (#marks replayWithoutFrames)+ (#packages replayWithoutFrames)+ (#objects replayWithoutFrames)+ (#names replayWithoutFrames)+ (#classes replayWithoutFrames)+ (#cache replayWithoutFrames)) -- | Converts a 'ReplayWithFrames' into a 'ReplayWithoutFrames.ReplayWithoutFrames'. -- Operates in a 'Monad' so that it can 'fail' somewhat gracefully. toReplayWithoutFrames :: (Monad m) => ReplayWithFrames -> m ReplayWithoutFrames.ReplayWithoutFrames toReplayWithoutFrames replayWithFrames = do- pure ReplayWithoutFrames.ReplayWithoutFrames- { ReplayWithoutFrames.version1 = replayWithFrames & version1- , ReplayWithoutFrames.version2 = replayWithFrames & version2- , ReplayWithoutFrames.label = replayWithFrames & label- , ReplayWithoutFrames.properties = replayWithFrames & properties- , ReplayWithoutFrames.levels = replayWithFrames & levels- , ReplayWithoutFrames.keyFrames = replayWithFrames & keyFrames- , ReplayWithoutFrames.stream = Generator.generateStream- (replayWithFrames & frames)- (replayWithFrames & objects)- (replayWithFrames & names)- (replayWithFrames & classes)- (replayWithFrames & cache)- , ReplayWithoutFrames.messages = replayWithFrames & messages- , ReplayWithoutFrames.marks = replayWithFrames & marks- , ReplayWithoutFrames.packages = replayWithFrames & packages- , ReplayWithoutFrames.objects = replayWithFrames & objects- , ReplayWithoutFrames.names = replayWithFrames & names- , ReplayWithoutFrames.classes = replayWithFrames & classes- , ReplayWithoutFrames.cache = replayWithFrames & cache- }+ let stream = Generator.generateStream+ (#frames replayWithFrames)+ (#objects replayWithFrames)+ (#names replayWithFrames)+ (#classes replayWithFrames)+ (#cache replayWithFrames)+ pure (ReplayWithoutFrames.ReplayWithoutFrames+ (#version1 replayWithFrames)+ (#version2 replayWithFrames)+ (#label replayWithFrames)+ (#properties replayWithFrames)+ (#levels replayWithFrames)+ (#keyFrames replayWithFrames)+ stream+ (#messages replayWithFrames)+ (#marks replayWithFrames)+ (#packages replayWithFrames)+ (#objects replayWithFrames)+ (#names replayWithFrames)+ (#classes replayWithFrames)+ (#cache replayWithFrames))
library/Octane/Type/ReplayWithoutFrames.hs view
@@ -1,15 +1,26 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}-{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} -module Octane.Type.ReplayWithoutFrames (ReplayWithoutFrames(..), fromRawReplay, toRawReplay) where+module Octane.Type.ReplayWithoutFrames+ ( ReplayWithoutFrames(..)+ , fromRawReplay+ , toRawReplay+ ) where import qualified Control.DeepSeq as DeepSeq import qualified Data.Binary as Binary import qualified Data.Binary.Get as Binary import qualified Data.Binary.Put as Binary import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.CacheItem as CacheItem import qualified Octane.Type.ClassItem as ClassItem@@ -30,22 +41,24 @@ -- -- See 'Octane.Type.ReplayWithFrames.ReplayWithFrames'. data ReplayWithoutFrames = ReplayWithoutFrames- { version1 :: Word32.Word32- , version2 :: Word32.Word32- , label :: Text.Text- , properties :: Dictionary.Dictionary Property.Property- , levels :: List.List Text.Text- , keyFrames :: List.List KeyFrame.KeyFrame- , stream :: Stream.Stream- , messages :: List.List Message.Message- , marks :: List.List Mark.Mark- , packages :: List.List Text.Text- , objects :: List.List Text.Text- , names :: List.List Text.Text- , classes :: List.List ClassItem.ClassItem- , cache :: List.List CacheItem.CacheItem+ { replayWithoutFramesVersion1 :: Word32.Word32+ , replayWithoutFramesVersion2 :: Word32.Word32+ , replayWithoutFramesLabel :: Text.Text+ , replayWithoutFramesProperties :: Dictionary.Dictionary Property.Property+ , replayWithoutFramesLevels :: List.List Text.Text+ , replayWithoutFramesKeyFrames :: List.List KeyFrame.KeyFrame+ , replayWithoutFramesStream :: Stream.Stream+ , replayWithoutFramesMessages :: List.List Message.Message+ , replayWithoutFramesMarks :: List.List Mark.Mark+ , replayWithoutFramesPackages :: List.List Text.Text+ , replayWithoutFramesObjects :: List.List Text.Text+ , replayWithoutFramesNames :: List.List Text.Text+ , replayWithoutFramesClasses :: List.List ClassItem.ClassItem+ , replayWithoutFramesCache :: List.List CacheItem.CacheItem } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''ReplayWithoutFrames)+ instance Binary.Binary ReplayWithoutFrames where get = do rawReplay <- Binary.get@@ -62,8 +75,8 @@ -- Operates in a 'Monad' so that it can 'fail' somewhat gracefully. fromRawReplay :: (Monad m) => RawReplay.RawReplay -> m ReplayWithoutFrames fromRawReplay rawReplay = do- let header = RawReplay.header rawReplay- let content = RawReplay.content rawReplay+ let header = #header rawReplay+ let content = #content rawReplay let get = do version1 <- Binary.get@@ -81,7 +94,21 @@ classes <- Binary.get cache <- Binary.get - pure ReplayWithoutFrames { .. }+ pure (ReplayWithoutFrames+ version1+ version2+ label+ properties+ levels+ keyFrames+ stream+ messages+ marks+ packages+ objects+ names+ classes+ cache) let bytes = LazyBytes.append header content pure (Binary.runGet get bytes)@@ -92,22 +119,22 @@ toRawReplay :: (Monad m) => ReplayWithoutFrames -> m RawReplay.RawReplay toRawReplay replay = do let header = Binary.runPut (do- Binary.put (version1 replay)- Binary.put (version2 replay)- Binary.put (label replay)- Binary.put (properties replay))+ Binary.put (#version1 replay)+ Binary.put (#version2 replay)+ Binary.put (#label replay)+ Binary.put (#properties replay)) let content = Binary.runPut (do- Binary.put (levels replay)- Binary.put (keyFrames replay)- Binary.put (stream replay)- Binary.put (messages replay)- Binary.put (marks replay)- Binary.put (packages replay)- Binary.put (objects replay)- Binary.put (names replay)- Binary.put (classes replay)- Binary.put (cache replay))+ Binary.put (#levels replay)+ Binary.put (#keyFrames replay)+ Binary.put (#stream replay)+ Binary.put (#messages replay)+ Binary.put (#marks replay)+ Binary.put (#packages replay)+ Binary.put (#objects replay)+ Binary.put (#names replay)+ Binary.put (#classes replay)+ Binary.put (#cache replay)) let footer = LazyBytes.empty
library/Octane/Type/Replication.hs view
@@ -1,11 +1,18 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Replication (Replication(..)) where import qualified Control.DeepSeq as DeepSeq+import qualified Data.Default.Class as Default import qualified Data.Map.Strict as Map+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.Text as StrictText import qualified GHC.Generics as Generics import qualified Octane.Type.CompressedWord as CompressedWord@@ -19,19 +26,21 @@ -- This cannot be an instance of 'Data.Binary.Bits.BinaryBit' because it -- requires out-of-band information (the class property map) to decode. data Replication = Replication- { actorId :: CompressedWord.CompressedWord+ { replicationActorId :: CompressedWord.CompressedWord -- ^ The actor's ID.- , objectName :: StrictText.Text+ , replicationObjectName :: StrictText.Text -- ^ The name of the actor's object.- , className :: StrictText.Text+ , replicationClassName :: StrictText.Text -- ^ The name of the actor's class.- , state :: State.State+ , replicationState :: State.State -- ^ Which state this actor's replication is in.- , initialization :: Maybe Initialization.Initialization+ , replicationInitialization :: Maybe Initialization.Initialization -- ^ The optional initialization information for this actor. These only -- exist for new actors.- , properties :: Map.Map StrictText.Text Value.Value+ , replicationProperties :: Map.Map StrictText.Text Value.Value -- ^ The property updates associated with this actor's replication. } deriving (Eq, Generics.Generic, Show)++$(OverloadedRecords.overloadedRecord Default.def ''Replication) instance DeepSeq.NFData Replication where
library/Octane/Type/Stream.hs view
@@ -1,5 +1,11 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Stream (Stream(..)) where @@ -10,6 +16,8 @@ import qualified Data.Binary.Get as Binary import qualified Data.Binary.Put as Binary import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.Word32 as Word32 import qualified Octane.Utility.Endian as Endian@@ -18,9 +26,11 @@ -- | A stream of bits. newtype Stream = Stream- { unpack :: LazyBytes.ByteString+ { streamUnpack :: LazyBytes.ByteString } deriving (Eq, Generics.Generic) +$(OverloadedRecords.overloadedRecord Default.def ''Stream)+ -- | Prefixed by a length in bytes. Each byte is reversed such that -- @0b01234567@ is actually @0b76543210@. --@@ -35,7 +45,7 @@ content <- size & Word32.fromWord32 & Binary.getLazyByteString content & Endian.reverseBitsInLazyBytes & Stream & pure put stream = do- let content = unpack stream+ let content = #unpack stream content & LazyBytes.length & Word32.toWord32 & Binary.put content & Endian.reverseBitsInLazyBytes & Binary.putLazyByteString @@ -50,6 +60,6 @@ -- "Stream {unpack = \"2 bytes\"}" instance Show Stream where show stream = do- let size = stream & unpack & LazyBytes.length+ let size = stream & #unpack & LazyBytes.length let s = if size == 1 then "" else "s" Printf.printf "Stream {unpack = \"%d byte%s\"}" size s
library/Octane/Type/Text.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Text (Text(..), encodeLatin1) where @@ -16,6 +22,8 @@ import qualified Data.Binary.Put as Binary import qualified Data.ByteString.Char8 as StrictBytes import qualified Data.Char as Char+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.String as String import qualified Data.Text as StrictText import qualified Data.Text.Encoding as Encoding@@ -30,9 +38,11 @@ -- | A thin wrapper around 'StrictText.Text'. newtype Text = Text- { unpack :: StrictText.Text+ { textUnpack :: StrictText.Text } deriving (Eq, Generics.Generic, Ord) +$(OverloadedRecords.overloadedRecord Default.def ''Text)+ -- | Text is both length-prefixed and null-terminated. -- -- >>> Binary.decode "\x02\x00\x00\x00\x4b\x00" :: Text@@ -87,7 +97,7 @@ -- >>> show ("K" :: Text) -- "\"K\"" instance Show Text where- show text = show (unpack text)+ show text = show (#unpack text) -- | Encoded directly as a JSON string. --@@ -95,7 +105,7 @@ -- "\"K\"" instance Aeson.ToJSON Text where toJSON text = text- & unpack+ & #unpack & Aeson.toJSON @@ -139,7 +149,7 @@ -> Text -> m () putText putInt putBytes convertBytes text = do- let fullText = text & unpack & flip StrictText.snoc '\NUL'+ let fullText = text & #unpack & flip StrictText.snoc '\NUL' let size = fullText & StrictText.length & fromIntegral if StrictText.all Char.isLatin1 fullText then do
library/Octane/Type/Value.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE StrictData #-} module Octane.Type.Value (Value(..)) where@@ -19,6 +18,7 @@ import qualified Octane.Type.Word8 as Word8 +-- TODO: Split these into individual data types like RemoteId. -- | A replicated property's value. data Value = VBoolean
library/Octane/Type/Vector.hs view
@@ -1,6 +1,13 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Vector ( Vector(..)@@ -17,6 +24,8 @@ import qualified Data.Binary.Bits as BinaryBit import qualified Data.Binary.Bits.Get as BinaryBit import qualified Data.Binary.Bits.Put as BinaryBit+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified GHC.Generics as Generics import qualified Octane.Type.Boolean as Boolean import qualified Octane.Type.CompressedWord as CompressedWord@@ -30,11 +39,13 @@ -- always serialized the same way. Sometimes it is three values run together, -- but other times it has a flag for the presence of each value. data Vector a = Vector- { x :: a- , y :: a- , z :: a+ { vectorX :: a+ , vectorY :: a+ , vectorZ :: a } deriving (Eq, Generics.Generic, Show) +$(OverloadedRecords.overloadedRecord Default.def ''Vector)+ instance (DeepSeq.NFData a) => DeepSeq.NFData (Vector a) where -- | Encoded as a JSON array with 3 elements.@@ -42,7 +53,7 @@ -- Aeson.encode (Vector 1 2 3 :: Vector Int) -- "[1,2,3]" instance (Aeson.ToJSON a) => Aeson.ToJSON (Vector a) where- toJSON vector = Aeson.toJSON [x vector, y vector, z vector]+ toJSON vector = Aeson.toJSON [#x vector, #y vector, #z vector] -- | Gets a 'Vector' full of 'Float's.@@ -51,11 +62,11 @@ let maxValue = 1 let numBits = 16 - x' <- getFloat maxValue numBits- y' <- getFloat maxValue numBits- z' <- getFloat maxValue numBits+ x <- getFloat maxValue numBits+ y <- getFloat maxValue numBits+ z <- getFloat maxValue numBits - pure Vector { x = x', y = y', z = z' }+ pure (Vector x y z) getFloat :: Int -> Int -> BinaryBit.BitGet Float@@ -78,16 +89,16 @@ -- | Gets a 'Vector' full of 'Int8's. getInt8Vector :: BinaryBit.BitGet (Vector Int8.Int8) getInt8Vector = do- hasX <- BinaryBit.getBits 0- x' <- if Boolean.unpack hasX then BinaryBit.getBits 0 else pure 0+ (hasX :: Boolean.Boolean) <- BinaryBit.getBits 0+ x <- if #unpack hasX then BinaryBit.getBits 0 else pure 0 - hasY <- BinaryBit.getBits 0- y' <- if Boolean.unpack hasY then BinaryBit.getBits 0 else pure 0+ (hasY :: Boolean.Boolean) <- BinaryBit.getBits 0+ y <- if #unpack hasY then BinaryBit.getBits 0 else pure 0 - hasZ <- BinaryBit.getBits 0- z' <- if Boolean.unpack hasZ then BinaryBit.getBits 0 else pure 0+ (hasZ :: Boolean.Boolean) <- BinaryBit.getBits 0+ z <- if #unpack hasZ then BinaryBit.getBits 0 else pure 0 - pure Vector { x = x' , y = y' , z = z' }+ pure (Vector x y z) -- | Gets a 'Vector' full of 'Int's.@@ -102,16 +113,16 @@ dy <- fmap CompressedWord.fromCompressedWord (BinaryBit.getBits maxValue) dz <- fmap CompressedWord.fromCompressedWord (BinaryBit.getBits maxValue) - pure Vector { x = dx - bias , y = dy - bias , z = dz - bias }+ pure (Vector (dx - bias) (dy - bias) (dz - bias)) -- | Puts a 'Vector' full of 'Int8's. putInt8Vector :: Vector Int8.Int8 -> BinaryBit.BitPut () putInt8Vector _ = do- pure ()+ pure () -- TODO -- | Puts a 'Vector' full of 'Int's. putIntVector :: Vector Int -> BinaryBit.BitPut () putIntVector _ = do- pure ()+ pure () -- TODO
library/Octane/Type/Word16.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Word16 (Word16(..), fromWord16, toWord16) where @@ -11,6 +17,8 @@ import qualified Data.Binary as Binary import qualified Data.Binary.Get as Binary import qualified Data.Binary.Put as Binary+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.Word as Word import qualified GHC.Generics as Generics import qualified Text.Printf as Printf@@ -18,9 +26,11 @@ -- | A 16-bit unsigned integer. newtype Word16 = Word16- { unpack :: Word.Word16+ { word16Unpack :: Word.Word16 } deriving (Eq, Generics.Generic, Num, Ord) +$(OverloadedRecords.overloadedRecord Default.def ''Word16)+ -- | Little-endian. -- -- >>> Binary.decode "\x01\x00" :: Word16@@ -34,7 +44,7 @@ pure (Word16 value) put word16 = do- let value = unpack word16+ let value = #unpack word16 Binary.putWord16le value instance DeepSeq.NFData Word16 where@@ -44,7 +54,7 @@ -- >>> show (1 :: Word16) -- "0x0001" instance Show Word16 where- show word16 = Printf.printf "0x%04x" (unpack word16)+ show word16 = Printf.printf "0x%04x" (#unpack word16) -- | Encoded as a JSON number. --@@ -52,7 +62,7 @@ -- "1" instance Aeson.ToJSON Word16 where toJSON word16 = word16- & unpack+ & #unpack & Aeson.toJSON @@ -64,7 +74,7 @@ -- >>> fromWord16 0xffff :: Data.Int.Int16 -- -1 fromWord16 :: (Integral a) => Word16 -> a-fromWord16 word16 = fromIntegral (unpack word16)+fromWord16 word16 = fromIntegral (#unpack word16) -- | Converts any 'Integral' value into a 'Word16'.
library/Octane/Type/Word32.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Word32 (Word32(..), fromWord32, toWord32) where @@ -15,6 +21,8 @@ import qualified Data.Binary.Get as Binary import qualified Data.Binary.Put as Binary import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.Word as Word import qualified GHC.Generics as Generics import qualified Octane.Utility.Endian as Endian@@ -27,9 +35,11 @@ -- | A 32-bit unsigned integer. newtype Word32 = Word32- { unpack :: Word.Word32+ { word32Unpack :: Word.Word32 } deriving (Eq, Generics.Generic, Num, Ord) +$(OverloadedRecords.overloadedRecord Default.def ''Word32)+ -- | Little-endian. -- -- >>> Binary.decode "\x01\x00\x00\x00" :: Word32@@ -43,7 +53,7 @@ pure (Word32 value) put word32 = do- let value = unpack word32+ let value = #unpack word32 Binary.putWord32le value -- | Little-endian with the bits in each byte reversed.@@ -76,7 +86,7 @@ -- >>> show (1 :: Word32) -- "0x00000001" instance Show Word32 where- show word32 = Printf.printf "0x%08x" (unpack word32)+ show word32 = Printf.printf "0x%08x" (#unpack word32) -- | Encoded as a JSON number. --@@ -84,7 +94,7 @@ -- "1" instance Aeson.ToJSON Word32 where toJSON word32 = word32- & unpack+ & #unpack & Aeson.toJSON @@ -96,7 +106,7 @@ -- >>> fromWord32 0xffffffff :: Data.Int.Int32 -- -1 fromWord32 :: (Integral a) => Word32 -> a-fromWord32 word32 = fromIntegral (unpack word32)+fromWord32 word32 = fromIntegral (#unpack word32) -- | Converts any 'Integral' value into a 'Word32'.
library/Octane/Type/Word64.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Word64 (Word64(..), fromWord64, toWord64) where @@ -15,6 +21,8 @@ import qualified Data.Binary.Get as Binary import qualified Data.Binary.Put as Binary import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.Word as Word import qualified GHC.Generics as Generics import qualified Octane.Utility.Endian as Endian@@ -27,9 +35,11 @@ -- | A 64-bit unsigned integer. newtype Word64 = Word64- { unpack :: Word.Word64+ { word64Unpack :: Word.Word64 } deriving (Eq, Generics.Generic, Num, Ord) +$(OverloadedRecords.overloadedRecord Default.def ''Word64)+ -- | Little-endian. -- -- >>> Binary.decode "\x01\x00\x00\x00\x00\x00\x00\x00" :: Word64@@ -43,7 +53,7 @@ pure (Word64 value) put word64 = do- let value = unpack word64+ let value = #unpack word64 Binary.putWord64le value -- | Little-endian with the bits in each byte reversed.@@ -76,7 +86,7 @@ -- >>> show (1 :: Word64) -- "0x0000000000000001" instance Show Word64 where- show word64 = Printf.printf "0x%016x" (unpack word64)+ show word64 = Printf.printf "0x%016x" (#unpack word64) -- | Encoded as a JSON number. --@@ -84,7 +94,7 @@ -- "1" instance Aeson.ToJSON Word64 where toJSON word64 = word64- & unpack+ & #unpack & Aeson.toJSON @@ -96,7 +106,7 @@ -- >>> fromWord64 0xffffffffffffffff :: Data.Int.Int64 -- -1 fromWord64 :: (Integral a) => Word64 -> a-fromWord64 word64 = fromIntegral (unpack word64)+fromWord64 word64 = fromIntegral (#unpack word64) -- | Converts any 'Integral' value into a 'Word64'.
library/Octane/Type/Word8.hs view
@@ -1,6 +1,12 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Type.Word8 (Word8(..), fromWord8, toWord8) where @@ -15,6 +21,8 @@ import qualified Data.Binary.Get as Binary import qualified Data.Binary.Put as Binary import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Default.Class as Default+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.Word as Word import qualified GHC.Generics as Generics import qualified Octane.Utility.Endian as Endian@@ -27,9 +35,11 @@ -- | A 8-bit unsigned integer. newtype Word8 = Word8- { unpack :: Word.Word8+ { word8Unpack :: Word.Word8 } deriving (Eq, Generics.Generic, Num, Ord) +$(OverloadedRecords.overloadedRecord Default.def ''Word8)+ -- | >>> Binary.decode "\x01" :: Word8 -- 0x01 --@@ -41,7 +51,7 @@ pure (Word8 value) put word8 = do- let value = unpack word8+ let value = #unpack word8 Binary.putWord8 value -- | The bits are reversed.@@ -74,7 +84,7 @@ -- >>> show (1 :: Word8) -- "0x01" instance Show Word8 where- show word8 = Printf.printf "0x%02x" (unpack word8)+ show word8 = Printf.printf "0x%02x" (#unpack word8) -- | Encoded as a JSON number. --@@ -82,7 +92,7 @@ -- "1" instance Aeson.ToJSON Word8 where toJSON word8 = word8- & unpack+ & #unpack & Aeson.toJSON @@ -94,7 +104,7 @@ -- >>> fromWord8 0xff :: Data.Int.Int8 -- -1 fromWord8 :: (Integral a) => Word8 -> a-fromWord8 word8 = fromIntegral (unpack word8)+fromWord8 word8 = fromIntegral (#unpack word8) -- | Converts any 'Integral' value into a 'Word8'.
library/Octane/Utility/ClassPropertyMap.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE PackageImports #-} -- | This module is responsible for building the class property map, which maps@@ -17,12 +18,7 @@ import qualified Data.Map.Strict as Map import qualified Data.Maybe as Maybe import qualified Data.Text as StrictText-import qualified Octane.Type.CacheItem as CacheItem-import qualified Octane.Type.CacheProperty as CacheProperty-import qualified Octane.Type.ClassItem as ClassItem-import qualified Octane.Type.List as List import qualified Octane.Type.ReplayWithoutFrames as ReplayWithoutFrames-import qualified Octane.Type.Text as Text import qualified Octane.Type.Word32 as Word32 import qualified "regex-compat" Text.Regex as Regex @@ -56,12 +52,12 @@ -- ID, the second is its cache ID, and the third is its parent's cache ID. getClassCache :: ReplayWithoutFrames.ReplayWithoutFrames -> [(Int, Int, Int)] getClassCache replay = replay- & ReplayWithoutFrames.cache- & List.unpack+ & #cache+ & #unpack & map (\ x ->- ( x & CacheItem.classId & Word32.fromWord32- , x & CacheItem.cacheId & Word32.fromWord32- , x & CacheItem.parentCacheId & Word32.fromWord32+ ( x & #classId & Word32.fromWord32+ , x & #cacheId & Word32.fromWord32+ , x & #parentCacheId & Word32.fromWord32 )) @@ -125,9 +121,9 @@ -- | The property map is a mapping from property IDs to property names. getPropertyMap :: ReplayWithoutFrames.ReplayWithoutFrames -> IntMap.IntMap StrictText.Text getPropertyMap replay = replay- & ReplayWithoutFrames.objects- & List.unpack- & map Text.unpack+ & #objects+ & #unpack+ & map #unpack & zip [0 ..] & IntMap.fromList @@ -139,16 +135,16 @@ getBasicClassPropertyMap replay = let propertyMap = getPropertyMap replay in replay- & ReplayWithoutFrames.cache- & List.unpack+ & #cache+ & #unpack & map (\ x -> let- classId = x & CacheItem.classId & Word32.fromWord32+ classId = x & #classId & Word32.fromWord32 properties = x- & CacheItem.properties- & List.unpack+ & #properties+ & #unpack & Maybe.mapMaybe (\ y -> let- streamId = y & CacheProperty.streamId & Word32.fromWord32- propertyId = y & CacheProperty.objectId & Word32.fromWord32+ streamId = y & #streamId & Word32.fromWord32+ propertyId = y & #objectId & Word32.fromWord32 in case IntMap.lookup propertyId propertyMap of Nothing -> Nothing Just name -> Just (streamId, name))@@ -160,11 +156,11 @@ -- | The actor map is a mapping from class names to their IDs. getActorMap :: ReplayWithoutFrames.ReplayWithoutFrames -> Map.Map StrictText.Text Int getActorMap replay = replay- & ReplayWithoutFrames.classes- & List.unpack+ & #classes+ & #unpack & map (\ x -> let- className = x & ClassItem.name & Text.unpack- classId = x & ClassItem.streamId & Word32.fromWord32+ className = x & #name & #unpack+ classId = x & #streamId & Word32.fromWord32 in (className, classId)) & Map.fromList
library/Octane/Utility/Generator.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE OverloadedLabels #-}+ module Octane.Utility.Generator (generateStream) where import Data.Function ((&))@@ -43,9 +45,9 @@ putFrame :: Frame.Frame -> BinaryBit.BitPut () putFrame frame = do- frame & Frame.time & BinaryBit.putBits 32- frame & Frame.delta & BinaryBit.putBits 32- frame & Frame.replications & putReplications+ frame & #time & BinaryBit.putBits 32+ frame & #delta & BinaryBit.putBits 32+ frame & #replications & putReplications putReplications :: [Replication.Replication] -> BinaryBit.BitPut ()@@ -61,8 +63,8 @@ putReplication :: Replication.Replication -> BinaryBit.BitPut () putReplication replication = do- replication & Replication.actorId & BinaryBit.putBits 0- case Replication.state replication of+ replication & #actorId & BinaryBit.putBits 0+ case #state replication of State.SOpening -> putNewReplication replication State.SExisting -> putExistingReplication replication State.SClosing -> putClosedReplication replication@@ -74,7 +76,7 @@ True & Boolean.Boolean & BinaryBit.putBits 1 -- new False & Boolean.Boolean & BinaryBit.putBits 1 -- unknown -- TODO: convert object name into ID and put it- case Replication.initialization replication of+ case #initialization replication of Nothing -> pure () Just x -> Initialization.putInitialization x
library/Octane/Utility/Optimizer.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-} module Octane.Utility.Optimizer (optimizeFrames) where@@ -39,11 +40,11 @@ updateState :: Frame.Frame -> State -> State updateState frame state1 = let spawned = frame- & Frame.replications+ & #replications & filter (\ replication -> replication- & Replication.state+ & #state & (== State.SOpening))- & map Replication.actorId+ & map #actorId & map CompressedWord.fromCompressedWord state2 = spawned & foldr@@ -53,11 +54,11 @@ state1 destroyed = frame- & Frame.replications+ & #replications & filter (\ replication -> replication- & Replication.state+ & #state & (== State.SClosing))- & map Replication.actorId+ & map #actorId & map CompressedWord.fromCompressedWord state3 = destroyed & foldr@@ -67,23 +68,23 @@ state2 updated = frame- & Frame.replications+ & #replications & filter (\ replication -> replication- & Replication.state+ & #state & (== State.SExisting)) state4 = updated & foldr (\ replication -> IntMap.alter (\ maybeValue -> Just (case maybeValue of Nothing ->- (True, Replication.properties replication)+ (True, #properties replication) Just (alive, properties) -> ( alive , Map.union- (Replication.properties replication)+ (#properties replication) properties )))- (replication & Replication.actorId & CompressedWord.fromCompressedWord))+ (replication & #actorId & CompressedWord.fromCompressedWord)) state3 in state4@@ -92,31 +93,31 @@ getDelta :: State -> Frame.Frame -> Frame.Frame getDelta state frame = let newReplications = frame- & Frame.replications+ & #replications -- Remove replications that aren't actually new. & reject (\ replication -> let- isOpening = Replication.state replication == State.SOpening- actorId = Replication.actorId replication+ isOpening = #state replication == State.SOpening+ actorId = #actorId replication currentState = IntMap.lookup (CompressedWord.fromCompressedWord actorId) state isAlive = fmap fst currentState wasAlreadyAlive = isAlive == Just True in isOpening && wasAlreadyAlive) -- Remove properties that haven't changed. & map (\ replication ->- if Replication.state replication == State.SExisting+ if #state replication == State.SExisting then let- actorId = Replication.actorId replication+ actorId = #actorId replication currentState = IntMap.findWithDefault (True, Map.empty) (CompressedWord.fromCompressedWord actorId) state currentProperties = snd currentState- newProperties = Replication.properties replication+ newProperties = #properties replication changes = newProperties & Map.filterWithKey (\ name newValue -> let oldValue = Map.lookup name currentProperties in Just newValue /= oldValue)- in replication { Replication.properties = changes }+ in replication { Replication.replicationProperties = changes } else replication)- in frame { Frame.replications = newReplications }+ in frame { Frame.frameReplications = newReplications } reject :: (a -> Bool) -> [a] -> [a]
library/Octane/Utility/Parser.hs view
@@ -1,6 +1,13 @@ {-# LANGUAGE BinaryLiterals #-}+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE StrictData #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-} module Octane.Utility.Parser (parseStream) where @@ -9,10 +16,12 @@ import qualified Control.DeepSeq as DeepSeq import qualified Control.Monad as Monad import qualified Data.Binary.Bits as BinaryBit-import qualified Data.Binary.Bits.Get as Bits+import qualified Data.Binary.Bits.Get as BinaryBit import qualified Data.Binary.Get as Binary+import qualified Data.Default.Class as Default import qualified Data.IntMap.Strict as IntMap import qualified Data.Map.Strict as Map+import qualified Data.OverloadedRecords.TH as OverloadedRecords import qualified Data.Set as Set import qualified Data.Text as StrictText import qualified Data.Version as Version@@ -20,19 +29,15 @@ import qualified Octane.Data as Data import qualified Octane.Type.Boolean as Boolean import qualified Octane.Type.CompressedWord as CompressedWord-import qualified Octane.Type.Dictionary as Dictionary import qualified Octane.Type.Float32 as Float32 import qualified Octane.Type.Frame as Frame import qualified Octane.Type.Initialization as Initialization import qualified Octane.Type.Int32 as Int32-import qualified Octane.Type.KeyFrame as KeyFrame-import qualified Octane.Type.List as List import qualified Octane.Type.Property as Property import qualified Octane.Type.RemoteId as RemoteId import qualified Octane.Type.ReplayWithoutFrames as ReplayWithoutFrames import qualified Octane.Type.Replication as Replication import qualified Octane.Type.State as State-import qualified Octane.Type.Stream as Stream import qualified Octane.Type.Text as Text import qualified Octane.Type.Value as Value import qualified Octane.Type.Vector as Vector@@ -44,28 +49,92 @@ import qualified Text.Printf as Printf +-- Data types+++-- { class stream id => { property stream id => name } }+type ClassPropertyMap = IntMap.IntMap (IntMap.IntMap StrictText.Text)+++-- { stream id => object name }+type ObjectMap = IntMap.IntMap StrictText.Text+++-- { class name => class id }+type ClassMap = Map.Map StrictText.Text Int+++data Thing = Thing+ { thingFlag :: Boolean.Boolean+ , thingObjectId :: Int32.Int32+ , thingObjectName :: StrictText.Text+ , thingClassId :: Int+ , thingClassName :: StrictText.Text+ , thingInitialization :: Initialization.Initialization+ } deriving (Eq, Generics.Generic, Show)++$(OverloadedRecords.overloadedRecord Default.def ''Thing)++instance DeepSeq.NFData Thing+++data Context = Context+ { contextObjectMap :: ObjectMap+ , contextClassPropertyMap :: ClassPropertyMap+ , contextThings :: IntMap.IntMap Thing+ , contextClassMap :: ClassMap+ , contextKeyFrames :: Set.Set Word+ , contextVersion :: Version.Version+ } deriving (Eq, Generics.Generic, Show)++$(OverloadedRecords.overloadedRecord Default.def ''Context)++instance DeepSeq.NFData Context+++extractContext :: ReplayWithoutFrames.ReplayWithoutFrames -> Context+extractContext replay = do+ let keyFrames = replay+ & #keyFrames+ & #unpack+ & map #frame+ & map Word32.fromWord32+ & Set.fromList+ let version =+ [ replay & #version1+ , replay & #version2+ ] & map Word32.fromWord32 & Version.makeVersion+ Context+ (CPM.getPropertyMap replay)+ (CPM.getClassPropertyMap replay)+ IntMap.empty+ (CPM.getActorMap replay)+ keyFrames+ version++ -- | Parses the network stream and returns a list of frames. parseStream :: ReplayWithoutFrames.ReplayWithoutFrames -> [Frame.Frame] parseStream replay = let numFrames = replay- & ReplayWithoutFrames.properties- & Dictionary.unpack+ & #properties+ & #unpack & Map.lookup ("NumFrames" & StrictText.pack & Text.Text) & (\ property -> case property of- Just (Property.IntProperty _ x) -> x & Int32.unpack & fromIntegral+ Just (Property.IntProperty _ x) -> x & #unpack & fromIntegral _ -> 0)- get = replay & extractContext & getFrames 0 numFrames & Bits.runBitGet- stream = replay & ReplayWithoutFrames.stream & Stream.unpack+ get = replay & extractContext & getFrames 0 numFrames & BinaryBit.runBitGet+ stream = replay & #stream & #unpack (_context, frames) = Binary.runGet get stream in frames -getFrames :: Word -> Int -> Context -> Bits.BitGet (Context, [Frame.Frame])+getFrames :: Word -> Int -> Context -> BinaryBit.BitGet (Context, [Frame.Frame]) getFrames number numFrames context = do if fromIntegral number >= numFrames then pure (context, []) else do- isEmpty <- Bits.isEmpty+ isEmpty <- BinaryBit.isEmpty if isEmpty then pure (context, []) else do@@ -77,7 +146,7 @@ pure (newerContext, (frame : frames)) -getMaybeFrame :: Context -> Word -> Bits.BitGet (Maybe (Context, Frame.Frame))+getMaybeFrame :: Context -> Word -> BinaryBit.BitGet (Maybe (Context, Frame.Frame)) getMaybeFrame context number = do time <- getFloat32 delta <- getFloat32@@ -90,21 +159,19 @@ pure (Just (newContext, frame)) -getFrame :: Context -> Word -> Float32.Float32 -> Float32.Float32 -> Bits.BitGet (Context, Frame.Frame)+getFrame :: Context -> Word -> Float32.Float32 -> Float32.Float32 -> BinaryBit.BitGet (Context, Frame.Frame) getFrame context number time delta = do (newContext, replications) <- getReplications context- let frame =- Frame.Frame- { Frame.number = number- , Frame.isKeyFrame = context & contextKeyFrames & Set.member number- , Frame.time = time- , Frame.delta = delta- , Frame.replications = replications- }+ let frame = Frame.Frame+ number+ (context & #keyFrames & Set.member number)+ time+ delta+ replications (newContext, frame) & DeepSeq.force & pure -getReplications :: Context -> Bits.BitGet (Context, [Replication.Replication])+getReplications :: Context -> BinaryBit.BitGet (Context, [Replication.Replication]) getReplications context = do maybeReplication <- getMaybeReplication context case maybeReplication of@@ -114,22 +181,22 @@ pure (newerContext, replication : replications) -getMaybeReplication :: Context -> Bits.BitGet (Maybe (Context, Replication.Replication))+getMaybeReplication :: Context -> BinaryBit.BitGet (Maybe (Context, Replication.Replication)) getMaybeReplication context = do hasReplication <- getBool- if Boolean.unpack hasReplication+ if #unpack hasReplication then do (newContext,replication) <- getReplication context pure (Just (newContext, replication)) else pure Nothing -getReplication :: Context -> Bits.BitGet (Context, Replication.Replication)+getReplication :: Context -> BinaryBit.BitGet (Context, Replication.Replication) getReplication context = do actorId <- BinaryBit.getBits maxActorId isOpen <- getBool let go =- if Boolean.unpack isOpen+ if #unpack isOpen then getOpenReplication else getClosedReplication go context actorId@@ -137,11 +204,11 @@ getOpenReplication :: Context -> CompressedWord.CompressedWord- -> Bits.BitGet (Context, Replication.Replication)+ -> BinaryBit.BitGet (Context, Replication.Replication) getOpenReplication context actorId = do isNew <- getBool let go =- if Boolean.unpack isNew+ if #unpack isNew then getNewReplication else getExistingReplication go context actorId@@ -149,85 +216,77 @@ getNewReplication :: Context -> CompressedWord.CompressedWord- -> Bits.BitGet (Context, Replication.Replication)+ -> BinaryBit.BitGet (Context, Replication.Replication) getNewReplication context actorId = do unknownFlag <- getBool- if Boolean.unpack unknownFlag+ if #unpack unknownFlag then fail "the unknown flag in a new replication is true! what does it mean?" else pure () objectId <- getInt32- objectName <- case context & contextObjectMap & IntMap.lookup (Int32.fromInt32 objectId) of+ objectName <- case context & #objectMap & IntMap.lookup (Int32.fromInt32 objectId) of Nothing -> fail ("could not find object name for id " ++ show objectId) Just x -> pure x (classId, className) <- CPM.getClass- (contextObjectMap context)+ (#objectMap context) Data.classes- (contextClassMap context)+ (#classMap context) (Int32.fromInt32 objectId) classInit <- Initialization.getInitialization className let thing = Thing- { thingFlag = unknownFlag- , thingObjectId = objectId- , thingObjectName = objectName- , thingClassId = classId- , thingClassName = className- , thingInitialization = classInit- }- let things = contextThings context+ unknownFlag+ objectId+ objectName+ classId+ className+ classInit+ let things = #things context let newThings = IntMap.insert (CompressedWord.fromCompressedWord actorId) thing things let newContext = context { contextThings = newThings }- pure- ( newContext- , Replication.Replication- { Replication.actorId = actorId- , Replication.objectName = objectName- , Replication.className = className- , Replication.state = State.SOpening- , Replication.initialization = Just classInit- , Replication.properties = Map.empty- })+ pure (newContext, Replication.Replication+ actorId+ objectName+ className+ State.SOpening+ (Just classInit)+ Map.empty) getExistingReplication :: Context -> CompressedWord.CompressedWord- -> Bits.BitGet (Context, Replication.Replication)+ -> BinaryBit.BitGet (Context, Replication.Replication) getExistingReplication context actorId = do- thing <- case context & contextThings & IntMap.lookup (CompressedWord.fromCompressedWord actorId) of+ thing <- case context & #things & IntMap.lookup (CompressedWord.fromCompressedWord actorId) of Nothing -> fail ("could not find thing for existing actor " ++ show actorId) Just x -> pure x props <- getProps context thing pure (context, Replication.Replication- { Replication.actorId = actorId- , Replication.objectName = thingObjectName thing- , Replication.className = thingClassName thing- , Replication.state = State.SExisting- , Replication.initialization = Nothing- , Replication.properties = props- })+ actorId+ (#objectName thing)+ (#className thing)+ State.SExisting+ Nothing+ props) getClosedReplication :: Context -> CompressedWord.CompressedWord- -> Bits.BitGet (Context, Replication.Replication)+ -> BinaryBit.BitGet (Context, Replication.Replication) getClosedReplication context actorId = do- thing <- case context & contextThings & IntMap.lookup (CompressedWord.fromCompressedWord actorId) of+ thing <- case context & #things & IntMap.lookup (CompressedWord.fromCompressedWord actorId) of Nothing -> fail ("could not find thing for closed actor " ++ show actorId) Just x -> pure x- let newThings = context & contextThings & IntMap.delete (CompressedWord.fromCompressedWord actorId)+ let newThings = context & #things & IntMap.delete (CompressedWord.fromCompressedWord actorId) let newContext = context { contextThings = newThings }- pure- ( newContext- , Replication.Replication- { Replication.actorId = actorId- , Replication.objectName = thingObjectName thing- , Replication.className = thingClassName thing- , Replication.state = State.SClosing- , Replication.initialization = Nothing- , Replication.properties = Map.empty- })+ pure (newContext, Replication.Replication+ actorId+ (#objectName thing)+ (#className thing)+ State.SClosing+ Nothing+ Map.empty) -getProps :: Context -> Thing -> Bits.BitGet (Map.Map StrictText.Text Value.Value)+getProps :: Context -> Thing -> BinaryBit.BitGet (Map.Map StrictText.Text Value.Value) getProps context thing = do maybeProp <- getMaybeProp context thing case maybeProp of@@ -238,20 +297,20 @@ pure (Map.union m props) -getMaybeProp :: Context -> Thing -> Bits.BitGet (Maybe (StrictText.Text, Value.Value))+getMaybeProp :: Context -> Thing -> BinaryBit.BitGet (Maybe (StrictText.Text, Value.Value)) getMaybeProp context thing = do hasProp <- getBool- if Boolean.unpack hasProp+ if #unpack hasProp then do prop <- getProp context thing pure (Just prop) else pure Nothing -getProp :: Context -> Thing -> Bits.BitGet (StrictText.Text, Value.Value)+getProp :: Context -> Thing -> BinaryBit.BitGet (StrictText.Text, Value.Value) getProp context thing = do- let classId = thing & thingClassId- props <- case context & contextClassPropertyMap & IntMap.lookup classId of+ let classId = #classId thing+ props <- case context & #classPropertyMap & IntMap.lookup classId of Nothing -> fail ("could not find property map for class id " ++ show classId) Just x -> pure x let maxId = props & IntMap.keys & (0 :) & maximum@@ -263,7 +322,7 @@ pure (name, value) -getPropValue :: Context -> StrictText.Text -> Bits.BitGet Value.Value+getPropValue :: Context -> StrictText.Text -> BinaryBit.BitGet Value.Value getPropValue context name = case Map.lookup name Data.properties of Just property -> case StrictText.unpack property of "boolean" -> getBooleanProperty@@ -295,19 +354,19 @@ fail ("Don't know how to read property " ++ show name) -getBooleanProperty :: Bits.BitGet Value.Value+getBooleanProperty :: BinaryBit.BitGet Value.Value getBooleanProperty = do bool <- getBool pure (Value.VBoolean bool) -getByteProperty :: Bits.BitGet Value.Value+getByteProperty :: BinaryBit.BitGet Value.Value getByteProperty = do word <- getWord8 pure (Value.VByte word) -getCamSettingsProperty :: Bits.BitGet Value.Value+getCamSettingsProperty :: BinaryBit.BitGet Value.Value getCamSettingsProperty = do fov <- getFloat32 height <- getFloat32@@ -318,7 +377,7 @@ pure (Value.VCamSettings fov height angle distance stiffness swivelSpeed) -getDemolishProperty :: Bits.BitGet Value.Value+getDemolishProperty :: BinaryBit.BitGet Value.Value getDemolishProperty = do atkFlag <- getBool atk <- getWord32@@ -329,52 +388,52 @@ pure (Value.VDemolish atkFlag atk vicFlag vic vec1 vec2) -getEnumProperty :: Bits.BitGet Value.Value+getEnumProperty :: BinaryBit.BitGet Value.Value getEnumProperty = do- x <- Bits.getWord16be 10+ x <- BinaryBit.getWord16be 10 y <- if x == 1023 then getBool else fail ("unexpected enum value " ++ show x) pure (Value.VEnum (Word16.toWord16 x) y) -getExplosionProperty :: Bits.BitGet Value.Value+getExplosionProperty :: BinaryBit.BitGet Value.Value getExplosionProperty = do noGoal <- getBool- a <- if Boolean.unpack noGoal+ a <- if #unpack noGoal then pure Nothing else fmap Just getInt32 b <- Vector.getIntVector pure (Value.VExplosion noGoal a b) -getFlaggedIntProperty :: Bits.BitGet Value.Value+getFlaggedIntProperty :: BinaryBit.BitGet Value.Value getFlaggedIntProperty = do flag <- getBool int <- getInt32 pure (Value.VFlaggedInt flag int) -getFloatProperty :: Bits.BitGet Value.Value+getFloatProperty :: BinaryBit.BitGet Value.Value getFloatProperty = do float <- getFloat32 pure (Value.VFloat float) -getGameModeProperty :: Context -> Bits.BitGet Value.Value+getGameModeProperty :: Context -> BinaryBit.BitGet Value.Value getGameModeProperty context = do let numBits = if atLeastNeoTokyo context then 8 else 2- x <- Bits.getWord8 numBits+ x <- BinaryBit.getWord8 numBits pure (Value.VGameMode (Word8.toWord8 x)) -getIntProperty :: Bits.BitGet Value.Value+getIntProperty :: BinaryBit.BitGet Value.Value getIntProperty = do int <- getInt32 pure (Value.VInt int) -getLoadoutOnlineProperty :: Bits.BitGet Value.Value+getLoadoutOnlineProperty :: BinaryBit.BitGet Value.Value getLoadoutOnlineProperty = do size <- fmap Word8.fromWord8 getWord8 values <- Monad.replicateM size (do@@ -386,7 +445,7 @@ pure (Value.VLoadoutOnline values) -getLoadoutProperty :: Bits.BitGet Value.Value+getLoadoutProperty :: BinaryBit.BitGet Value.Value getLoadoutProperty = do version <- getWord8 body <- getWord32@@ -400,13 +459,13 @@ pure (Value.VLoadout version body decal wheels rocketTrail antenna topper g h) -getLocationProperty :: Bits.BitGet Value.Value+getLocationProperty :: BinaryBit.BitGet Value.Value getLocationProperty = do vector <- Vector.getIntVector pure (Value.VLocation vector) -getMusicStingerProperty :: Bits.BitGet Value.Value+getMusicStingerProperty :: BinaryBit.BitGet Value.Value getMusicStingerProperty = do flag <- getBool cue <- getWord32@@ -414,17 +473,17 @@ pure (Value.VMusicStinger flag cue trigger) -getPickupProperty :: Bits.BitGet Value.Value+getPickupProperty :: BinaryBit.BitGet Value.Value getPickupProperty = do instigator <- getBool- instigatorId <- if Boolean.unpack instigator+ instigatorId <- if #unpack instigator then fmap Just getWord32 else pure Nothing pickedUp <- getBool pure (Value.VPickup instigator instigatorId pickedUp) -getPrivateMatchSettingsProperty :: Bits.BitGet Value.Value+getPrivateMatchSettingsProperty :: BinaryBit.BitGet Value.Value getPrivateMatchSettingsProperty = do mutators <- getText joinableBy <- getWord32@@ -435,19 +494,19 @@ pure (Value.VPrivateMatchSettings mutators joinableBy maxPlayers gameName password flag) -getQWordProperty :: Bits.BitGet Value.Value+getQWordProperty :: BinaryBit.BitGet Value.Value getQWordProperty = do qword <- getWord64 pure (Value.VQWord qword) -getRelativeRotationProperty :: Bits.BitGet Value.Value+getRelativeRotationProperty :: BinaryBit.BitGet Value.Value getRelativeRotationProperty = do vector <- Vector.getFloatVector pure (Value.VRelativeRotation vector) -getReservationProperty :: Context -> Bits.BitGet Value.Value+getReservationProperty :: Context -> BinaryBit.BitGet Value.Value getReservationProperty context = do -- I think this is the connection order. The first player to connect -- gets number 0, and it goes up from there. The maximum is 7, which@@ -462,34 +521,34 @@ -- The Neo Tokyo update added 6 bits to the reservation property that are -- always (as far as I can tell) 0. Monad.when (atLeastNeoTokyo context) (do- x <- Bits.getWord8 6+ x <- BinaryBit.getWord8 6 Monad.when (x /= 0b000000) (do fail (Printf.printf "Read 6 reservation bits and they weren't all 0! 0b%06b" x))) pure (Value.VReservation number systemId remoteId localId playerName a b) -getRigidBodyStateProperty :: Bits.BitGet Value.Value+getRigidBodyStateProperty :: BinaryBit.BitGet Value.Value getRigidBodyStateProperty = do flag <- getBool position <- Vector.getIntVector rotation <- Vector.getFloatVector- x <- if Boolean.unpack flag+ x <- if #unpack flag then pure Nothing else fmap Just Vector.getIntVector- y <- if Boolean.unpack flag+ y <- if #unpack flag then pure Nothing else fmap Just Vector.getIntVector pure (Value.VRigidBodyState flag position rotation x y) -getStringProperty :: Bits.BitGet Value.Value+getStringProperty :: BinaryBit.BitGet Value.Value getStringProperty = do string <- getText pure (Value.VString string) -getTeamPaintProperty :: Bits.BitGet Value.Value+getTeamPaintProperty :: BinaryBit.BitGet Value.Value getTeamPaintProperty = do team <- getWord8 primaryColor <- getWord8@@ -499,7 +558,7 @@ pure (Value.VTeamPaint team primaryColor accentColor primaryFinish accentFinish) -getUniqueIdProperty :: Bits.BitGet Value.Value+getUniqueIdProperty :: BinaryBit.BitGet Value.Value getUniqueIdProperty = do (systemId, remoteId, localId) <- getUniqueId pure (Value.VUniqueId systemId remoteId localId)@@ -507,7 +566,7 @@ -- | Even though this is just a unique ID property, it must be handled -- specially because it sometimes doesn't have the remote or local IDs.-getPartyLeaderProperty :: Bits.BitGet Value.Value+getPartyLeaderProperty :: BinaryBit.BitGet Value.Value getPartyLeaderProperty = do systemId <- getWord8 (remoteId, localId) <- if systemId == 0@@ -519,7 +578,7 @@ pure (Value.VUniqueId systemId remoteId localId) -getUniqueId :: Bits.BitGet (Word8.Word8, RemoteId.RemoteId, Maybe Word8.Word8)+getUniqueId :: BinaryBit.BitGet (Word8.Word8, RemoteId.RemoteId, Maybe Word8.Word8) getUniqueId = do systemId <- getWord8 remoteId <- getRemoteId systemId@@ -527,7 +586,7 @@ pure (systemId, remoteId, localId) -getRemoteId :: Word8.Word8 -> Bits.BitGet RemoteId.RemoteId+getRemoteId :: Word8.Word8 -> BinaryBit.BitGet RemoteId.RemoteId getRemoteId systemId = case systemId of 0 -> do splitscreenId <- BinaryBit.getBits 0@@ -544,64 +603,6 @@ _ -> fail ("unknown system id " ++ show systemId) --- Data types---data Thing = Thing- { thingFlag :: Boolean.Boolean- , thingObjectId :: Int32.Int32- , thingObjectName :: StrictText.Text- , thingClassId :: Int- , thingClassName :: StrictText.Text- , thingInitialization :: Initialization.Initialization- } deriving (Eq, Generics.Generic, Show)--instance DeepSeq.NFData Thing----- { class stream id => { property stream id => name } }-type ClassPropertyMap = IntMap.IntMap (IntMap.IntMap StrictText.Text)----- { stream id => object name }-type ObjectMap = IntMap.IntMap StrictText.Text----- { class name => class id }-type ClassMap = Map.Map StrictText.Text Int---data Context = Context- { contextObjectMap :: ObjectMap- , contextClassPropertyMap :: ClassPropertyMap- , contextThings :: (IntMap.IntMap Thing)- , contextClassMap :: ClassMap- , contextKeyFrames :: (Set.Set Word)- , contextVersion :: Version.Version- } deriving (Eq, Generics.Generic, Show)--instance DeepSeq.NFData Context---extractContext :: ReplayWithoutFrames.ReplayWithoutFrames -> Context-extractContext replay = Context- { contextObjectMap = CPM.getPropertyMap replay- , contextClassPropertyMap = CPM.getClassPropertyMap replay- , contextThings = IntMap.empty- , contextClassMap = CPM.getActorMap replay- , contextKeyFrames = replay- & ReplayWithoutFrames.keyFrames- & List.unpack- & map KeyFrame.frame- & map Word32.fromWord32- & Set.fromList- , contextVersion =- [ replay & ReplayWithoutFrames.version1- , replay & ReplayWithoutFrames.version2- ] & map Word32.fromWord32 & Version.makeVersion- }-- -- Helpers @@ -610,7 +611,7 @@ -- function takes a context and returns true if the replay was saved by a game -- running at least the Neo Tokyo version. atLeastNeoTokyo :: Context -> Bool-atLeastNeoTokyo context = contextVersion context >= neoTokyoVersion+atLeastNeoTokyo context = #version context >= neoTokyoVersion -- Constants@@ -631,29 +632,29 @@ -- Type-restricted helpers. -getBool :: Bits.BitGet Boolean.Boolean+getBool :: BinaryBit.BitGet Boolean.Boolean getBool = BinaryBit.getBits 0 -getFloat32 :: Bits.BitGet Float32.Float32+getFloat32 :: BinaryBit.BitGet Float32.Float32 getFloat32 = BinaryBit.getBits 0 -getInt32 :: Bits.BitGet Int32.Int32+getInt32 :: BinaryBit.BitGet Int32.Int32 getInt32 = BinaryBit.getBits 0 -getText :: Bits.BitGet Text.Text+getText :: BinaryBit.BitGet Text.Text getText = BinaryBit.getBits 0 -getWord8 :: Bits.BitGet Word8.Word8+getWord8 :: BinaryBit.BitGet Word8.Word8 getWord8 = BinaryBit.getBits 0 -getWord32 :: Bits.BitGet Word32.Word32+getWord32 :: BinaryBit.BitGet Word32.Word32 getWord32 = BinaryBit.getBits 0 -getWord64 :: Bits.BitGet Word64.Word64+getWord64 :: BinaryBit.BitGet Word64.Word64 getWord64 = BinaryBit.getBits 0
octane.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: octane-version: 0.13.4+version: 0.14.0 synopsis: Parse Rocket League replays. description: Octane parses Rocket League replays. category: Game@@ -44,10 +44,12 @@ , bytestring ==0.10.* , containers ==0.5.* , data-binary-ieee754 ==0.4.*+ , data-default-class <0.2 , deepseq ==1.4.* , file-embed ==0.0.* , http-client >=0.4.30 && <0.6 , http-client-tls >=0.2 && <0.4+ , overloaded-records ==0.4.* , regex-compat ==0.95.* , text ==1.2.* , unordered-containers ==0.2.*
package.yaml view
@@ -41,10 +41,12 @@ - bytestring ==0.10.* - containers ==0.5.* - data-binary-ieee754 ==0.4.*+ - data-default-class <0.2 - deepseq ==1.4.* - file-embed ==0.0.* - http-client >=0.4.30 && <0.6 - http-client-tls >=0.2 && <0.4+ - overloaded-records ==0.4.* - regex-compat ==0.95.* - text ==1.2.* - unordered-containers ==0.2.*@@ -79,4 +81,4 @@ - -with-rtsopts=-N main: Main.hs source-dirs: test-suite-version: '0.13.4'+version: '0.14.0'
stack.yaml view
@@ -1,1 +1,1 @@-resolver: nightly-2016-07-05+resolver: nightly-2016-08-18
test-suite/Main.hs view
@@ -4,6 +4,7 @@ import qualified Test.Tasty as Tasty import qualified Test.Tasty.Hspec as Hspec + main :: IO () main = do test <- Hspec.testSpec "octane" spec