{-# LANGUAGE DeriveGeneric #-} module Arbor.File.Format.Asif.Type where import Arbor.File.Format.Asif.Format (Format) import Arbor.File.Format.Asif.Maybe import Arbor.File.Format.Asif.Whatever import Data.Semigroup (Semigroup, (<>)) import Data.Text (Text) import Data.Thyme.Clock.POSIX (POSIXTime) import GHC.Generics data SegmentMeta = SegmentMeta { createTime :: Maybe POSIXTime , filename :: Maybe Text , format :: Maybe (Whatever Format) } deriving (Eq, Show, Generic) instance Semigroup SegmentMeta where a <> b = SegmentMeta { createTime = createTime a `secondJust` createTime b , filename = filename a `secondJust` filename b , format = format a `secondJust` format b } instance Monoid SegmentMeta where mappend = (<>) mempty = SegmentMeta { createTime = Nothing , filename = Nothing , format = Nothing } data Segment a = Segment { meta :: SegmentMeta , payload :: a } deriving Generic segment :: a -> SegmentMeta -> Segment a segment payload' meta' = Segment { meta = meta' , payload = payload' } metaCreateTime :: POSIXTime -> SegmentMeta metaCreateTime time = mempty { createTime = Just time } metaFilename :: Text -> SegmentMeta metaFilename filePath = mempty { filename = Just filePath } metaFormat :: Whatever Format -> SegmentMeta metaFormat format' = mempty { format = Just format' } metaMaybeFormat :: Maybe (Whatever Format) -> SegmentMeta metaMaybeFormat maybeFormat = mempty { format = maybeFormat }