module Chez.Grater.Scraper.Types where

import Chez.Grater.Internal.Prelude

import Data.Hashable (Hashable)
import Data.String (IsString)
import GHC.Generics (Generic)
import Text.HTML.Scalpel (Scraper)
import qualified Data.Text as Text
import qualified Text.HTML.Scalpel as Scalpel

-- |Wrapper for scraper metadata.
data ScrapeMetaWrapper
  = ScrapeMetaWrapperIngredient (ScrapeMeta ScrapedIngredient)
  | ScrapeMetaWrapperIngredientAndStep (ScrapeMeta ScrapedIngredient) (ScrapeMeta ScrapedStep)
  deriving (ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
(ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool)
-> (ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool)
-> Eq ScrapeMetaWrapper
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
$c/= :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
== :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
$c== :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
Eq, Eq ScrapeMetaWrapper
Eq ScrapeMetaWrapper
-> (ScrapeMetaWrapper -> ScrapeMetaWrapper -> Ordering)
-> (ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool)
-> (ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool)
-> (ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool)
-> (ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool)
-> (ScrapeMetaWrapper -> ScrapeMetaWrapper -> ScrapeMetaWrapper)
-> (ScrapeMetaWrapper -> ScrapeMetaWrapper -> ScrapeMetaWrapper)
-> Ord ScrapeMetaWrapper
ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
ScrapeMetaWrapper -> ScrapeMetaWrapper -> Ordering
ScrapeMetaWrapper -> ScrapeMetaWrapper -> ScrapeMetaWrapper
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> ScrapeMetaWrapper
$cmin :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> ScrapeMetaWrapper
max :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> ScrapeMetaWrapper
$cmax :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> ScrapeMetaWrapper
>= :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
$c>= :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
> :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
$c> :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
<= :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
$c<= :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
< :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
$c< :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Bool
compare :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Ordering
$ccompare :: ScrapeMetaWrapper -> ScrapeMetaWrapper -> Ordering
$cp1Ord :: Eq ScrapeMetaWrapper
Ord, Int -> ScrapeMetaWrapper -> ShowS
[ScrapeMetaWrapper] -> ShowS
ScrapeMetaWrapper -> String
(Int -> ScrapeMetaWrapper -> ShowS)
-> (ScrapeMetaWrapper -> String)
-> ([ScrapeMetaWrapper] -> ShowS)
-> Show ScrapeMetaWrapper
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ScrapeMetaWrapper] -> ShowS
$cshowList :: [ScrapeMetaWrapper] -> ShowS
show :: ScrapeMetaWrapper -> String
$cshow :: ScrapeMetaWrapper -> String
showsPrec :: Int -> ScrapeMetaWrapper -> ShowS
$cshowsPrec :: Int -> ScrapeMetaWrapper -> ShowS
Show)

