aip-0.1.0: src/Data/Aviation/Aip/AfterDownload.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Aviation.Aip.AfterDownload(
AfterDownload(..)
, nothingAfterDownload
, filePathAfterDownload
, hrefAfterDownload
, AfterDownloadAipCon
) where
import Control.Category((.))
import Control.Applicative(Applicative(pure, (<*>)))
import Control.Lens
import Control.Monad(Monad(return, (>>=)))
import Data.Aviation.Aip.AipCon(AipCon)
import Data.Aviation.Aip.Href(Href)
import Data.Functor(Functor(fmap))
import System.FilePath(FilePath)
newtype AfterDownload f a =
AfterDownload
(FilePath -> Href -> f a)
instance Functor f => Functor (AfterDownload f) where
fmap f (AfterDownload x) =
AfterDownload (\p h -> fmap f (x p h))
instance Applicative f => Applicative (AfterDownload f) where
pure =
AfterDownload . pure . pure . pure
AfterDownload f <*> AfterDownload a =
AfterDownload (\p h -> f p h <*> a p h)
instance Monad f => Monad (AfterDownload f) where
return =
pure
AfterDownload x >>= f =
AfterDownload (\p h -> x p h >>= \a -> let g = f a ^. _Wrapped in g p h)
instance AfterDownload f a ~ x =>
Rewrapped (AfterDownload g k) x
instance Wrapped (AfterDownload f k) where
type Unwrapped (AfterDownload f k) =
FilePath
-> Href
-> f k
_Wrapped' =
iso
(\(AfterDownload x) -> x)
AfterDownload
nothingAfterDownload ::
Applicative f => AfterDownload f ()
nothingAfterDownload =
pure ()
filePathAfterDownload ::
Applicative f => AfterDownload f FilePath
filePathAfterDownload =
AfterDownload (\p _ -> pure p)
hrefAfterDownload ::
Applicative f => AfterDownload f Href
hrefAfterDownload =
AfterDownload (\_ h -> pure h)
type AfterDownloadAipCon a =
AfterDownload AipCon a