module Eventful.Store.Queries
  ( EventStoreQueryRange (..)
  , EventStoreQueryStart (..)
  , EventStoreQueryLimit (..)
  , allEvents
  , eventsUntil
  , eventsStartingAt
  , eventsStartingAtUntil
  , eventsStartingAtTakeLimit
  ) where
data EventStoreQueryRange a
  = EventStoreQueryRange
  { eventStoreQueryRangeStart :: EventStoreQueryStart a
  , eventStoreQueryRangeLimit :: EventStoreQueryLimit a
  } deriving (Functor)
data EventStoreQueryStart a
  = StartFromBeginning
  | StartQueryAt a
  deriving (Show, Eq, Functor)
data EventStoreQueryLimit a
  = NoQueryLimit
  | MaxNumberOfEvents Int
  | StopQueryAt a
  deriving (Show, Eq, Functor)
allEvents :: EventStoreQueryRange a
allEvents = EventStoreQueryRange StartFromBeginning NoQueryLimit
eventsUntil :: a -> EventStoreQueryRange a
eventsUntil end = EventStoreQueryRange StartFromBeginning (StopQueryAt end)
eventsStartingAt :: a -> EventStoreQueryRange a
eventsStartingAt start = EventStoreQueryRange (StartQueryAt start) NoQueryLimit
eventsStartingAtUntil :: a -> a -> EventStoreQueryRange a
eventsStartingAtUntil start end = EventStoreQueryRange (StartQueryAt start) (StopQueryAt end)
eventsStartingAtTakeLimit :: a -> Int -> EventStoreQueryRange a
eventsStartingAtTakeLimit start maxNum = EventStoreQueryRange (StartQueryAt start) (MaxNumberOfEvents maxNum)