-- |Name of a scraper.
newtype ScrapeName = ScrapeName { ScrapeName -> Text
unScrapeName :: Text }
  deriving (ScrapeName -> ScrapeName -> Bool
(ScrapeName -> ScrapeName -> Bool)
-> (ScrapeName -> ScrapeName -> Bool) -> Eq ScrapeName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScrapeName -> ScrapeName -> Bool
$c/= :: ScrapeName -> ScrapeName -> Bool
== :: ScrapeName -> ScrapeName -> Bool
$c== :: ScrapeName -> ScrapeName -> Bool
Eq, Eq ScrapeName
Eq ScrapeName
-> (ScrapeName -> ScrapeName -> Ordering)
-> (ScrapeName -> ScrapeName -> Bool)
-> (ScrapeName -> ScrapeName -> Bool)
-> (ScrapeName -> ScrapeName -> Bool)
-> (ScrapeName -> ScrapeName -> Bool)
-> (ScrapeName -> ScrapeName -> ScrapeName)
-> (ScrapeName -> ScrapeName -> ScrapeName)
-> Ord ScrapeName
ScrapeName -> ScrapeName -> Bool
ScrapeName -> ScrapeName -> Ordering
ScrapeName -> ScrapeName -> ScrapeName
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ScrapeName -> ScrapeName -> ScrapeName
$cmin :: ScrapeName -> ScrapeName -> ScrapeName
max :: ScrapeName -> ScrapeName -> ScrapeName
$cmax :: ScrapeName -> ScrapeName -> ScrapeName
>= :: ScrapeName -> ScrapeName -> Bool
$c>= :: ScrapeName -> ScrapeName -> Bool
> :: ScrapeName -> ScrapeName -> Bool
$c> :: ScrapeName -> ScrapeName -> Bool
<= :: ScrapeName -> ScrapeName -> Bool
$c<= :: ScrapeName -> ScrapeName -> Bool
< :: ScrapeName -> ScrapeName -> Bool
$c< :: ScrapeName -> ScrapeName -> Bool
compare :: ScrapeName -> ScrapeName -> Ordering
$ccompare :: ScrapeName -> ScrapeName -> Ordering
$cp1Ord :: Eq ScrapeName
Ord, Int -> ScrapeName -> ShowS
[ScrapeName] -> ShowS
ScrapeName -> String
(Int -> ScrapeName -> ShowS)
-> (ScrapeName -> String)
-> ([ScrapeName] -> ShowS)
-> Show ScrapeName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ScrapeName] -> ShowS
$cshowList :: [ScrapeName] -> ShowS
show :: ScrapeName -> String
$cshow :: ScrapeName -> String
showsPrec :: Int -> ScrapeName -> ShowS
$cshowsPrec :: Int -> ScrapeName -> ShowS
Show, (forall x. ScrapeName -> Rep ScrapeName x)
-> (forall x. Rep ScrapeName x -> ScrapeName) -> Generic ScrapeName
forall x. Rep ScrapeName x -> ScrapeName
forall x. ScrapeName -> Rep ScrapeName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ScrapeName x -> ScrapeName
$cfrom :: forall x. ScrapeName -> Rep ScrapeName x
Generic)

-- |Version of a scraper.
newtype ScrapeVersion = ScrapeVersion { ScrapeVersion -> Int
unScrapeVersion :: Int }
  deriving (ScrapeVersion -> ScrapeVersion -> Bool
(ScrapeVersion -> ScrapeVersion -> Bool)
-> (ScrapeVersion -> ScrapeVersion -> Bool) -> Eq ScrapeVersion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScrapeVersion -> ScrapeVersion -> Bool
$c/= :: ScrapeVersion -> ScrapeVersion -> Bool
== :: ScrapeVersion -> ScrapeVersion -> Bool
$c== :: ScrapeVersion -> ScrapeVersion -> Bool
Eq, Eq ScrapeVersion
Eq ScrapeVersion
-> (ScrapeVersion -> ScrapeVersion -> Ordering)
-> (ScrapeVersion -> ScrapeVersion -> Bool)
-> (ScrapeVersion -> ScrapeVersion -> Bool)
-> (ScrapeVersion -> ScrapeVersion -> Bool)
-> (ScrapeVersion -> ScrapeVersion -> Bool)
-> (ScrapeVersion -> ScrapeVersion -> ScrapeVersion)
-> (ScrapeVersion -> ScrapeVersion -> ScrapeVersion)
-> Ord ScrapeVersion
ScrapeVersion -> ScrapeVersion -> Bool
ScrapeVersion -> ScrapeVersion -> Ordering
ScrapeVersion -> ScrapeVersion -> ScrapeVersion
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ScrapeVersion -> ScrapeVersion -> ScrapeVersion
$cmin :: ScrapeVersion -> ScrapeVersion -> ScrapeVersion
max :: ScrapeVersion -> ScrapeVersion -> ScrapeVersion
$cmax :: ScrapeVersion -> ScrapeVersion -> ScrapeVersion
>= :: ScrapeVersion -> ScrapeVersion -> Bool
$c>= :: ScrapeVersion -> ScrapeVersion -> Bool
> :: ScrapeVersion -> ScrapeVersion -> Bool
$c> :: ScrapeVersion -> ScrapeVersion -> Bool
<= :: ScrapeVersion -> ScrapeVersion -> Bool
$c<= :: ScrapeVersion -> ScrapeVersion -> Bool
< :: ScrapeVersion -> ScrapeVersion -> Bool
$c< :: ScrapeVersion -> ScrapeVersion -> Bool
compare :: ScrapeVersion -> ScrapeVersion -> Ordering
$ccompare :: ScrapeVersion -> ScrapeVersion -> Ordering
$cp1Ord :: Eq ScrapeVersion
Ord, Int -> ScrapeVersion -> ShowS
[ScrapeVersion] -> ShowS
ScrapeVersion -> String
(Int -> ScrapeVersion -> ShowS)
-> (ScrapeVersion -> String)
-> ([ScrapeVersion] -> ShowS)
-> Show ScrapeVersion
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ScrapeVersion] -> ShowS
$cshowList :: [ScrapeVersion] -> ShowS
show :: ScrapeVersion -> String
$cshow :: ScrapeVersion -> String
showsPrec :: Int -> ScrapeVersion -> ShowS
$cshowsPrec :: Int -> ScrapeVersion -> ShowS
Show, (forall x. ScrapeVersion -> Rep ScrapeVersion x)
-> (forall x. Rep ScrapeVersion x -> ScrapeVersion)
-> Generic ScrapeVersion
forall x. Rep ScrapeVersion x -> ScrapeVersion
forall x. ScrapeVersion -> Rep ScrapeVersion x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ScrapeVersion x -> ScrapeVersion
$cfrom :: forall x. ScrapeVersion -> Rep ScrapeVersion x
Generic)

