{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-ignore-interface-pragmas #-}
{-# OPTIONS_GHC -fno-omit-interface-pragmas #-}
{-# OPTIONS_GHC -fno-specialise #-}

module PlutusLedgerApi.V4.Time
  ( POSIXTime (..)
  , POSIXTimeRange (..)
  ) where

import PlutusTx.Prelude

import Control.DeepSeq (NFData)
import GHC.Generics (Generic)
import PlutusLedgerApi.V1.Time (POSIXTime (..))
import PlutusTx (makeIsDataSchemaIndexed)
import PlutusTx.Blueprint (HasBlueprintDefinition)
import PlutusTx.Blueprint.Definition.Derive (definitionRef)
import PlutusTx.Lift (makeLift)
import Prettyprinter (Pretty (pretty), comma, (<+>))
import Prelude qualified as Haskell

data POSIXTimeRange = POSIXTimeRange
  { POSIXTimeRange -> Maybe POSIXTime
fromInclusive :: Maybe POSIXTime
  -- ^ 'Nothing' means negative infinity.
  , POSIXTimeRange -> Maybe POSIXTime
untilExclusive :: Maybe POSIXTime
  -- ^ 'Nothing' means positive infinity.
  }
  deriving stock (POSIXTimeRange -> POSIXTimeRange -> Bool
(POSIXTimeRange -> POSIXTimeRange -> Bool)
-> (POSIXTimeRange -> POSIXTimeRange -> Bool) -> Eq POSIXTimeRange
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: POSIXTimeRange -> POSIXTimeRange -> Bool
== :: POSIXTimeRange -> POSIXTimeRange -> Bool
$c/= :: POSIXTimeRange -> POSIXTimeRange -> Bool
/= :: POSIXTimeRange -> POSIXTimeRange -> Bool
Haskell.Eq, Int -> POSIXTimeRange -> ShowS
[POSIXTimeRange] -> ShowS
POSIXTimeRange -> String
(Int -> POSIXTimeRange -> ShowS)
-> (POSIXTimeRange -> String)
-> ([POSIXTimeRange] -> ShowS)
-> Show POSIXTimeRange
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> POSIXTimeRange -> ShowS
showsPrec :: Int -> POSIXTimeRange -> ShowS
$cshow :: POSIXTimeRange -> String
show :: POSIXTimeRange -> String
$cshowList :: [POSIXTimeRange] -> ShowS
showList :: [POSIXTimeRange] -> ShowS
Haskell.Show, (forall x. POSIXTimeRange -> Rep POSIXTimeRange x)
-> (forall x. Rep POSIXTimeRange x -> POSIXTimeRange)
-> Generic POSIXTimeRange
forall x. Rep POSIXTimeRange x -> POSIXTimeRange
forall x. POSIXTimeRange -> Rep POSIXTimeRange x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. POSIXTimeRange -> Rep POSIXTimeRange x
from :: forall x. POSIXTimeRange -> Rep POSIXTimeRange x
$cto :: forall x. Rep POSIXTimeRange x -> POSIXTimeRange
to :: forall x. Rep POSIXTimeRange x -> POSIXTimeRange
Generic)
  deriving anyclass (POSIXTimeRange -> ()
(POSIXTimeRange -> ()) -> NFData POSIXTimeRange
forall a. (a -> ()) -> NFData a
$crnf :: POSIXTimeRange -> ()
rnf :: POSIXTimeRange -> ()
NFData, DefinitionId
DefinitionId -> HasBlueprintDefinition POSIXTimeRange
forall t. DefinitionId -> HasBlueprintDefinition t
$cdefinitionId :: DefinitionId
definitionId :: DefinitionId
HasBlueprintDefinition)

instance Pretty POSIXTimeRange where
  pretty :: forall ann. POSIXTimeRange -> Doc ann
pretty (POSIXTimeRange Maybe POSIXTime
lo Maybe POSIXTime
hi) = Doc ann
forall {ann}. Doc ann
prettyFrom Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall {ann}. Doc ann
comma Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall {ann}. Doc ann
prettyUntil
    where
      prettyFrom :: Doc ann
prettyFrom = case Maybe POSIXTime
lo of
        Maybe POSIXTime
Nothing -> Doc ann
"(-Inf"
        Just POSIXTime
t -> Doc ann
"[" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> POSIXTime -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. POSIXTime -> Doc ann
pretty POSIXTime
t
      prettyUntil :: Doc ann
prettyUntil = case Maybe POSIXTime
hi of
        Maybe POSIXTime
Nothing -> Doc ann
"+Inf)"
        Just POSIXTime
t -> POSIXTime -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. POSIXTime -> Doc ann
pretty POSIXTime
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
")"

deriveEq ''POSIXTimeRange
$(makeIsDataSchemaIndexed ''POSIXTimeRange [('POSIXTimeRange, 0)])
$(makeLift ''POSIXTimeRange)