{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE Safe #-}
module Hasklepias.Types.Event(
Event
, Events
, ConceptEvent
, event
, ctxt
, toConceptEvent
, toConceptEventOf
, mkConceptEvent
) where
import GHC.Show ( Show(show) )
import Data.Function ( ($) )
import Data.Set ( member, fromList, intersection )
import Data.Ord ( Ord )
import IntervalAlgebra ( Interval
, Intervallic
, Intervallic (getInterval) )
import IntervalAlgebra.PairedInterval ( PairedInterval
, makePairedInterval
, getPairData )
import Hasklepias.Types.Context ( HasConcept(..)
, Concepts
, Concept
, packConcept
, Context (getConcepts)
, fromConcepts
, toConcepts )
type Event a = PairedInterval Context a
instance HasConcept (Event a) where
hasConcept :: Event a -> Text -> Bool
hasConcept Event a
x Text
y = Event a -> Context
forall a. Event a -> Context
ctxt Event a
x Context -> Text -> Bool
forall a. HasConcept a => a -> Text -> Bool
`hasConcept` Text
y
event :: Interval a -> Context -> Event a
event :: Interval a -> Context -> Event a
event Interval a
i Context
c = Context -> Interval a -> Event a
forall b a. b -> Interval a -> PairedInterval b a
makePairedInterval Context
c Interval a
i
ctxt :: Event a -> Context
ctxt :: Event a -> Context
ctxt = Event a -> Context
forall b a. PairedInterval b a -> b
getPairData
type ConceptEvent a = PairedInterval Concepts a
instance HasConcept (ConceptEvent a) where
hasConcept :: ConceptEvent a -> Text -> Bool
hasConcept ConceptEvent a
e Text
concept = Concept -> Set Concept -> Bool
forall a. Ord a => a -> Set a -> Bool
member (Text -> Concept
packConcept Text
concept) (Concepts -> Set Concept
fromConcepts (Concepts -> Set Concept) -> Concepts -> Set Concept
forall a b. (a -> b) -> a -> b
$ ConceptEvent a -> Concepts
forall b a. PairedInterval b a -> b
getPairData ConceptEvent a
e)
toConceptEvent :: (Show a, Ord a) => Event a -> ConceptEvent a
toConceptEvent :: Event a -> ConceptEvent a
toConceptEvent Event a
e = Concepts -> Interval a -> ConceptEvent a
forall b a. b -> Interval a -> PairedInterval b a
makePairedInterval (Context -> Concepts
getConcepts (Context -> Concepts) -> Context -> Concepts
forall a b. (a -> b) -> a -> b
$ Event a -> Context
forall a. Event a -> Context
ctxt Event a
e) (Event a -> Interval a
forall (i :: * -> *) a. Intervallic i a => i a -> Interval a
getInterval Event a
e)
toConceptEventOf :: (Show a, Ord a) => [Concept] -> Event a -> ConceptEvent a
toConceptEventOf :: [Concept] -> Event a -> ConceptEvent a
toConceptEventOf [Concept]
cpts Event a
e =
Concepts -> Interval a -> ConceptEvent a
forall b a. b -> Interval a -> PairedInterval b a
makePairedInterval
(Set Concept -> Concepts
toConcepts (Set Concept -> Concepts) -> Set Concept -> Concepts
forall a b. (a -> b) -> a -> b
$ Set Concept -> Set Concept -> Set Concept
forall a. Ord a => Set a -> Set a -> Set a
intersection ([Concept] -> Set Concept
forall a. Ord a => [a] -> Set a
fromList [Concept]
cpts) (Concepts -> Set Concept
fromConcepts (Concepts -> Set Concept) -> Concepts -> Set Concept
forall a b. (a -> b) -> a -> b
$ Context -> Concepts
getConcepts (Context -> Concepts) -> Context -> Concepts
forall a b. (a -> b) -> a -> b
$ Event a -> Context
forall a. Event a -> Context
ctxt Event a
e))
(Event a -> Interval a
forall (i :: * -> *) a. Intervallic i a => i a -> Interval a
getInterval Event a
e)
mkConceptEvent :: (Show a, Ord a) => Interval a -> Concepts -> ConceptEvent a
mkConceptEvent :: Interval a -> Concepts -> ConceptEvent a
mkConceptEvent Interval a
i Concepts
c = Concepts -> Interval a -> ConceptEvent a
forall b a. b -> Interval a -> PairedInterval b a
makePairedInterval Concepts
c Interval a
i
type Events a = [Event a]