-- |Metadata for a scraper.
data ScrapeMeta a = ScrapeMeta
  { ScrapeMeta a -> ScrapeName
scrapeMetaName    :: ScrapeName
  , ScrapeMeta a -> ScrapeVersion
scrapeMetaVersion :: ScrapeVersion
  }
  deriving (ScrapeMeta a -> ScrapeMeta a -> Bool
(ScrapeMeta a -> ScrapeMeta a -> Bool)
-> (ScrapeMeta a -> ScrapeMeta a -> Bool) -> Eq (ScrapeMeta a)
forall a. ScrapeMeta a -> ScrapeMeta a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScrapeMeta a -> ScrapeMeta a -> Bool
$c/= :: forall a. ScrapeMeta a -> ScrapeMeta a -> Bool
== :: ScrapeMeta a -> ScrapeMeta a -> Bool
$c== :: forall a. ScrapeMeta a -> ScrapeMeta a -> Bool
Eq, Eq (ScrapeMeta a)
Eq (ScrapeMeta a)
-> (ScrapeMeta a -> ScrapeMeta a -> Ordering)
-> (ScrapeMeta a -> ScrapeMeta a -> Bool)
-> (ScrapeMeta a -> ScrapeMeta a -> Bool)
-> (ScrapeMeta a -> ScrapeMeta a -> Bool)
-> (ScrapeMeta a -> ScrapeMeta a -> Bool)
-> (ScrapeMeta a -> ScrapeMeta a -> ScrapeMeta a)
-> (ScrapeMeta a -> ScrapeMeta a -> ScrapeMeta a)
-> Ord (ScrapeMeta a)
ScrapeMeta a -> ScrapeMeta a -> Bool
ScrapeMeta a -> ScrapeMeta a -> Ordering
ScrapeMeta a -> ScrapeMeta a -> ScrapeMeta a
forall a. Eq (ScrapeMeta a)
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. ScrapeMeta a -> ScrapeMeta a -> Bool
forall a. ScrapeMeta a -> ScrapeMeta a -> Ordering
forall a. ScrapeMeta a -> ScrapeMeta a -> ScrapeMeta a
min :: ScrapeMeta a -> ScrapeMeta a -> ScrapeMeta a
$cmin :: forall a. ScrapeMeta a -> ScrapeMeta a -> ScrapeMeta a
max :: ScrapeMeta a -> ScrapeMeta a -> ScrapeMeta a
$cmax :: forall a. ScrapeMeta a -> ScrapeMeta a -> ScrapeMeta a
>= :: ScrapeMeta a -> ScrapeMeta a -> Bool
$c>= :: forall a. ScrapeMeta a -> ScrapeMeta a -> Bool
> :: ScrapeMeta a -> ScrapeMeta a -> Bool
$c> :: forall a. ScrapeMeta a -> ScrapeMeta a -> Bool
<= :: ScrapeMeta a -> ScrapeMeta a -> Bool
$c<= :: forall a. ScrapeMeta a -> ScrapeMeta a -> Bool
< :: ScrapeMeta a -> ScrapeMeta a -> Bool
$c< :: forall a. ScrapeMeta a -> ScrapeMeta a -> Bool
compare :: ScrapeMeta a -> ScrapeMeta a -> Ordering
$ccompare :: forall a. ScrapeMeta a -> ScrapeMeta a -> Ordering
$cp1Ord :: forall a. Eq (ScrapeMeta a)
Ord, Int -> ScrapeMeta a -> ShowS
[ScrapeMeta a] -> ShowS
ScrapeMeta a -> String
(Int -> ScrapeMeta a -> ShowS)
-> (ScrapeMeta a -> String)
-> ([ScrapeMeta a] -> ShowS)
-> Show (ScrapeMeta a)
forall a. Int -> ScrapeMeta a -> ShowS
forall a. [ScrapeMeta a] -> ShowS
forall a. ScrapeMeta a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ScrapeMeta a] -> ShowS
$cshowList :: forall a. [ScrapeMeta a] -> ShowS
show :: ScrapeMeta a -> String
$cshow :: forall a. ScrapeMeta a -> String
showsPrec :: Int -> ScrapeMeta a -> ShowS
$cshowsPrec :: forall a. Int -> ScrapeMeta a -> ShowS
Show, (forall x. ScrapeMeta a -> Rep (ScrapeMeta a) x)
-> (forall x. Rep (ScrapeMeta a) x -> ScrapeMeta a)
-> Generic (ScrapeMeta a)
forall x. Rep (ScrapeMeta a) x -> ScrapeMeta a
forall x. ScrapeMeta a -> Rep (ScrapeMeta a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (ScrapeMeta a) x -> ScrapeMeta a
forall a x. ScrapeMeta a -> Rep (ScrapeMeta a) x
$cto :: forall a x. Rep (ScrapeMeta a) x -> ScrapeMeta a
$cfrom :: forall a x. ScrapeMeta a -> Rep (ScrapeMeta a) x
Generic)

