package preface
Source file indexed_monad_plus.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154module Core_via_bind (Req : Preface_specs.Indexed_monad_plus.WITH_BIND) = struct include Indexed_monad.Core_via_return_and_bind (Req) let combine = Req.combine let neutral = Req.neutral end module Core_via_map_and_join (Req : Preface_specs.Indexed_monad_plus.WITH_MAP_AND_JOIN) = struct include Indexed_monad.Core_via_return_map_and_join (Req) let combine = Req.combine let neutral = Req.neutral end module Core_via_kleisli_composition (Req : Preface_specs.Indexed_monad_plus.WITH_KLEISLI_COMPOSITION) = struct include Indexed_monad.Core_via_return_and_kleisli_composition (Req) let combine = Req.combine let neutral = Req.neutral end let filter' bind return neutral predicate m = bind (fun x -> if predicate x then return x else neutral) m ;; module Operation (Core : Preface_specs.Indexed_monad_plus.CORE) = struct include Indexed_monad.Operation (Core) include Indexed_alt.Operation (Core) let times n x = Preface_core.Monoid.times Core.combine Core.neutral n x let reduce list = Preface_core.Monoid.reduce Core.combine Core.neutral list let filter predicate m = filter' Core.bind Core.return Core.neutral predicate m ;; end module Operation_over_monad (Monad : Preface_specs.INDEXED_MONAD) (Req : Preface_specs.Indexed_monad_plus.WITH_NEUTRAL_AND_COMBINE with type ('a, 'index) t = ('a, 'index) Monad.t) = struct include Monad include Indexed_alt.Operation (struct include Monad include Req end) let times n x = Preface_core.Monoid.times Req.combine Req.neutral n x let reduce list = Preface_core.Monoid.reduce Req.combine Req.neutral list let filter predicate m = filter' Monad.bind Monad.return Req.neutral predicate m ;; end module Syntax = Indexed_monad.Syntax module Infix (Core : Preface_specs.Indexed_monad_plus.CORE) (Operation : Preface_specs.Indexed_monad_plus.OPERATION with type ('a, 'index) t = ('a, 'index) Core.t) = struct include Indexed_monad.Infix (Core) (Operation) let ( <|> ) = Core.combine end module Via (Core : Preface_specs.Indexed_monad_plus.CORE) (Operation : Preface_specs.Indexed_monad_plus.OPERATION) (Infix : Preface_specs.Indexed_monad_plus.INFIX) (Syntax : Preface_specs.Indexed_monad_plus.SYNTAX) = struct include Core include Operation include Syntax include Infix module Syntax = Syntax module Infix = Infix end module Via_bind (Req : Preface_specs.Indexed_monad_plus.WITH_BIND) = struct module Core = Core_via_bind (Req) module Operation = Operation (Core) module Syntax = Syntax (Core) module Infix = Infix (Core) (Operation) include Core include Operation include Syntax include Infix end module Via_map_and_join (Req : Preface_specs.Indexed_monad_plus.WITH_MAP_AND_JOIN) = struct module Core = Core_via_map_and_join (Req) module Operation = Operation (Core) module Syntax = Syntax (Core) module Infix = Infix (Core) (Operation) include Core include Operation include Syntax include Infix end module Via_kleisli_composition (Req : Preface_specs.Indexed_monad_plus.WITH_KLEISLI_COMPOSITION) = struct module Core = Core_via_kleisli_composition (Req) module Operation = Operation (Core) module Syntax = Syntax (Core) module Infix = Infix (Core) (Operation) include Core include Operation include Syntax include Infix end module Over_monad (Monad : Preface_specs.INDEXED_MONAD) (Req : Preface_specs.Indexed_monad_plus.WITH_NEUTRAL_AND_COMBINE with type ('a, 'index) t = ('a, 'index) Monad.t) = Via (struct include Monad let combine = Req.combine let neutral = Req.neutral end) (Operation_over_monad (Monad) (Req)) (struct type ('a, 'index) t = ('a, 'index) Monad.t include Monad.Infix let ( <|> ) = Req.combine end) (struct type ('a, 'index) t = ('a, 'index) Monad.t include Monad.Syntax end) module Over_monad_and_alternative (Monad : Preface_specs.INDEXED_MONAD) (Alternative : Preface_specs.INDEXED_ALTERNATIVE with type ('a, 'index) t = ('a, 'index) Monad.t) = Over_monad (Monad) (Alternative)