{-# LANGUAGE OverloadedStrings #-}

module Media.Timestamp.Attoparsec
  ( parseTime,
    parseTimec,
    parseRange,
    parseRangeA,
  )
where

import Data.Attoparsec.Text
import Media.Timestamp

intChar :: Char -> Parser Int
intChar :: Char -> Parser Int
intChar Char
x = Parser Int
forall a. Integral a => Parser a
decimal Parser Int -> Parser Text Char -> Parser Int
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Text Char
char Char
x

-- | Parse a `Time` of the form `00:00:00.000`. This is ffmpeg's format.
--
-- @since 0.1.0.0
parseTime :: Parser Time
parseTime :: Parser Time
parseTime = Int -> Int -> Int -> Int -> Time
Time (Int -> Int -> Int -> Int -> Time)
-> Parser Int -> Parser Text (Int -> Int -> Int -> Time)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Char -> Parser Int
intChar Char
':' Parser Text (Int -> Int -> Int -> Time)
-> Parser Int -> Parser Text (Int -> Int -> Time)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Char -> Parser Int
intChar Char
':' Parser Text (Int -> Int -> Time)
-> Parser Int -> Parser Text (Int -> Time)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Char -> Parser Int
intChar Char
'.' Parser Text (Int -> Time) -> Parser Int -> Parser Time
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Int
forall a. Integral a => Parser a
decimal

-- | Parse a `Time` of the form `00:00:00,000`. This is srt format.
--
-- @since 0.1.0.0
parseTimec :: Parser Time
parseTimec :: Parser Time
parseTimec = Int -> Int -> Int -> Int -> Time
Time (Int -> Int -> Int -> Int -> Time)
-> Parser Int -> Parser Text (Int -> Int -> Int -> Time)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Char -> Parser Int
intChar Char
':' Parser Text (Int -> Int -> Int -> Time)
-> Parser Int -> Parser Text (Int -> Int -> Time)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Char -> Parser Int
intChar Char
':' Parser Text (Int -> Int -> Time)
-> Parser Int -> Parser Text (Int -> Time)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Char -> Parser Int
intChar Char
',' Parser Text (Int -> Time) -> Parser Int -> Parser Time
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Int
forall a. Integral a => Parser a
decimal

-- | Parse a `Range` of the form `(X,Y)`
--
-- @since 0.1.0.0
parseRange :: Parser Time -> Parser Range
parseRange :: Parser Time -> Parser Range
parseRange Parser Time
x = Time -> Time -> Range
Range (Time -> Time -> Range)
-> Parser Text Char -> Parser Text (Time -> Time -> Range)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> Parser Text Char
char Char
'(' Parser Text (Time -> Time -> Range)
-> Parser Time -> Parser Text (Time -> Range)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Time
x Parser Text (Time -> Range)
-> Parser Text Text -> Parser Text (Time -> Range)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text Text
"," Parser Text (Time -> Range) -> Parser Time -> Parser Range
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Time
x Parser Range -> Parser Text Char -> Parser Range
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Text Char
char Char
')'

-- | Parse a `Range` of the form `X --> Y`. This is srt format. A
-- parser for an SRT range would then be `parseRangeA parseTimec`.
--
-- @since 0.1.0.0
parseRangeA :: Parser Time -> Parser Range
parseRangeA :: Parser Time -> Parser Range
parseRangeA Parser Time
x = Time -> Time -> Range
Range (Time -> Time -> Range)
-> Parser Time -> Parser Text (Time -> Range)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Time
x Parser Text (Time -> Range)
-> Parser Text Text -> Parser Text (Time -> Range)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> Parser Text Text
string (Text
" --> ") Parser Text (Time -> Range) -> Parser Time -> Parser Range
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Time
x