-- |The `<title>` element of the HTML.
newtype ScrapedRecipeName = ScrapedRecipeName { ScrapedRecipeName -> Text
unScrapedRecipeName :: Text }
  deriving (ScrapedRecipeName -> ScrapedRecipeName -> Bool
(ScrapedRecipeName -> ScrapedRecipeName -> Bool)
-> (ScrapedRecipeName -> ScrapedRecipeName -> Bool)
-> Eq ScrapedRecipeName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScrapedRecipeName -> ScrapedRecipeName -> Bool
$c/= :: ScrapedRecipeName -> ScrapedRecipeName -> Bool
== :: ScrapedRecipeName -> ScrapedRecipeName -> Bool
$c== :: ScrapedRecipeName -> ScrapedRecipeName -> Bool
Eq, Int -> ScrapedRecipeName -> ShowS
[ScrapedRecipeName] -> ShowS
ScrapedRecipeName -> String
(Int -> ScrapedRecipeName -> ShowS)
-> (ScrapedRecipeName -> String)
-> ([ScrapedRecipeName] -> ShowS)
-> Show ScrapedRecipeName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ScrapedRecipeName] -> ShowS
$cshowList :: [ScrapedRecipeName] -> ShowS
show :: ScrapedRecipeName -> String
$cshow :: ScrapedRecipeName -> String
showsPrec :: Int -> ScrapedRecipeName -> ShowS
$cshowsPrec :: Int -> ScrapedRecipeName -> ShowS
Show, (forall x. ScrapedRecipeName -> Rep ScrapedRecipeName x)
-> (forall x. Rep ScrapedRecipeName x -> ScrapedRecipeName)
-> Generic ScrapedRecipeName
forall x. Rep ScrapedRecipeName x -> ScrapedRecipeName
forall x. ScrapedRecipeName -> Rep ScrapedRecipeName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ScrapedRecipeName x -> ScrapedRecipeName
$cfrom :: forall x. ScrapedRecipeName -> Rep ScrapedRecipeName x
Generic)

