{"id":"db4bedfe-ed7d-45e4-aa77-aa4048fe895f","shortId":"z6E62M","kind":"skill","title":"golang-samber-mo","tagline":"Monadic types for Golang using samber/mo — Option, Result, Either, Future, IO, Task, and State types for type-safe nullable values, error handling, and functional composition with pipeline sub-packages. Apply when using or adopting samber/mo, when the codebase imports `github.com","description":"**Persona:** You are a Go engineer bringing functional programming safety to Go. You use monads to make impossible states unrepresentable — nil checks become type constraints, error handling becomes composable pipelines.\n\n**Thinking mode:** Use `ultrathink` when designing multi-step Option/Result/Either pipelines. Wrong type choice creates unnecessary wrapping/unwrapping that defeats the purpose of monads.\n\n# samber/mo — Monads and Functional Abstractions for Go\n\nGo 1.18+ library providing type-safe monadic types with zero dependencies. Inspired by Scala, Rust, and fp-ts.\n\n**Official Resources:**\n\n- [pkg.go.dev/github.com/samber/mo](https://pkg.go.dev/github.com/samber/mo)\n- [github.com/samber/mo](https://github.com/samber/mo)\n\nThis skill is not exhaustive. Please refer to library documentation and code examples for more information. Context7 can help as a discoverability platform.\n\n```bash\ngo get github.com/samber/mo\n```\n\nFor an introduction to functional programming concepts and why monads are valuable in Go, see [Monads Guide](./references/monads-guide.md).\n\n## Core Types at a Glance\n\n| Type | Purpose | Think of it as... |\n| --- | --- | --- |\n| `Option[T]` | Value that may be absent | Rust's `Option`, Java's `Optional` |\n| `Result[T]` | Operation that may fail | Rust's `Result<T, E>`, replaces `(T, error)` |\n| `Either[L, R]` | Value of one of two types | Scala's `Either`, TypeScript discriminated union |\n| `EitherX[L, R]` | Value of one of X types | Scala's `Either`, TypeScript discriminated union |\n| `Future[T]` | Async value not yet available | JavaScript `Promise` |\n| `IO[T]` | Lazy synchronous side effect | Haskell's `IO` |\n| `Task[T]` | Lazy async computation | fp-ts `Task` |\n| `State[S, A]` | Stateful computation | Haskell's `State` monad |\n\n## Option[T] — Nullable Values Without nil\n\nRepresents a value that is either present (`Some`) or absent (`None`). Eliminates nil pointer risks at the type level.\n\n```go\nimport \"github.com/samber/mo\"\n\nname := mo.Some(\"Alice\")          // Option[string] with value\nempty := mo.None[string]()        // Option[string] without value\nfromPtr := mo.PointerToOption(ptr) // nil pointer -> None\n\n// Safe extraction\nname.OrElse(\"Anonymous\")  // \"Alice\"\nempty.OrElse(\"Anonymous\")  // \"Anonymous\"\n\n// Transform if present, skip if absent\nupper := name.Map(func(s string) (string, bool) {\n    return strings.ToUpper(s), true\n})\n```\n\n**Key methods:** `Some`, `None`, `Get`, `MustGet`, `OrElse`, `OrEmpty`, `Map`, `FlatMap`, `Match`, `ForEach`, `ToPointer`, `IsPresent`, `IsAbsent`.\n\nOption implements `json.Marshaler/Unmarshaler`, `sql.Scanner`, `driver.Valuer` — use it directly in JSON structs and database models.\n\nFor full API reference, see [Option Reference](./references/option.md).\n\n## Result[T] — Error Handling as Values\n\nRepresents success (`Ok`) or failure (`Err`). Equivalent to `Either[error, T]` but specialized for Go's error pattern.\n\n```go\n// Wrap Go's (value, error) pattern\nresult := mo.TupleToResult(os.ReadFile(\"config.yaml\"))\n\n// Same-type transform — errors short-circuit automatically\nupper := mo.Ok(\"hello\").Map(func(s string) (string, error) {\n    return strings.ToUpper(s), nil\n})\n// Ok(\"HELLO\")\n\n// Extract with fallback\nval := upper.OrElse(\"default\")\n```\n\n**Go limitation:** Direct methods (`.Map`, `.FlatMap`) cannot change the type parameter — `Result[T].Map` returns `Result[T]`, not `Result[U]`. Go methods cannot introduce new type parameters. For type-changing transforms (e.g. `Result[[]byte]` to `Result[Config]`), use sub-package functions or `mo.Do`:\n\n```go\nimport \"github.com/samber/mo/result\"\n\n// Type-changing pipeline: []byte -> Config -> ValidConfig\nparsed := result.Pipe2(\n    mo.TupleToResult(os.ReadFile(\"config.yaml\")),\n    result.Map(func(data []byte) Config { return parseConfig(data) }),\n    result.FlatMap(func(cfg Config) mo.Result[ValidConfig] { return validate(cfg) }),\n)\n```\n\n**Key methods:** `Ok`, `Err`, `Errf`, `TupleToResult`, `Try`, `Get`, `MustGet`, `OrElse`, `Map`, `FlatMap`, `MapErr`, `Match`, `ForEach`, `ToEither`, `IsOk`, `IsError`.\n\nFor full API reference, see [Result Reference](./references/result.md).\n\n## Either[L, R] — Discriminated Union of Two Types\n\nRepresents a value that is one of two possible types. Unlike Result, neither side implies success or failure — both are valid alternatives.\n\n```go\n// API that returns either cached data or fresh data\nfunc fetchUser(id string) mo.Either[CachedUser, FreshUser] {\n    if cached, ok := cache.Get(id); ok {\n        return mo.Left[CachedUser, FreshUser](cached)\n    }\n    return mo.Right[CachedUser, FreshUser](db.Fetch(id))\n}\n\n// Pattern match\nresult.Match(\n    func(cached CachedUser) mo.Either[CachedUser, FreshUser] { /* use cached */ },\n    func(fresh FreshUser) mo.Either[CachedUser, FreshUser] { /* use fresh */ },\n)\n```\n\n**When to use Either vs Result:** Use `Result[T]` when one path is an error. Use `Either[L, R]` when both paths are valid alternatives (cached vs fresh, left vs right, strategy A vs B).\n\n`Either3[T1, T2, T3]`, `Either4`, and `Either5` extend this to 3-5 type variants.\n\nFor full API reference, see [Either Reference](./references/either.md).\n\n## Do Notation — Imperative Style with Monadic Safety\n\n`mo.Do` wraps imperative code in a `Result`, catching panics from `MustGet()` calls:\n\n```go\nresult := mo.Do(func() int {\n    // MustGet panics on None/Err — Do catches it as Result error\n    a := mo.Some(21).MustGet()\n    b := mo.Ok(2).MustGet()\n    return a * b  // 42\n})\n// result is Ok(42)\n\nresult := mo.Do(func() int {\n    val := mo.None[int]().MustGet()  // panics\n    return val\n})\n// result is Err(\"no such element\")\n```\n\nDo notation bridges imperative Go style with monadic safety — write straight-line code, get automatic error propagation.\n\n## Pipeline Sub-Packages vs Direct Chaining\n\nsamber/mo provides two ways to compose operations:\n\n**Direct methods** (`.Map`, `.FlatMap`) — work when the output type equals the input type:\n\n```go\nopt := mo.Some(42)\ndoubled := opt.Map(func(v int) (int, bool) {\n    return v * 2, true\n})  // Option[int]\n```\n\n**Sub-package functions** (`option.Map`, `result.Map`) — required when the output type differs from input:\n\n```go\nimport \"github.com/samber/mo/option\"\n\n// int -> string type change: use sub-package Map\nstrOpt := option.Map(func(v int) string {\n    return fmt.Sprintf(\"value: %d\", v)\n})(mo.Some(42))  // Option[string]\n```\n\n**Pipe functions** (`option.Pipe3`, `result.Pipe3`) — chain multiple type-changing transformations readably:\n\n```go\nimport \"github.com/samber/mo/option\"\n\nresult := option.Pipe3(\n    mo.Some(42),\n    option.Map(func(v int) string { return strconv.Itoa(v) }),\n    option.Map(func(s string) []byte { return []byte(s) }),\n    option.FlatMap(func(b []byte) mo.Option[string] {\n        if len(b) > 0 { return mo.Some(string(b)) }\n        return mo.None[string]()\n    }),\n)\n```\n\n**Rule of thumb:** Use direct methods for same-type transforms. Use sub-package functions + pipes when types change across steps.\n\nFor detailed pipeline API reference, see [Pipelines Reference](./references/pipelines.md).\n\n## Common Patterns\n\n### JSON API responses with Option\n\n```go\ntype UserResponse struct {\n    Name     string            `json:\"name\"`\n    Nickname mo.Option[string] `json:\"nickname\"`  // omits null gracefully\n    Bio      mo.Option[string] `json:\"bio\"`\n}\n```\n\n### Database nullable columns\n\n```go\ntype User struct {\n    ID       int\n    Email    string\n    Phone    mo.Option[string]  // implements sql.Scanner + driver.Valuer\n}\n\nerr := row.Scan(&u.ID, &u.Email, &u.Phone)\n```\n\n### Wrapping existing Go APIs\n\n```go\n// Convert map lookup to Option\nfunc MapGet[K comparable, V any](m map[K]V, key K) mo.Option[V] {\n    return mo.TupleToOption(m[key])  // m[key] returns (V, bool)\n}\n```\n\n### Uniform extraction with Fold\n\n`mo.Fold` works uniformly across Option, Result, and Either via the `Foldable` interface:\n\n```go\nstr := mo.Fold[error, int, string](\n    mo.Ok(42),  // works with Option, Result, or Either\n    func(v int) string { return fmt.Sprintf(\"got %d\", v) },\n    func(err error) string { return \"failed\" },\n)\n// \"got 42\"\n```\n\n## Best Practices\n\n1. **Prefer `OrElse` over `MustGet`** — `MustGet` panics on absent/error values; use it only inside `mo.Do` blocks where panics are caught, or when you are certain the value exists\n2. **Use `TupleToResult` at API boundaries** — convert Go's `(T, error)` to `Result[T]` at the boundary, then chain with `Map`/`FlatMap` inside your domain logic\n3. **Use `Result[T]` for errors, `Either[L, R]` for alternatives** — Result is specialized for success/failure; Either is for two valid types\n4. **Option for nullable fields, not zero values** — `Option[string]` distinguishes \"absent\" from \"empty string\"; use plain `string` when empty string is a valid value\n5. **Chain, don't nest** — `result.Map(...).FlatMap(...).OrElse(default)` reads left-to-right; avoid nested if/else patterns when monadic chaining is cleaner\n6. **Use sub-package pipes for multi-step type transformations** — when 3+ steps each change the type, `option.Pipe3(...)` is more readable than nested function calls\n\nFor advanced types (Future, IO, Task, State), see [Advanced Types Reference](./references/advanced-types.md).\n\nIf you encounter a bug or unexpected behavior in samber/mo, open an issue at <https://github.com/samber/mo/issues>.\n\n## Cross-References\n\n- -> See `samber/cc-skills-golang@golang-samber-lo` skill for functional collection transforms (Map, Filter, Reduce on slices) that compose with mo types\n- -> See `samber/cc-skills-golang@golang-error-handling` skill for idiomatic Go error handling patterns\n- -> See `samber/cc-skills-golang@golang-safety` skill for nil-safety and defensive Go coding\n- -> See `samber/cc-skills-golang@golang-database` skill for database access patterns\n- -> See `samber/cc-skills-golang@golang-design-patterns` skill for functional options and other Go patterns","tags":["golang","samber","skills","agent","agent-skills","antigravity","claude","claude-code","code","codex","coding","copilot"],"capabilities":["skill","source-samber","skill-golang-samber-mo","topic-agent","topic-agent-skills","topic-antigravity","topic-claude","topic-claude-code","topic-code","topic-codex","topic-coding","topic-copilot","topic-cursor","topic-gemini","topic-gemini-cli-extension"],"categories":["cc-skills-golang"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/samber/cc-skills-golang/golang-samber-mo","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add samber/cc-skills-golang","source_repo":"https://github.com/samber/cc-skills-golang","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 1725 github stars · SKILL.md body (9,921 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:02.397Z","embedding":null,"createdAt":"2026-04-18T20:32:59.036Z","updatedAt":"2026-05-18T18:53:02.397Z","lastSeenAt":"2026-05-18T18:53:02.397Z","tsv":"'-5':699 '/github.com/samber/mo](https://pkg.go.dev/github.com/samber/mo)':131 '/references/advanced-types.md':1260 '/references/either.md':709 '/references/monads-guide.md':181 '/references/option.md':399 '/references/pipelines.md':965 '/references/result.md':569 '/samber/mo':163,315 '/samber/mo/issues':1277 '/samber/mo/option':857,897 '/samber/mo/result':514 '/samber/mo](https://github.com/samber/mo)':134 '/unmarshaler':380 '0':927 '1':1098 '1.18':108 '2':750,835,1126 '21':746 '3':698,1152,1235 '4':1174 '42':755,759,825,879,901,1072,1095 '5':1199 '6':1222 'absent':199,301,349,1185 'absent/error':1106 'abstract':104 'access':1337 'across':955,1056 'adopt':40 'advanc':1250,1257 'alic':318,340 'altern':599,677,1162 'anonym':339,342,343 'api':394,564,601,704,960,969,1019,1130 'appli':36 'async':252,271 'automat':443,792 'avail':256 'avoid':1213 'b':687,748,754,920,926,931 'bash':158 'becom':69,74 'behavior':1268 'best':1096 'bio':989,993 'block':1113 'bool':356,832,1048 'boundari':1131,1142 'bridg':779 'bring':53 'bug':1265 'byte':499,519,530,914,916,921 'cach':605,618,627,638,644,678 'cache.get':620 'cachedus':615,625,630,639,641,649 'call':728,1248 'cannot':471,487 'catch':724,739 'caught':1117 'certain':1122 'cfg':537,543 'chain':801,886,1144,1200,1219 'chang':472,495,517,861,890,954,1238 'check':68 'choic':90 'circuit':442 'cleaner':1221 'code':146,720,790,1328 'codebas':44 'collect':1290 'column':996 'common':966 'compar':1029 'compos':75,807,1298 'composit':30 'comput':272,281 'concept':170 'config':502,520,531,538 'config.yaml':434,526 'constraint':71 'context7':151 'convert':1021,1132 'core':182 'creat':91 'cross':1279 'cross-refer':1278 'd':876,1086 'data':529,534,606,609 'databas':390,994,1333,1336 'db.fetch':632 'default':464,1207 'defeat':95 'defens':1326 'depend':118 'design':82,1343 'detail':958 'differ':850 'direct':385,467,800,809,939 'discover':156 'discrimin':233,248,573 'distinguish':1184 'document':144 'domain':1150 'doubl':826 'driver.valuer':382,1010 'e':216 'e.g':497 'effect':264 'either':13,220,231,246,297,414,570,604,656,669,707,1060,1078,1158,1168 'either3':688 'either4':692 'either5':694 'eitherx':235 'element':776 'elimin':303 'email':1003 'empti':323,1187,1193 'empty.orelse':341 'encount':1263 'engin':52 'equal':818 'equival':412 'err':411,547,773,1011,1089 'errf':548 'error':26,72,219,402,415,422,429,439,452,667,743,793,1068,1090,1136,1157,1306,1312 'exampl':147 'exhaust':139 'exist':1017,1125 'extend':695 'extract':337,459,1050 'fail':211,1093 'failur':410,595 'fallback':461 'fetchus':611 'field':1178 'filter':1293 'flatmap':370,470,555,812,1147,1205 'fmt.sprintf':874,1084 'fold':1052 'foldabl':1063 'foreach':372,558 'fp':125,274 'fp-ts':124,273 'fresh':608,646,652,680 'freshus':616,626,631,642,647,650 'fromptr':330 'full':393,563,703 'func':352,448,528,536,610,637,645,732,762,828,869,903,911,919,1026,1079,1088 'function':29,54,103,168,507,842,883,950,1247,1289,1347 'futur':14,250,1252 'get':160,365,551,791 'github.com':46,133,162,314,513,856,896,1276 'github.com/samber/mo':161,313 'github.com/samber/mo/issues':1275 'github.com/samber/mo/option':855,895 'github.com/samber/mo/result':512 'github.com/samber/mo](https://github.com/samber/mo)':132 'glanc':186 'go':51,58,106,107,159,177,311,420,424,426,465,485,510,600,729,781,822,853,893,973,997,1018,1020,1065,1133,1311,1327,1351 'golang':2,8,1284,1305,1318,1332,1342 'golang-databas':1331 'golang-design-pattern':1341 'golang-error-handl':1304 'golang-safeti':1317 'golang-samber-lo':1283 'golang-samber-mo':1 'got':1085,1094 'grace':988 'guid':180 'handl':27,73,403,1307,1313 'haskel':265,282 'hello':446,458 'help':153 'id':612,621,633,1001 'idiomat':1310 'if/else':1215 'imper':712,719,780 'implement':377,1008 'impli':592 'import':45,312,511,854,894 'imposs':64 'inform':150 'input':820,852 'insid':1111,1148 'inspir':119 'int':733,763,766,830,831,838,858,871,905,1002,1069,1081 'interfac':1064 'introduc':488 'introduct':166 'io':15,259,267,1253 'isabs':375 'iserror':561 'isok':560 'ispres':374 'issu':1273 'java':203 'javascript':257 'json':387,968,979,984,992 'json.marshaler':379 'json.marshaler/unmarshaler':378 'k':1028,1034,1037 'key':361,544,1036,1043,1045 'l':221,236,571,670,1159 'lazi':261,270 'left':681,1210 'left-to-right':1209 'len':925 'level':310 'librari':109,143 'limit':466 'line':789 'lo':1286 'logic':1151 'lookup':1023 'm':1032,1042,1044 'make':63 'map':369,447,469,478,554,811,866,1022,1033,1146,1292 'maperr':556 'mapget':1027 'match':371,557,635 'may':197,210 'method':362,468,486,545,810,940 'mo':4,1300 'mo.do':509,717,731,761,1112 'mo.either':614,640,648 'mo.fold':1053,1067 'mo.left':624 'mo.none':324,765,933 'mo.ok':445,749,1071 'mo.option':922,982,990,1006,1038 'mo.pointertooption':331 'mo.result':539 'mo.right':629 'mo.some':317,745,824,878,900,929 'mo.tupletooption':1041 'mo.tupletoresult':432,524 'mode':78 'model':391 'monad':5,61,99,101,114,173,179,285,715,784,1218 'multi':84,1230 'multi-step':83,1229 'multipl':887 'mustget':366,552,727,734,747,751,767,1102,1103 'name':316,977,980 'name.map':351 'name.orelse':338 'neither':590 'nest':1203,1214,1246 'new':489 'nicknam':981,985 'nil':67,291,304,333,456,1323 'nil-safeti':1322 'none':302,335,364 'none/err':737 'notat':711,778 'null':987 'nullabl':24,288,995,1177 'offici':127 'ok':408,457,546,619,622,758 'omit':986 'one':225,240,583,663 'open':1271 'oper':208,808 'opt':823 'opt.map':827 'option':11,193,202,205,286,319,326,376,397,837,880,972,1025,1057,1075,1175,1182,1348 'option.flatmap':918 'option.map':843,868,902,910 'option.pipe3':884,899,1241 'option/result/either':86 'orels':367,553,1100,1206 'orempti':368 'os.readfile':433,525 'output':816,848 'packag':35,506,798,841,865,949,1226 'panic':725,735,768,1104,1115 'paramet':475,491 'pars':522 'parseconfig':533 'path':664,674 'pattern':423,430,634,967,1216,1314,1338,1344,1352 'persona':47 'phone':1005 'pipe':882,951,1227 'pipelin':32,76,87,518,795,959,963 'pkg.go.dev':130 'pkg.go.dev/github.com/samber/mo](https://pkg.go.dev/github.com/samber/mo)':129 'plain':1190 'platform':157 'pleas':140 'pointer':305,334 'possibl':586 'practic':1097 'prefer':1099 'present':298,346 'program':55,169 'promis':258 'propag':794 'provid':110,803 'ptr':332 'purpos':97,188 'r':222,237,572,671,1160 'read':1208 'readabl':892,1244 'reduc':1294 'refer':141,395,398,565,568,705,708,961,964,1259,1280 'replac':217 'repres':292,406,578 'requir':845 'resourc':128 'respons':970 'result':12,206,214,400,431,476,480,483,498,501,567,589,658,660,723,730,742,756,760,771,898,1058,1076,1138,1154,1163 'result.flatmap':535 'result.map':527,844,1204 'result.match':636 'result.pipe2':523 'result.pipe3':885 'return':357,453,479,532,541,603,623,628,752,769,833,873,907,915,928,932,1040,1046,1083,1092 'right':683,1212 'risk':306 'row.scan':1012 'rule':935 'rust':122,200,212 'safe':23,113,336 'safeti':56,716,785,1319,1324 'samber':3,1285 'samber/cc-skills-golang':1282,1303,1316,1330,1340 'samber/mo':10,41,100,802,1270 'same-typ':435,942 'scala':121,229,244 'see':178,396,566,706,962,1256,1281,1302,1315,1329,1339 'short':441 'short-circuit':440 'side':263,591 'skill':136,1287,1308,1320,1334,1345 'skill-golang-samber-mo' 'skip':347 'slice':1296 'source-samber' 'special':418,1165 'sql.scanner':381,1009 'state':18,65,277,280,284,1255 'step':85,956,1231,1236 'str':1066 'straight':788 'straight-lin':787 'strategi':684 'strconv.itoa':908 'string':320,325,327,354,355,450,451,613,859,872,881,906,913,923,930,934,978,983,991,1004,1007,1070,1082,1091,1183,1188,1191,1194 'strings.toupper':358,454 'stropt':867 'struct':388,976,1000 'style':713,782 'sub':34,505,797,840,864,948,1225 'sub-packag':33,504,796,839,863,947,1224 'success':407,593 'success/failure':1167 'synchron':262 't1':689 't2':690 't3':691 'task':16,268,276,1254 'think':77,189 'thumb':937 'toeither':559 'topic-agent' 'topic-agent-skills' 'topic-antigravity' 'topic-claude' 'topic-claude-code' 'topic-code' 'topic-codex' 'topic-coding' 'topic-copilot' 'topic-cursor' 'topic-gemini' 'topic-gemini-cli-extension' 'topoint':373 'transform':344,438,496,891,945,1233,1291 'tri':550 'true':360,836 'ts':126,275 'tupletoresult':549,1128 'two':227,576,585,804,1171 'type':6,19,22,70,89,112,115,183,187,228,243,309,437,474,490,494,516,577,587,700,817,821,849,860,889,944,953,974,998,1173,1232,1240,1251,1258,1301 'type-chang':493,515,888 'type-saf':21,111 'typescript':232,247 'u':484 'u.email':1014 'u.id':1013 'u.phone':1015 'ultrathink':80 'unexpect':1267 'uniform':1049,1055 'union':234,249,574 'unlik':588 'unnecessari':92 'unrepresent':66 'upper':350,444 'upper.orelse':463 'use':9,38,60,79,383,503,643,651,655,659,668,862,938,946,1108,1127,1153,1189,1223 'user':999 'userrespons':975 'v':829,834,870,877,904,909,1030,1035,1039,1047,1080,1087 'val':462,764,770 'valid':542,598,676,1172,1197 'validconfig':521,540 'valu':25,195,223,238,253,289,294,322,329,405,428,580,875,1107,1124,1181,1198 'valuabl':175 'variant':701 'via':1061 'vs':657,679,682,686,799 'way':805 'without':290,328 'work':813,1054,1073 'wrap':425,718,1016 'wrapping/unwrapping':93 'write':786 'wrong':88 'x':242 'yet':255 'zero':117,1180","prices":[{"id":"2ce141d1-b85f-4def-a32d-07c3a0659dac","listingId":"db4bedfe-ed7d-45e4-aa77-aa4048fe895f","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"samber","category":"cc-skills-golang","install_from":"skills.sh"},"createdAt":"2026-04-18T20:32:59.036Z"}],"sources":[{"listingId":"db4bedfe-ed7d-45e4-aa77-aa4048fe895f","source":"github","sourceId":"samber/cc-skills-golang/golang-samber-mo","sourceUrl":"https://github.com/samber/cc-skills-golang/tree/main/skills/golang-samber-mo","isPrimary":false,"firstSeenAt":"2026-04-18T21:55:20.040Z","lastSeenAt":"2026-05-18T18:53:02.397Z"},{"listingId":"db4bedfe-ed7d-45e4-aa77-aa4048fe895f","source":"skills_sh","sourceId":"samber/cc-skills-golang/golang-samber-mo","sourceUrl":"https://skills.sh/samber/cc-skills-golang/golang-samber-mo","isPrimary":true,"firstSeenAt":"2026-04-18T20:32:59.036Z","lastSeenAt":"2026-05-07T22:40:28.570Z"}],"details":{"listingId":"db4bedfe-ed7d-45e4-aa77-aa4048fe895f","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"samber","slug":"golang-samber-mo","github":{"repo":"samber/cc-skills-golang","stars":1725,"topics":["agent","agent-skills","ai","antigravity","claude","claude-code","code","codex","coding","copilot","cursor","gemini","gemini-cli-extension","openclaw","opencode","plugin","skills","skillsmp","vibe-coding"],"license":"mit","html_url":"https://github.com/samber/cc-skills-golang","pushed_at":"2026-05-18T17:36:00Z","description":"🧑‍🎨 A collection of Golang agentic skills that works","skill_md_sha":"3154b052cebf5e9f581660dc88c323fea13574f1","skill_md_path":"skills/golang-samber-mo/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/samber/cc-skills-golang/tree/main/skills/golang-samber-mo"},"layout":"multi","source":"github","category":"cc-skills-golang","frontmatter":{"name":"golang-samber-mo","license":"MIT","description":"Monadic types for Golang using samber/mo — Option, Result, Either, Future, IO, Task, and State types for type-safe nullable values, error handling, and functional composition with pipeline sub-packages. Apply when using or adopting samber/mo, when the codebase imports `github.com/samber/mo`, or when considering functional programming patterns as a safety design for Golang.","compatibility":"Designed for Claude Code or similar AI coding agents, and for projects using Golang."},"skills_sh_url":"https://skills.sh/samber/cc-skills-golang/golang-samber-mo"},"updatedAt":"2026-05-18T18:53:02.397Z"}}