{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE GeneralisedNewtypeDeriving #-} {-# LANGUAGE StrictData #-} {-# LANGUAGE TemplateHaskell #-} {-# OPTIONS_GHC -Wno-missing-signatures #-} module Shape.Data where import Control.Lens import Data.Aeson import Data.Store import Flat import GHC.Generics import Geometry.Data import LinearHelp import Streaming import TH.Derive type Shape' = Stream (Of ShapeObj) IO () type Shape = [ShapeObj] {-# INLINE shVfromList #-} shVfromList = id {-# INLINE shEfromList #-} shEfromList = id data ShapeObj = ShapeObj { _shType :: ShapeType , _shVs :: [ShapeV] } deriving (Eq, Ord, Show, Read, Generic, Flat) instance ToJSON ShapeObj where toEncoding = genericToEncoding defaultOptions instance FromJSON ShapeObj newtype ShapeType = TopPrism Int deriving (Eq, Ord, Show, Read, Generic, Flat) instance ToJSON ShapeType where toEncoding = genericToEncoding defaultOptions instance FromJSON ShapeType -- edges are given by four consecutive points data ShapeV = ShapeV { _svPos :: Point3 , _svCol :: Point4 } deriving (Eq, Ord, Show, Read, Generic, Flat) instance ToJSON ShapeV where toEncoding = genericToEncoding defaultOptions instance FromJSON ShapeV pairToSV :: (Point3, Point4) -> ShapeV {-# INLINE pairToSV #-} pairToSV = uncurry ShapeV makeLenses ''ShapeV makeLenses ''ShapeObj