-- |Unparsed ingredient.
data ScrapedIngredient = ScrapedIngredient Text
  deriving (ScrapedIngredient -> ScrapedIngredient -> Bool
(ScrapedIngredient -> ScrapedIngredient -> Bool)
-> (ScrapedIngredient -> ScrapedIngredient -> Bool)
-> Eq ScrapedIngredient
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScrapedIngredient -> ScrapedIngredient -> Bool
$c/= :: ScrapedIngredient -> ScrapedIngredient -> Bool
== :: ScrapedIngredient -> ScrapedIngredient -> Bool
$c== :: ScrapedIngredient -> ScrapedIngredient -> Bool
Eq, Eq ScrapedIngredient
Eq ScrapedIngredient
-> (ScrapedIngredient -> ScrapedIngredient -> Ordering)
-> (ScrapedIngredient -> ScrapedIngredient -> Bool)
-> (ScrapedIngredient -> ScrapedIngredient -> Bool)
-> (ScrapedIngredient -> ScrapedIngredient -> Bool)
-> (ScrapedIngredient -> ScrapedIngredient -> Bool)
-> (ScrapedIngredient -> ScrapedIngredient -> ScrapedIngredient)
-> (ScrapedIngredient -> ScrapedIngredient -> ScrapedIngredient)
-> Ord ScrapedIngredient
ScrapedIngredient -> ScrapedIngredient -> Bool
ScrapedIngredient -> ScrapedIngredient -> Ordering
ScrapedIngredient -> ScrapedIngredient -> ScrapedIngredient
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ScrapedIngredient -> ScrapedIngredient -> ScrapedIngredient
$cmin :: ScrapedIngredient -> ScrapedIngredient -> ScrapedIngredient
max :: ScrapedIngredient -> ScrapedIngredient -> ScrapedIngredient
$cmax :: ScrapedIngredient -> ScrapedIngredient -> ScrapedIngredient
>= :: ScrapedIngredient -> ScrapedIngredient -> Bool
$c>= :: ScrapedIngredient -> ScrapedIngredient -> Bool
> :: ScrapedIngredient -> ScrapedIngredient -> Bool
$c> :: ScrapedIngredient -> ScrapedIngredient -> Bool
<= :: ScrapedIngredient -> ScrapedIngredient -> Bool
$c<= :: ScrapedIngredient -> ScrapedIngredient -> Bool
< :: ScrapedIngredient -> ScrapedIngredient -> Bool
$c< :: ScrapedIngredient -> ScrapedIngredient -> Bool
compare :: ScrapedIngredient -> ScrapedIngredient -> Ordering
$ccompare :: ScrapedIngredient -> ScrapedIngredient -> Ordering
$cp1Ord :: Eq ScrapedIngredient
Ord, Int -> ScrapedIngredient -> ShowS
[ScrapedIngredient] -> ShowS
ScrapedIngredient -> String
(Int -> ScrapedIngredient -> ShowS)
-> (ScrapedIngredient -> String)
-> ([ScrapedIngredient] -> ShowS)
-> Show ScrapedIngredient
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ScrapedIngredient] -> ShowS
$cshowList :: [ScrapedIngredient] -> ShowS
show :: ScrapedIngredient -> String
$cshow :: ScrapedIngredient -> String
showsPrec :: Int -> ScrapedIngredient -> ShowS
$cshowsPrec :: Int -> ScrapedIngredient -> ShowS
Show)

