Skip to content

Commit d9ed240

Browse files
committed
Add/fix MTL type annotations
1 parent f45a6ec commit d9ed240

File tree

6 files changed

+52
-52
lines changed

6 files changed

+52
-52
lines changed

src/FSharpPlus/Control/MonadTrans.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,14 @@ type CallCC = static member inline Invoke (f: (('T -> '``MonadCont<'U>``) ->'``M
5252

5353
// MonadState
5454

55-
type Get = static member inline Invoke () : '``MonadState<'S * 'S>`` = (^``MonadState<'S * 'S>`` : (static member Get : _) ())
56-
type Put = static member inline Invoke (x: 'S) : '``MonadState<unit * 'S>`` = (^``MonadState<unit * 'S>`` : (static member Put : _ -> _) x)
55+
type Get = static member inline Invoke () : '``MonadState<'S, 'S>`` = (^``MonadState<'S, 'S>`` : (static member Get : _) ())
56+
type Put = static member inline Invoke (x: 'S) : '``MonadState<'S, unit>`` = (^``MonadState<'S, unit>`` : (static member Put : _ -> _) x)
5757

5858

5959
// MonadReader
6060

61-
type Ask = static member inline Invoke () : '``MonadReader<'R,'T>`` = (^``MonadReader<'R,'T>`` : (static member Ask : _) ())
62-
type Local = static member inline Invoke (f: 'R1->'R2) (m: ^``MonadReader<'R2,'T>``) : '``MonadReader<'R1,'T>`` = (^``MonadReader<'R1,'T>`` : (static member Local : _*_ -> _) m, f)
61+
type Ask = static member inline Invoke () : '``MonadReader<'R, 'T>`` = (^``MonadReader<'R, 'T>`` : (static member Ask : _) ())
62+
type Local = static member inline Invoke (f: 'R1 -> 'R2) (m: ^``MonadReader<'R2, 'T>``) : '``MonadReader<'R1, 'T>`` = (^``MonadReader<'R1, 'T>`` : (static member Local : _*_ -> _) m, f)
6363

6464

6565
// MonadWriter

src/FSharpPlus/Data/Error.fs

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,58 +34,58 @@ module ResultOrException =
3434

3535
/// Monad Transformer for Result<'T, 'E>
3636
[<Struct>]
37-
type ResultT<'``monad<'result<'t,'e>>``> = ResultT of '``monad<'result<'t,'e>>``
37+
type ResultT<'``monad<Result<'t,'e>>``> = ResultT of '``monad<Result<'t,'e>>``
3838

3939
/// Basic operations on ResultT
4040
[<RequireQualifiedAccess>]
4141
module ResultT =
42-
let run (ResultT x) = x : '``Monad<'Result<'T,'E>>``
42+
let run (ResultT x) = x : '``Monad<Result<'T,'E>>``
4343

44-
/// Embed a Monad<'T> into a ChoiceT<'Monad<Choice<'T,'Error>>>
45-
let inline lift (x: '``Monad<'T>``) : ResultT<'``Monad<Result<'T,'Error>>``> =
44+
/// Embed a Monad<'T> into a ResultT<'Monad<Result<'T, 'TError>>>
45+
let inline lift (x: '``Monad<'T>``) : ResultT<'``Monad<Result<'T,'TError>>``> =
4646
if opaqueId false then x |> liftM Ok |> ResultT
4747
else x |> map Ok |> ResultT
4848

4949
/// Transform a Result<'T,'Error> to a ResultT<'Monad<Result<'T,'Error>>>
5050
let inline hoist (x: Result<'T,'TError>) = ResultT (result x) : ResultT<'``Monad<Result<'T,'TError>>``>
5151

52-
let inline bind (f: 'T->ResultT<'``Monad<'Result<'U,'E>>``>) (ResultT m: ResultT<'``Monad<'Result<'T,'E>>``>) = (ResultT (m >>= (fun a -> match a with Error l -> result (Error l) | Ok r -> run (f r))))
52+
let inline bind (f: 'T->ResultT<'``Monad<Result<'U,'E>>``>) (ResultT m: ResultT<'``Monad<Result<'T,'E>>``>) = (ResultT (m >>= (fun a -> match a with Error l -> result (Error l) | Ok r -> run (f r))))
5353

54-
let inline apply (ResultT f:ResultT<'``Monad<'Result<('T -> 'U),'E>>``>) (ResultT x: ResultT<'``Monad<'Result<'T,'E>>``>) = ResultT (map Result.apply f <*> x) : ResultT<'``Monad<'Result<'U,'E>>``>
55-
let inline map (f: 'T->'U) (ResultT m: ResultT<'``Monad<'Result<'T,'E>>``>) = ResultT (map (Result.map f) m) : ResultT<'``Monad<'Result<('T -> 'U),'E>>``>
54+
let inline apply (ResultT f:ResultT<'``Monad<Result<('T -> 'U),'E>>``>) (ResultT x: ResultT<'``Monad<Result<'T,'E>>``>) = ResultT (map Result.apply f <*> x) : ResultT<'``Monad<Result<'U,'E>>``>
55+
let inline map (f: 'T->'U) (ResultT m: ResultT<'``Monad<Result<'T,'E>>``>) = ResultT (map (Result.map f) m) : ResultT<'``Monad<Result<('T -> 'U),'E>>``>
5656
let inline map2 (f: 'T->'U->'V) (ResultT x: ResultT<'``Monad<Result<'T,'E>>``>) (ResultT y: ResultT<'``Monad<Result<'U,'E>>``>) : ResultT<'``Monad<Result<'V,'E>>``> = ResultT (lift2 (Result.map2 f) x y)
5757
let inline map3 (f: 'T->'U->'V->'W) (ResultT x: ResultT<'``Monad<Result<'T,'E>>``>) (ResultT y: ResultT<'``Monad<Result<'U,'E>>``>) (ResultT z: ResultT<'``Monad<Result<'V,'E>>``>) : ResultT<'``Monad<Result<'W,'E>>``> = ResultT (lift3 (Result.map3 f) x y z)
5858

59-
type ResultT<'``monad<'result<'t,'e>>``> with
59+
type ResultT<'``monad<Result<'t,'e>>``> with
6060

61-
static member inline Return (x: 'T) = ResultT (result (Ok x)) : ResultT<'``Monad<'Result<'T,'E>>``>
61+
static member inline Return (x: 'T) = ResultT (result (Ok x)) : ResultT<'``Monad<Result<'T,'E>>``>
6262

6363
[<EditorBrowsable(EditorBrowsableState.Never)>]
64-
static member inline Map (x: ResultT<'``Monad<'Result<'T,'E>>``>, f: 'T->'U) = ResultT.map f x : ResultT<'``Monad<'Result<'U,'E>>``>
64+
static member inline Map (x: ResultT<'``Monad<Result<'T,'E>>``>, f: 'T->'U) = ResultT.map f x : ResultT<'``Monad<Result<'U,'E>>``>
6565

6666
[<EditorBrowsable(EditorBrowsableState.Never)>]
6767
static member inline Lift2 (f: 'T->'U->'V, x: ResultT<'``Monad<Result<'T,'E>``>, y: ResultT<'``Monad<Result<'U,'E>``>) : ResultT<'``Monad<Result<'V,'E>``> = ResultT.map2 f x y
6868

6969
[<EditorBrowsable(EditorBrowsableState.Never)>]
7070
static member inline Lift3 (f: 'T->'U->'V->'W, x: ResultT<'``Monad<Result<'T,'E>``>, y: ResultT<'``Monad<Result<'U,'E>``>, z: ResultT<'``Monad<Result<'V,'E>``>) : ResultT<'``Monad<Result<'W,'E>``> = ResultT.map3 f x y z
7171

72-
static member inline (<*>) (f: ResultT<'``Monad<'Result<('T -> 'U),'E>>``>, x: ResultT<'``Monad<'Result<'T,'E>>``>) = ResultT.apply f x : ResultT<'``Monad<'Result<'U,'E>>``>
73-
static member inline (>>=) (x: ResultT<'``Monad<'Result<'T,'E>>``>, f: 'T->ResultT<'``Monad<'Result<'U,'E>>``>) = ResultT.bind f x
72+
static member inline (<*>) (f: ResultT<'``Monad<Result<('T -> 'U),'E>>``>, x: ResultT<'``Monad<Result<'T,'E>>``>) = ResultT.apply f x : ResultT<'``Monad<Result<'U,'E>>``>
73+
static member inline (>>=) (x: ResultT<'``Monad<Result<'T,'E>>``>, f: 'T->ResultT<'``Monad<Result<'U,'E>>``>) = ResultT.bind f x
7474

75-
static member inline TryWith (source: ResultT<'``Monad<'Result<'T,'E>>``>, f: exn -> ResultT<'``Monad<'Result<'T,'E>>``>) = ResultT (TryWith.Invoke (ResultT.run source) (ResultT.run << f))
76-
static member inline TryFinally (computation: ResultT<'``Monad<'Result<'T,'E>>``>, f) = ResultT (TryFinally.Invoke (ResultT.run computation) f)
77-
static member inline Using (resource, f: _ -> ResultT<'``Monad<'Result<'T,'E>>``>) = ResultT (Using.Invoke resource (ResultT.run << f))
78-
static member inline Delay (body : unit -> ResultT<'``Monad<'Result<'T,'E>>``>) = ResultT (Delay.Invoke (fun _ -> ResultT.run (body ())))
75+
static member inline TryWith (source: ResultT<'``Monad<Result<'T,'E>>``>, f: exn -> ResultT<'``Monad<Result<'T,'E>>``>) = ResultT (TryWith.Invoke (ResultT.run source) (ResultT.run << f))
76+
static member inline TryFinally (computation: ResultT<'``Monad<Result<'T,'E>>``>, f) = ResultT (TryFinally.Invoke (ResultT.run computation) f)
77+
static member inline Using (resource, f: _ -> ResultT<'``Monad<Result<'T,'E>>``>) = ResultT (Using.Invoke resource (ResultT.run << f))
78+
static member inline Delay (body : unit -> ResultT<'``Monad<Result<'T,'E>>``>) = ResultT (Delay.Invoke (fun _ -> ResultT.run (body ())))
7979

8080
[<EditorBrowsable(EditorBrowsableState.Never)>]
8181
static member inline Lift (x: '``Monad<'T>``) : ResultT<'``Monad<Result<'T,'E>>``> = ResultT.lift x
8282

8383
static member inline Throw (x: 'E) = x |> Error |> result |> ResultT : ResultT<'``Monad<Result<'T,'E>>``>
84-
static member inline Catch (ResultT x: ResultT<'``MonadError<'E1,'T>``>, f: 'E1 -> _) = (ResultT (x >>= (fun a -> match a with Error l -> ResultT.run (f l) | Ok r -> result (Ok r)))) : ResultT<'``Monad<Result<'T,'E2>>``>
84+
static member inline Catch (ResultT x: ResultT<'``Monad<Result<'T, 'E1>>``>, f: 'E1 -> _) = (ResultT (x >>= fun a -> match a with Error l -> ResultT.run (f l) | Ok r -> result (Ok (r: 'T)))) : ResultT<'``Monad<Result<'T, 'E2>>``>
8585

8686
static member inline LiftAsync (x: Async<'T>) = ResultT.lift (liftAsync x) : ResultT<'``MonadAsync<'T>``>
8787

88-
static member inline CallCC (f: ('T -> ResultT<'``MonadCont<'R,Result<'U,'E>>``>) -> _) : ResultT<'``MonadCont<'R, Result<'T,'E>>``> = ResultT (callCC <| fun c -> ResultT.run (f (ResultT << c << Ok)))
88+
static member inline CallCC (f: ('T -> ResultT<'``MonadCont<'R,Result<'U,'E>>``>) -> _) : ResultT<'``MonadCont<'R, Result<'T,'E>>``> = ResultT (callCC <| fun c -> ResultT.run (f (ResultT << c << Result<'T, 'E>.Ok)))
8989

9090
static member inline get_Ask () = (ResultT << (map Ok)) ask : ResultT<'``MonadReader<'R,Result<'R,'E>>``>
9191
static member inline Local (ResultT m : ResultT<'``MonadReader<'R2,Result<'R2,'E>>``>, f: 'R1->'R2) = ResultT (local f m)
@@ -98,44 +98,44 @@ type ResultT<'``monad<'result<'t,'e>>``> with
9898

9999
static member inline Pass m = ResultT (ResultT.run m >>= either (map Ok << pass << result) (result << Error)) : ResultT<'``MonadWriter<'Monoid,Result<'T,'E>>``>
100100

101-
static member inline get_Get () = ResultT.lift get : ResultT<'``MonadState<'S,Result<_,'E>>``>
102-
static member inline Put (x: 'S) = x |> put |> ResultT.lift : ResultT<'``MonadState<'S,Result<_,'E>>``>
101+
static member inline get_Get () = ResultT.lift get : ResultT<'``MonadState<'S, Result<_, 'E>>``>
102+
static member inline Put (x: 'S) = x |> put |> ResultT.lift : ResultT<'``MonadState<'S, Result<_, 'E>>``>
103103

104104

105105
[<Struct>]
106-
type ChoiceT<'``monad<'choice<'t,'e>>``> = ChoiceT of '``monad<'choice<'t,'e>>``
106+
type ChoiceT<'``monad<Choice<'t,'e>>``> = ChoiceT of '``monad<Choice<'t,'e>>``
107107

108108

109109
[<RequireQualifiedAccess>]
110110
module ChoiceT =
111-
let run (ChoiceT x) = x : '``Monad<'Choice<'T,'E>>``
111+
let run (ChoiceT x) = x : '``Monad<Choice<'T,'E>>``
112112

113113
/// Embed a Monad<'T> into a ChoiceT<'Monad<Choice<'T,'Error>>>
114114
let inline lift (x: '``Monad<'T>``) : ChoiceT<'``Monad<Choice<'T,'Error>>``> =
115115
if opaqueId false then x |> liftM Choice1Of2 |> ChoiceT
116116
else x |> map Choice1Of2 |> ChoiceT
117117

118-
/// Transform a Choice<'T,'Error> to a ChoiceT<'Monad<Choice<'T,'Error>>>
119-
let inline hoist (x: Choice<'T,'Error>) = ChoiceT (result x) : ChoiceT<'``Monad<Choice<'T,'Error>>``>
118+
/// Transform a Choice<'T,'TError> to a ChoiceT<'Monad<Choice<'T,'TError>>>
119+
let inline hoist (x: Choice<'T,'TError>) = ChoiceT (result x) : ChoiceT<'``Monad<Choice<'T,'TError>>``>
120120

121-
let inline bind (f: 'T->ChoiceT<'``Monad<'ChoiceT<'U,'E>>``>) (ChoiceT m: ChoiceT<'``Monad<'Choice<'T,'E>>``>) = (ChoiceT (m >>= (fun a -> match a with Choice2Of2 l -> result (Choice2Of2 l) | Choice1Of2 r -> run (f r))))
121+
let inline bind (f: 'T->ChoiceT<'``Monad<ChoiceT<'U,'E>>``>) (ChoiceT m: ChoiceT<'``Monad<Choice<'T,'E>>``>) = (ChoiceT (m >>= (fun a -> match a with Choice2Of2 l -> result (Choice2Of2 l) | Choice1Of2 r -> run (f r))))
122122

123-
let inline apply (ChoiceT f: ChoiceT<'``Monad<'Choice<('T -> 'U),'E>>``>) (ChoiceT x: ChoiceT<'``Monad<'Choice<'T,'E>>``>) = ChoiceT (map Choice.apply f <*> x) : ChoiceT<'``Monad<'Choice<'U,'E>>``>
124-
let inline map (f: 'T->'U) (ChoiceT m: ChoiceT<'``Monad<'Choice<'T,'E>>``>) = ChoiceT (map (Choice.map f) m) : ChoiceT<'``Monad<'Choice<('T -> 'U),'E>>``>
123+
let inline apply (ChoiceT f: ChoiceT<'``Monad<Choice<('T -> 'U),'E>>``>) (ChoiceT x: ChoiceT<'``Monad<Choice<'T,'E>>``>) = ChoiceT (map Choice.apply f <*> x) : ChoiceT<'``Monad<Choice<'U,'E>>``>
124+
let inline map (f: 'T->'U) (ChoiceT m: ChoiceT<'``Monad<Choice<'T,'E>>``>) = ChoiceT (map (Choice.map f) m) : ChoiceT<'``Monad<Choice<('T -> 'U),'E>>``>
125125
let inline map2 (f: 'T->'U->'V) (ChoiceT x: ChoiceT<'``Monad<Choice<'T,'E>>``>) (ChoiceT y: ChoiceT<'``Monad<Choice<'U,'E>>``>) : ChoiceT<'``Monad<Choice<'V,'E>>``> = ChoiceT (lift2 (Choice.map2 f) x y)
126126

127-
type ChoiceT<'``monad<'choice<'t,'e>>``> with
127+
type ChoiceT<'``monad<Choice<'t,'e>>``> with
128128

129-
static member inline Return (x: 'T) = ChoiceT (result (Choice1Of2 x)) : ChoiceT<'``Monad<'Choice<'T,'E>>``>
129+
static member inline Return (x: 'T) = ChoiceT (result (Choice1Of2 x)) : ChoiceT<'``Monad<Choice<'T,'E>>``>
130130

131131
[<EditorBrowsable(EditorBrowsableState.Never)>]
132-
static member inline Map (x: ChoiceT<'``Monad<'Choice<'T,'E>>``>, f: 'T->'U) = ChoiceT.map f x : ChoiceT<'``Monad<'Choice<'U,'E>>``>
132+
static member inline Map (x: ChoiceT<'``Monad<Choice<'T,'E>>``>, f: 'T->'U) = ChoiceT.map f x : ChoiceT<'``Monad<Choice<'U,'E>>``>
133133

134134
[<EditorBrowsable(EditorBrowsableState.Never)>]
135135
static member inline Lift2 (f: 'T->'U->'V, x: ChoiceT<'``Monad<Choice<'T,'E>``>, y: ChoiceT<'``Monad<Choice<'U,'E>``>) : ChoiceT<'``Monad<Choice<'V,'E>``> = ChoiceT.map2 f x y
136136

137-
static member inline (<*>) (f: ChoiceT<'``Monad<'Choice<('T -> 'U),'E>>``>, x: ChoiceT<'``Monad<'Choice<'T,'E>>``>) = ChoiceT.apply f x : ChoiceT<'``Monad<'Choice<'U,'E>>``>
138-
static member inline (>>=) (x: ChoiceT<'``Monad<'Choice<'T,'E>>``>, f: 'T->ChoiceT<'``Monad<'Choice<'U,'E>>``>) = ChoiceT.bind f x
137+
static member inline (<*>) (f: ChoiceT<'``Monad<Choice<('T -> 'U),'E>>``>, x: ChoiceT<'``Monad<Choice<'T,'E>>``>) = ChoiceT.apply f x : ChoiceT<'``Monad<Choice<'U,'E>>``>
138+
static member inline (>>=) (x: ChoiceT<'``Monad<Choice<'T,'E>>``>, f: 'T->ChoiceT<'``Monad<Choice<'U,'E>>``>) = ChoiceT.bind f x
139139

140140
[<EditorBrowsable(EditorBrowsableState.Never)>]
141141
static member inline Lift (x: '``Monad<'T>``) : ChoiceT<'``Monad<Choice<'T,'E>>``> = ChoiceT.lift x
@@ -158,7 +158,7 @@ type ChoiceT<'``monad<'choice<'t,'e>>``> with
158158

159159
static member inline Pass m = ChoiceT (ChoiceT.run m >>= either (map Choice1Of2 << pass << result) (result << Error)) : ChoiceT<'``MonadWriter<'Monoid,Choice<'T,'E>>``>
160160

161-
static member inline get_Get () = ChoiceT.lift get : ChoiceT<'``MonadState<'S,Choice<_,'E>>``>
162-
static member inline Put (x: 'S) = x |> put |> ChoiceT.lift : ChoiceT<'``MonadState<'S,Choice<_,'E>>``>
161+
static member inline get_Get () = ChoiceT.lift get : ChoiceT<'``MonadState<'S, Choice<_, 'E>>``>
162+
static member inline Put (x: 'S) = x |> put |> ChoiceT.lift : ChoiceT<'``MonadState<'S, Choice<_, 'E>>``>
163163

164164
#endif

src/FSharpPlus/Data/Reader.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ type ReaderT<'r,'``monad<'t>``> with
173173

174174
static member inline LiftAsync (x: Async<'T>) = (ReaderT.lift (liftAsync x) : ReaderT<'R,'``MonadAsync<'T>``>)
175175

176-
static member inline CallCC (f: ('T -> ReaderT<'R, Cont<_,'U>>) -> _) : ReaderT<'R,'``MonadCont<'C,'T>``> =
176+
static member inline CallCC (f: ('T -> ReaderT<'R, '``MonadCont<'C,'U>``>) -> _) : ReaderT<'R,'``MonadCont<'C,'T>``> =
177177
ReaderT (fun r -> callCC <| fun c -> ReaderT.run (f (fun a -> ReaderT <| fun _ -> c a)) r)
178178

179179
static member inline get_Ask () = ReaderT result : ReaderT<'R,'``Monad<'T>``>
@@ -183,11 +183,11 @@ type ReaderT<'r,'``monad<'t>``> with
183183
static member inline Catch (m: ReaderT<'R,'``MonadError<'E1,'T>``>, h: 'E1 -> _) =
184184
ReaderT (fun s -> catch (ReaderT.run m s) (fun e -> ReaderT.run (h e) s)) : ReaderT<'R,'``MonadError<'E2,'T>``>
185185

186-
static member inline Tell w = w |> tell |> ReaderT.lift : ReaderT<'R, '``MonadWriter<'Monoid,unit>``>
186+
static member inline Tell (w: 'Monoid) = w |> tell |> ReaderT.lift : ReaderT<'R, '``MonadWriter<'Monoid,unit>``>
187187
static member inline Listen (ReaderT m) = ReaderT (fun w -> listen (m w)) : ReaderT<'R, '``MonadWriter<'Monoid,'T*'Monoid>``>
188188
static member inline Pass (ReaderT m) = ReaderT (fun w -> pass (m w)) : ReaderT<'R, '``MonadWriter<'Monoid,'T>``>
189189

190-
static member inline get_Get () = ReaderT.lift get : ReaderT<'R, '``MonadState<'S, 'S>``>
191-
static member inline Put x = x |> put |> ReaderT.lift : ReaderT<'R, '``MonadState<'S, unit>``>
190+
static member inline get_Get () = ReaderT.lift get : ReaderT<'R, '``MonadState<'S, 'S>``>
191+
static member inline Put (x: 'S) = x |> put |> ReaderT.lift : ReaderT<'R, '``MonadState<'S, unit>``>
192192

193193
#endif

src/FSharpPlus/Data/State.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ module StateT =
124124
let inline map (f: 'T->'U) (StateT (m :_->'``Monad<'T * 'S>``)) = StateT (m >> Map.Invoke (fun (a, s') -> (f a, s'))) : StateT<'S,'``Monad<'U * 'S>``>
125125

126126
/// Combines two StateTs into one by applying a mapping function.
127-
let inline map2 (f: 'T->'U->'V) (StateT x: StateT<'S,'``Monad<'T * 'S>``>) (StateT y: StateT<'S,'``Monad<'U * 'S>``>) : StateT<'S,'``Monad<'V * 'S>``> = StateT (fun s -> x s >>= fun (g, s1) -> y s1 >>= fun (h, s2) -> result (f g h, s2)) : StateT<'S,'``Monad<'V * 'S>``>
127+
let inline map2 (f: 'T->'U->'V) (StateT x: StateT<'S,'``Monad<'T * 'S>``>) (StateT y: StateT<'S,'``Monad<'U * 'S>``>) : StateT<'S,'``Monad<'V * 'S>``> = StateT (fun s -> x s >>= fun (g, s1) -> y s1 >>= fun (h, s2: 'S) -> result (f g h, s2)) : StateT<'S,'``Monad<'V * 'S>``>
128128

129129
/// Combines three StateTs into one by applying a mapping function.
130130
let inline map3 (f: 'T->'U->'V->'W) (StateT x: StateT<'S,'``Monad<'T * 'S>``>) (StateT y: StateT<'S,'``Monad<'U * 'S>``>) (StateT z: StateT<'S,'``Monad<'V * 'S>``>) : StateT<'S,'``Monad<'W * 'S>``> =

0 commit comments

Comments
 (0)