]> gitweb @ CieloNegro.org - Lucu.git/blob - Network/HTTP/Lucu/Resource/Dispatcher.hs
Eliminate some of Dispatchable instances.
[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     findResource ∷ α
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     findResource (Dispatcher α) = findResource α
36     dispatcher = id
37
38 -- |FIXME: doc
39 instance Monoid Dispatcher where
40     {-# INLINE mempty #-}
41     mempty = dispatcher (return Nothing ∷ IO (Maybe ResourceDef))
42
43     {-# INLINEABLE mappend #-}
44     mappend (Dispatcher α) (Dispatcher β)
45         = dispatcher
46           $ \host path → do r ← findResource α host path
47                             case r of
48                               Just _  → return r
49                               Nothing → findResource β host path
50
51 instance Dispatchable (CI Text
52                        → [ByteString]
53                        → IO (Maybe ([ByteString], ResourceDef))) where
54     findResource = id
55
56 instance Dispatchable (CI Text → [ByteString] → IO (Maybe ResourceDef)) where
57     findResource = ((((<$>) ∘ (<$>)) ((,) []) ∘) ∘)
58
59 instance Dispatchable (CI Text → [ByteString] → Maybe ResourceDef) where
60     findResource = (((return ∘ ((,) [] <$>)) ∘) ∘)
61
62 instance Dispatchable ([ByteString] → IO (Maybe ResourceDef)) where
63     findResource = const ∘ (((<$>) ∘ (<$>)) ((,) []) ∘)
64
65 instance Dispatchable ([ByteString] → Maybe ResourceDef) where
66     findResource = const ∘ ((return ∘ ((,) [] <$>)) ∘)
67
68 instance Dispatchable (IO (Maybe ResourceDef)) where
69     findResource = const ∘ const ∘ ((<$>) ∘ (<$>)) ((,) [])
70
71 instance Dispatchable ResourceDef where
72     findResource = const ∘ const ∘ return ∘ Just ∘ (,) []