data ScrapedStep = ScrapedStep Text
  deriving (ScrapedStep -> ScrapedStep -> Bool
(ScrapedStep -> ScrapedStep -> Bool)
-> (ScrapedStep -> ScrapedStep -> Bool) -> Eq ScrapedStep
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScrapedStep -> ScrapedStep -> Bool
$c/= :: ScrapedStep -> ScrapedStep -> Bool
== :: ScrapedStep -> ScrapedStep -> Bool
$c== :: ScrapedStep -> ScrapedStep -> Bool
Eq, Eq ScrapedStep
Eq ScrapedStep
-> (ScrapedStep -> ScrapedStep -> Ordering)
-> (ScrapedStep -> ScrapedStep -> Bool)
-> (ScrapedStep -> ScrapedStep -> Bool)
-> (ScrapedStep -> ScrapedStep -> Bool)
-> (ScrapedStep -> ScrapedStep -> Bool)
-> (ScrapedStep -> ScrapedStep -> ScrapedStep)
-> (ScrapedStep -> ScrapedStep -> ScrapedStep)
-> Ord ScrapedStep
ScrapedStep -> ScrapedStep -> Bool
ScrapedStep -> ScrapedStep -> Ordering
ScrapedStep -> ScrapedStep -> ScrapedStep
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ScrapedStep -> ScrapedStep -> ScrapedStep
$cmin :: ScrapedStep -> ScrapedStep -> ScrapedStep
max :: ScrapedStep -> ScrapedStep -> ScrapedStep
$cmax :: ScrapedStep -> ScrapedStep -> ScrapedStep
>= :: ScrapedStep -> ScrapedStep -> Bool
$c>= :: ScrapedStep -> ScrapedStep -> Bool
> :: ScrapedStep -> ScrapedStep -> Bool
$c> :: ScrapedStep -> ScrapedStep -> Bool
<= :: ScrapedStep -> ScrapedStep -> Bool
$c<= :: ScrapedStep -> ScrapedStep -> Bool
< :: ScrapedStep -> ScrapedStep -> Bool
$c< :: ScrapedStep -> ScrapedStep -> Bool
compare :: ScrapedStep -> ScrapedStep -> Ordering
$ccompare :: ScrapedStep -> ScrapedStep -> Ordering
$cp1Ord :: Eq ScrapedStep
Ord, Int -> ScrapedStep -> ShowS
[ScrapedStep] -> ShowS
ScrapedStep -> String
(Int -> ScrapedStep -> ShowS)
-> (ScrapedStep -> String)
-> ([ScrapedStep] -> ShowS)
-> Show ScrapedStep
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ScrapedStep] -> ShowS
$cshowList :: [ScrapedStep] -> ShowS
show :: ScrapedStep -> String
$cshow :: ScrapedStep -> String
showsPrec :: Int -> ScrapedStep -> ShowS
$cshowsPrec :: Int -> ScrapedStep -> ShowS
Show)

data IngredientScraper = IngredientScraper
  { IngredientScraper -> ScrapeMeta ScrapedIngredient
ingredientScraperMeta :: ScrapeMeta ScrapedIngredient
  -- ^Metadata about the scraper.
  , IngredientScraper -> Scraper Text Bool
ingredientScraperTest :: Scraper Text Bool
  -- ^A test on the HTML to see if this scraper should work.
  , IngredientScraper -> Scraper Text [ScrapedIngredient]
ingredientScraperRun  :: Scraper Text [ScrapedIngredient]
  -- ^Run the scraper!
  }

data StepScraper = StepScraper
  { StepScraper -> ScrapeMeta ScrapedStep
stepScraperMeta :: ScrapeMeta ScrapedStep
  -- ^Metadata about the scraper.
  , StepScraper -> Scraper Text Bool
stepScraperTest :: Scraper Text Bool
  -- ^A test on the HTML to see if this scraper should work.
  , StepScraper -> Scraper Text [ScrapedStep]
stepScraperRun  :: Scraper Text [ScrapedStep]
  -- ^Run the scraper!
  }

