]> gitweb @ CieloNegro.org - Lucu.git/blob - Network/HTTP/Lucu/Resource/Dispatcher.hs
() should be an instance of Dispatchable.
[Lucu.git] / Network / HTTP / Lucu / Resource / Dispatcher.hs
1 {-# LANGUAGE
2     ExistentialQuantification
3   , FlexibleInstances
4   , UnicodeSyntax
5   #-}
6 -- |FIXME: doc
7 module Network.HTTP.Lucu.Resource.Dispatcher
8     ( Dispatchable(..)
9     , Dispatcher
10     )
11     where
12 import Control.Applicative
13 import Data.ByteString (ByteString)
14 import Data.CaseInsensitive (CI)
15 import Data.Monoid
16 import Data.Text (Text)
17 import Network.HTTP.Lucu.Resource.Internal
18 import Prelude.Unicode
19
20 -- |FIXME: docs
21 class Dispatchable α where
22     dispatch ∷ α
23              → CI Text
24              → [ByteString]
25              → IO (Maybe ([ByteString], ResourceDef))
26
27     dispatcher ∷ α → Dispatcher
28     {-# INLINE dispatcher #-}
29     dispatcher = Dispatcher
30
31 -- |FIXME: doc
32 data Dispatcher = ∀α. Dispatchable α ⇒ Dispatcher α
33
34 instance Dispatchable Dispatcher where
35     dispatch (Dispatcher α) = dispatch α
36     dispatcher = id
37
38 -- |FIXME: doc
39 instance Monoid Dispatcher where
40     {-# INLINE mempty #-}
41     mempty = dispatcher ()
42
43     {-# INLINEABLE mappend #-}
44     mappend (Dispatcher α) (Dispatcher β)
45         = dispatcher
46           $ \host path → do r ← dispatch α host path
47                             case r of
48                               Just _  → return r
49                               Nothing → dispatch β host path
50
51 instance Dispatchable (CI Text
52                        → [ByteString]
53                        → IO (Maybe ([ByteString], ResourceDef))) where
54     dispatch = id
55
56 instance Dispatchable (CI Text → [ByteString] → IO (Maybe ResourceDef)) where
57     dispatch = ((((<$>) ∘ (<$>)) ((,) []) ∘) ∘)
58
59 instance Dispatchable (CI Text → [ByteString] → Maybe ResourceDef) where
60     dispatch = (((return ∘ ((,) [] <$>)) ∘) ∘)
61
62 instance Dispatchable ([ByteString] → IO (Maybe ResourceDef)) where
63     dispatch = const ∘ (((<$>) ∘ (<$>)) ((,) []) ∘)
64
65 instance Dispatchable ([ByteString] → Maybe ResourceDef) where
66     dispatch = const ∘ ((return ∘ ((,) [] <$>)) ∘)
67
68 instance Dispatchable (IO (Maybe ResourceDef)) where
69     dispatch = const ∘ const ∘ ((<$>) ∘ (<$>)) ((,) [])
70
71 -- |The constant dispatcher returning always the same 'ResourceDef'.
72 instance Dispatchable ResourceDef where
73     dispatch = const ∘ const ∘ return ∘ Just ∘ (,) []
74
75 -- |The empty dispatcher returning always 'Nothing'.
76 instance Dispatchable () where
77     dispatch _ _ _ = return Nothing