11package option
22
3+ import (
4+ "github.com/initdc/types"
5+ )
6+
37type Option [T any ] struct {
4- value T `json:"value"`
5- some bool `json:"some"`
6- assigned bool `json:"assigned"`
8+ value T
9+ some bool
10+ assigned bool
711}
812
913func Some [T any ](v T ) Option [T ] {
@@ -21,6 +25,7 @@ func None[T any]() Option[T] {
2125 }
2226}
2327
28+
2429func (o * Option [T ]) Some (v T ) {
2530 if o .assigned {
2631 panic ("Option already assigned" )
@@ -38,60 +43,210 @@ func (o *Option[T]) None() {
3843 o .assigned = true
3944}
4045
41- func (o * Option [T ]) IsSome () bool {
46+ func (o Option [T ]) Valid () bool {
4247 return o .some
4348}
4449
45- func (o * Option [T ]) IsSomeAnd (f func (T ) bool ) bool {
50+ func (o Option [T ]) Assigned () bool {
51+ return o .assigned
52+ }
53+
54+ func (o Option [T ]) IsSome () bool {
55+ return o .some
56+ }
57+
58+ func (o Option [T ]) IsSomeAnd (f func (T ) bool ) bool {
4659 if ! o .some {
4760 return false
4861 }
4962 return f (o .value )
5063}
5164
52- func (o * Option [T ]) IsNone () bool {
65+ func (o Option [T ]) IsNone () bool {
5366 return ! o .some
5467}
5568
56- func (o * Option [T ]) IsNoneOr (f func (T ) bool ) bool {
69+ func (o Option [T ]) IsNoneOr (f func (T ) bool ) bool {
5770 if ! o .some {
5871 return true
5972 }
6073 return f (o .value )
6174}
6275
63- func (o * Option [T ]) Expect (msg string ) T {
76+ func (o Option [T ]) Expect (msg string ) T {
6477 if o .some {
6578 return o .value
6679 }
6780 panic (msg )
6881}
6982
70- func (o * Option [T ]) Unwrap () T {
83+ func (o Option [T ]) Unwrap () T {
7184 if o .some {
7285 return o .value
7386 }
7487 panic ("called Option.Unwrap() on a None value" )
7588}
7689
77- func (o * Option [T ]) UnwrapOr (def T ) T {
90+ func (o Option [T ]) UnwrapOr (def T ) T {
7891 if o .some {
7992 return o .value
8093 }
8194 return def
8295}
8396
84- func (o * Option [T ]) UnwrapOrElse (f func () T ) T {
97+ func (o Option [T ]) UnwrapOrElse (f func () T ) T {
8598 if o .some {
8699 return o .value
87100 }
88101 return f ()
89102}
90103
91- func (o * Option [T ]) UnwrapOrDefault () T {
104+ func (o Option [T ]) UnwrapOrDefault () T {
92105 if o .some {
93106 return o .value
94107 }
95108 var zero T
96109 return zero
97110}
111+
112+ func Map [T , U any ](o Option [T ], f func (T ) U ) Option [U ] {
113+ if o .some {
114+ return Some [U ](f (o .value ))
115+ }
116+ return None [U ]()
117+ }
118+
119+ func (o Option [T ]) Inspect (f func (T )) Option [T ] {
120+ if o .some {
121+ f (o .value )
122+ }
123+ return o
124+ }
125+
126+ func MapOr [T , U any ](o Option [T ], def U , f func (T ) U ) U {
127+ if o .some {
128+ return f (o .value )
129+ }
130+ return def
131+ }
132+
133+ func MapOrElse [T , U any ](o Option [T ], def func () U , f func (T ) U ) U {
134+ if o .some {
135+ return f (o .value )
136+ }
137+ return def ()
138+ }
139+
140+ func MapOrDefault [T , U any ](o Option [T ], f func (T ) U ) U {
141+ if o .some {
142+ return f (o .value )
143+ }
144+ var zero U
145+ return zero
146+ }
147+
148+ func OkOr [T , E any ](o Option [T ], err E ) result.Result [T , E ] {
149+ if o .some {
150+ return result.Ok [T , E ](o .value )
151+ }
152+ return result.Err [T , E ](err )
153+ }
154+
155+ func OkOrElse [T , E any ](o Option [T ], err func () E ) result.Result [T , E ] {
156+ if o .some {
157+ return result.Ok [T , E ](o .value )
158+ }
159+ return result.Err [T , E ](err ())
160+ }
161+
162+ func And [T , U any ](o Option [T ], optb Option [U ]) Option [U ] {
163+ if o .some {
164+ return optb
165+ }
166+ return None [U ]()
167+ }
168+
169+ func AndThen [T , U any ](o Option [T ], f func (T ) Option [U ]) Option [U ] {
170+ if o .some {
171+ return f (o .value )
172+ }
173+ return None [U ]()
174+ }
175+
176+ func (o Option [T ]) Filter (predicate func (T ) bool ) Option [T ] {
177+ if o .some && predicate (o .value ) {
178+ return Some [T ](o .value )
179+ }
180+ return None [T ]()
181+ }
182+
183+ func (o Option [T ]) Or (optb Option [T ]) Option [T ] {
184+ if o .some {
185+ return o
186+ }
187+ return optb
188+ }
189+
190+ func (o Option [T ]) OrElse (f func () Option [T ]) Option [T ] {
191+ if o .some {
192+ return o
193+ }
194+ return f ()
195+ }
196+
197+ func (o Option [T ]) Xor (optb Option [T ]) Option [T ] {
198+ if o .some && ! optb .some {
199+ return o
200+ }
201+ if ! o .some && optb .some {
202+ return optb
203+ }
204+ return None [T ]()
205+ }
206+
207+ func (o * Option [T ]) Insert (value T ) * T {
208+ o .value = value
209+ o .some = true
210+ o .assigned = true
211+ return & o .value
212+ }
213+
214+ func (o * Option [T ]) GetOrInsert (value T ) * T {
215+ if ! o .some {
216+ o .value = value
217+ o .some = true
218+ o .assigned = true
219+ }
220+ return & o .value
221+ }
222+
223+ func (o * Option [T ]) GetOrInsertDefault () * T {
224+ if ! o .some {
225+ var zero T
226+ o .value = zero
227+ o .some = true
228+ o .assigned = true
229+ }
230+ return & o .value
231+ }
232+
233+ func (o * Option [T ]) GetOrInsertWith (f func () T ) * T {
234+ if ! o .some {
235+ o .value = f ()
236+ o .some = true
237+ o .assigned = true
238+ }
239+ return & o .value
240+ }
241+
242+ func (o * Option [T ]) Take () Option [T ] {
243+ var cp = * o
244+ * o = None [T ]()
245+ return cp
246+ }
247+
248+ func (o * Option [T ]) Replace (value T ) Option [T ] {
249+ var cp = * o
250+ * o = Some [T ](value )
251+ return cp
252+ }
0 commit comments