package preface
Source file nonempty_list.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 119type 'a t = 'a Preface_core.Nonempty_list.t = | Last of 'a | ( :: ) of ('a * 'a t) include ( Preface_core.Nonempty_list : module type of Preface_core.Nonempty_list with type 'a t := 'a t ) let pure x = create x module Foldable = Preface_make.Foldable.Via_fold_right (struct type nonrec 'a t = 'a t let fold_right f x acc = fold_right f x acc end) module Functor = Preface_make.Functor.Via_map (struct type nonrec 'a t = 'a t let map = map end) module Alt = Preface_make.Alt.Over_functor (Functor) (struct type nonrec 'a t = 'a t let combine = append end) module Applicative_internal = Preface_make.Applicative.Via_apply (struct type nonrec 'a t = 'a t let pure = pure let apply fs xs = flatten @@ map (fun f -> map (fun x -> f x) xs) fs end) module Applicative_traversable (A : Preface_specs.APPLICATIVE) = Preface_make.Traversable.Over_applicative (A) (struct type 'a t = 'a A.t type 'a iter = 'a Preface_core.Nonempty_list.t let traverse = let open A.Infix in let rec traverse_aux f = function | Last x -> (fun x -> Last x) <$> f x | x :: xs -> A.lift2 cons (f x) (traverse_aux f xs) in traverse_aux ;; end) module Applicative = Preface_make.Traversable.Join_with_applicative (Applicative_internal) (Applicative_traversable) module Monad_internal = Preface_make.Monad.Via_map_and_join (struct type nonrec 'a t = 'a t let return = pure let map = map let join = flatten end) module Monad_traversable (M : Preface_specs.MONAD) = Preface_make.Traversable.Over_monad (M) (struct type 'a t = 'a M.t type 'a iter = 'a Preface_core.Nonempty_list.t let traverse = let open M.Syntax in let rec traverse_aux f = function | Last x -> let+ elt = f x in Last elt | x :: xs -> let* h = f x in let* t = traverse_aux f xs in M.return (cons h t) in traverse_aux ;; end) module Monad = Preface_make.Traversable.Join_with_monad (Monad_internal) (Monad_traversable) module Selective = Preface_make.Selective.Over_applicative_via_select (Applicative) (Preface_make.Selective.Select_from_monad (Monad)) module Comonad = Preface_make.Comonad.Via_extend (struct type nonrec 'a t = 'a t let extract = function Last x | x :: _ -> x let rec extend f nel = (match nel with Last _ -> Last (f nel) | _ :: xs -> f nel :: extend f xs) ;; end) module Semigroup (T : Preface_specs.Types.T0) : Preface_specs.SEMIGROUP with type t = T.t t = Preface_make.Semigroup.Via_combine (struct type nonrec t = T.t t let combine = append end)