-- |Domain like `halfbakedharvest.com`.
newtype SiteName = SiteName { SiteName -> Text
unSiteName :: Text }
  deriving (SiteName -> SiteName -> Bool
(SiteName -> SiteName -> Bool)
-> (SiteName -> SiteName -> Bool) -> Eq SiteName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SiteName -> SiteName -> Bool
$c/= :: SiteName -> SiteName -> Bool
== :: SiteName -> SiteName -> Bool
$c== :: SiteName -> SiteName -> Bool
Eq, Eq SiteName
Eq SiteName
-> (SiteName -> SiteName -> Ordering)
-> (SiteName -> SiteName -> Bool)
-> (SiteName -> SiteName -> Bool)
-> (SiteName -> SiteName -> Bool)
-> (SiteName -> SiteName -> Bool)
-> (SiteName -> SiteName -> SiteName)
-> (SiteName -> SiteName -> SiteName)
-> Ord SiteName
SiteName -> SiteName -> Bool
SiteName -> SiteName -> Ordering
SiteName -> SiteName -> SiteName
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SiteName -> SiteName -> SiteName
$cmin :: SiteName -> SiteName -> SiteName
max :: SiteName -> SiteName -> SiteName
$cmax :: SiteName -> SiteName -> SiteName
>= :: SiteName -> SiteName -> Bool
$c>= :: SiteName -> SiteName -> Bool
> :: SiteName -> SiteName -> Bool
$c> :: SiteName -> SiteName -> Bool
<= :: SiteName -> SiteName -> Bool
$c<= :: SiteName -> SiteName -> Bool
< :: SiteName -> SiteName -> Bool
$c< :: SiteName -> SiteName -> Bool
compare :: SiteName -> SiteName -> Ordering
$ccompare :: SiteName -> SiteName -> Ordering
$cp1Ord :: Eq SiteName
Ord, Int -> SiteName -> ShowS
[SiteName] -> ShowS
SiteName -> String
(Int -> SiteName -> ShowS)
-> (SiteName -> String) -> ([SiteName] -> ShowS) -> Show SiteName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SiteName] -> ShowS
$cshowList :: [SiteName] -> ShowS
show :: SiteName -> String
$cshow :: SiteName -> String
showsPrec :: Int -> SiteName -> ShowS
$cshowsPrec :: Int -> SiteName -> ShowS
Show, String -> SiteName
(String -> SiteName) -> IsString SiteName
forall a. (String -> a) -> IsString a
fromString :: String -> SiteName
$cfromString :: String -> SiteName
IsString, Int -> SiteName -> Int
SiteName -> Int
(Int -> SiteName -> Int) -> (SiteName -> Int) -> Hashable SiteName
forall a. (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: SiteName -> Int
$chash :: SiteName -> Int
hashWithSalt :: Int -> SiteName -> Int
$chashWithSalt :: Int -> SiteName -> Int
Hashable)

data Scrapers = Scrapers
  { Scrapers -> HashMap SiteName IngredientScraper
scrapersIngredientBySite :: HashMap SiteName IngredientScraper
  , Scrapers -> [IngredientScraper]
scrapersIngredients      :: [IngredientScraper]
  , Scrapers -> HashMap SiteName StepScraper
scrapersStepBySite       :: HashMap SiteName StepScraper
  , Scrapers -> [StepScraper]
scrapersSites            :: [StepScraper]
  }

data ScrapeError = ScrapeError Text
  deriving (ScrapeError -> ScrapeError -> Bool
(ScrapeError -> ScrapeError -> Bool)
-> (ScrapeError -> ScrapeError -> Bool) -> Eq ScrapeError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ScrapeError -> ScrapeError -> Bool
$c/= :: ScrapeError -> ScrapeError -> Bool
== :: ScrapeError -> ScrapeError -> Bool
$c== :: ScrapeError -> ScrapeError -> Bool
Eq, Int -> ScrapeError -> ShowS
[ScrapeError] -> ShowS
ScrapeError -> String
(Int -> ScrapeError -> ShowS)
-> (ScrapeError -> String)
-> ([ScrapeError] -> ShowS)
-> Show ScrapeError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ScrapeError] -> ShowS
$cshowList :: [ScrapeError] -> ShowS
show :: ScrapeError -> String
$cshow :: ScrapeError -> String
showsPrec :: Int -> ScrapeError -> ShowS
$cshowsPrec :: Int -> ScrapeError -> ShowS
Show)

instance Exception ScrapeError

title :: Scraper Text ScrapedRecipeName
title :: Scraper Text ScrapedRecipeName
title = Text -> ScrapedRecipeName
ScrapedRecipeName (Text -> ScrapedRecipeName)
-> (Text -> Text) -> Text -> ScrapedRecipeName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
Text.strip (Text -> ScrapedRecipeName)
-> ScraperT Text Identity Text -> Scraper Text ScrapedRecipeName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Selector -> ScraperT Text Identity Text
forall str (m :: * -> *).
(StringLike str, Monad m) =>
Selector -> ScraperT str m str
Scalpel.text Selector
"title"

inception :: ScrapeVersion
inception :: ScrapeVersion
inception = Int -> ScrapeVersion
ScrapeVersion Int
1