builtin2.go 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020
  1. package builtin
  2. import (
  3. "io"
  4. "os"
  5. "fmt"
  6. "math"
  7. "time"
  8. "regexp"
  9. "errors"
  10. "strconv"
  11. "strings"
  12. "reflect"
  13. "runtime"
  14. "net/http"
  15. "math/big"
  16. "math/rand"
  17. "unicode/utf8"
  18. "path/filepath"
  19. "kumachan/standalone/qt"
  20. "kumachan/standalone/ctn"
  21. "kumachan/standalone/util"
  22. "kumachan/standalone/util/pseudounion"
  23. "kumachan/interpreter/core"
  24. )
  25. var functionList = [] interface{} {
  26. // None, Error, undefined (panic)
  27. None, Error, ErrorMessage, ErrorWrap, Undefined,
  28. // Reflection
  29. ReflectType,
  30. DebugInspect, DebugExpose, DebugTrace, DebugWatch,
  31. Serialize, Deserialize,
  32. // Bool
  33. BoolNo, BoolYes, BoolNot, BoolAnd, BoolOr, BoolEqual, BoolAssert,
  34. // Int
  35. IntPlus, IntMinus, IntTimes, IntQuo, IntRem, IntPow,
  36. IntEqual, IntLessThan, IntCompare,
  37. // Float
  38. FloatPlus, FloatMinus, FloatTimes, FloatQuo, FloatRem, FloatPow,
  39. FloatEqual, FloatLessThan,
  40. FloatInt, IntFloat, FloatNormal, FloatNaN, FloatInfinite,
  41. math.Floor, math.Ceil, math.Round,
  42. math.Sqrt, math.Cbrt, math.Exp, math.Log,
  43. math.Sin, math.Cos, math.Tan, math.Asin, math.Acos, math.Atan, math.Atan2,
  44. // Char
  45. Char,
  46. CharInt, CharUtf8Size,
  47. CharEqual, CharLessThan, CharCompare,
  48. // String
  49. String, StringFromChars, Quote, Unquote,
  50. StringEmpty,
  51. StringChars, StringFirstChar, StringNumberOfChars,
  52. StringUtf8Size,
  53. StringEqual, StringLessThan, StringCompare,
  54. StringShift, StringReverse,
  55. ListStringJoin, StringSplit, StringCut,
  56. StringHasPrefix, StringHasSuffix,
  57. StringTrimPrefix, StringTrimSuffix,
  58. StringTrim, StringTrimLeft, StringTrimRight,
  59. // RegExp
  60. RegExpString,
  61. StringAdvance, StringSatisfy, StringReplace,
  62. // To String
  63. BoolString, OrderingString, IntString, FloatString, CharString,
  64. // From String
  65. ParseInt, ParseFloat,
  66. // List
  67. ListConcat,
  68. core.Cons, core.Count, ListEmpty, ListFirst, ListLength, ListSeq,
  69. ListShift, ListReverse,
  70. ListSort, ListTake,
  71. ListWithIndex,
  72. ListMap, ListDeflateMap, ListFlatMap, ListFilter, ListScan, ListFold,
  73. // Seq
  74. SeqEmpty, SeqLast, SeqLength, SeqList,
  75. SeqAppend, SeqDeflateAppend, SeqFlatAppend, SeqSort, SeqFilter,
  76. // Queue
  77. Queue,
  78. QueueEmpty, QueueSize, QueueFirst, QueueList,
  79. QueueShift, QueueAppend,
  80. // Heap
  81. Heap,
  82. HeapEmpty, HeapSize, HeapFirst, HeapList,
  83. HeapShift, HeapInsert,
  84. // Set
  85. Set,
  86. SetEmpty, SetSize, SetList,
  87. SetHas, SetDelete, SetInsert,
  88. // Map
  89. Map,
  90. MapEmpty, MapSize, MapKeys, MapValues, MapEntries,
  91. MapHas, MapLookup, MapDelete, MapInsert,
  92. // Observable
  93. Observable,
  94. core.WithChildContext, core.WithCancelTrigger, core.WithCancelTimeout,
  95. core.SetTimeout, core.SetInterval,
  96. Go, Throw, Crash,
  97. ObservableCatch, ObservableRetry,
  98. ObservableDistinctUntilChanged,
  99. DistinctUntilObjectChanged,
  100. ObjectPairEqualities,
  101. ObservableWithLatestFrom, ObservableMapToLatestFrom,
  102. ObservableWithCycle, ObservableWithIndex, ObservableWithTime,
  103. ObservableDelaySubscription, ObservableDelayValues,
  104. ObservableStartWith, ObservableEndWith,
  105. ObservableThrottle, ObservableDebounce,
  106. ObservableThrottleTime, ObservableDebounceTime,
  107. ObservableCompleteOnEmit,
  108. ObservableSkip,
  109. ObservableTake,
  110. ObservableTakeLast, ObservableTakeLastAsMaybe,
  111. ObservableTakeWhile, ObservableTakeWhileMaybeOK,
  112. ObservableTakeUntil,
  113. ObservableCount, ObservableCollect,
  114. ObservableBufferTime,
  115. ObservablePairwise, ObservableBufferCount,
  116. ObservableMap, ObservableMapTo,
  117. ObservableFilter,
  118. ObservableScan, ObservableReduce,
  119. ObservableCombineLatest, ListObservableCombineLatest,
  120. ObservableAwait, ObservableAwaitNoexcept,
  121. ObservableThen,
  122. ObservableWith, ObservableAnd,
  123. ListObservableMerge, ObservableMerge, ObservableMergeMap,
  124. ListObservableConcat, ObservableConcat, ObservableConcatMap,
  125. ObservableSwitchMap, ObservableExhaustMap,
  126. NumCPU,
  127. ListObservableConcurrent, ObservableConcurrentMap,
  128. ListObservableForkJoin, ObservableForkJoin,
  129. UUID,
  130. Random,
  131. Shuffle,
  132. // Subject
  133. Subject,
  134. SubjectObservable, SubjectPlug,
  135. core.Multicast, core.Loopback, core.SkipSync,
  136. // Time
  137. TimeString, TimeSubtractMillisecond,
  138. // Request
  139. ApiGet,
  140. // Process
  141. Arguments,
  142. Environment,
  143. // GUI
  144. // general
  145. FontSize,
  146. // standard dialogs
  147. ShowInfo, ShowWarning, ShowCritical,
  148. ShowYesNo, ShowAbortRetryIgnore, ShowSaveDiscardCancel,
  149. GetChoice, GetLine, GetText, GetInt, GetFloat,
  150. // action, context menu
  151. Action, ActionTriggers,
  152. ActionCheckBox, ActionComboBox,
  153. BindContextMenu,
  154. // widget
  155. WidgetShowAndActivate,
  156. WidgetBindInlineStyleSheet,
  157. WidgetComboBoxSelectedItem,
  158. WidgetCreateWidget,
  159. WidgetCreateScrollArea,
  160. WidgetCreateGroupBox,
  161. WidgetCreateSplitter,
  162. WidgetCreateMainWindow,
  163. WidgetCreateDialog,
  164. WidgetCreateLabel,
  165. WidgetCreateIconLabel,
  166. WidgetCreateElidedLabel,
  167. WidgetCreateTextView,
  168. WidgetCreateCheckBox,
  169. WidgetCreateComboBox,
  170. WidgetCreatePushButton,
  171. WidgetCreateLineEdit,
  172. WidgetCreatePlainTextEdit,
  173. WidgetCreateSlider,
  174. WidgetCreateProgressBar,
  175. // signal and events
  176. Connect, Listen,
  177. SignalToggled,
  178. SignalClicked,
  179. SignalTextChanged0,
  180. SignalTextChanged1,
  181. SignalReturnPressed,
  182. SignalRejected,
  183. SignalValueChanged,
  184. EventsClose,
  185. // prop
  186. Read,
  187. Bind,
  188. ClearTextLater,
  189. PropEnabled,
  190. PropWindowTitle,
  191. PropText,
  192. PropChecked,
  193. PropPlainText,
  194. PropValue,
  195. // advanced
  196. Switchable,
  197. Reloadable,
  198. ListView,
  199. ListEditView,
  200. ColumnView,
  201. RowView,
  202. }
  203. var functionMap = (func() (map[string] core.NativeFunction) {
  204. var m = make(map[string] core.NativeFunction)
  205. for _, item := range functionList {
  206. var rv = reflect.ValueOf(item)
  207. var name = strings.Split(runtime.FuncForPC(rv.Pointer()).Name(), ".")[1]
  208. var obj = core.MakeNativeFunction(item)
  209. if _, duplicate := m[name]; duplicate {
  210. panic("duplicate native function: " + name)
  211. }
  212. m[name] = obj
  213. }
  214. return m
  215. })()
  216. func LookupFunction(id string) (core.NativeFunction, bool) {
  217. var f, ok = functionMap[id]
  218. return f, ok
  219. }
  220. func None() core.Object {
  221. return nil
  222. }
  223. func Error(msg string) error {
  224. return errors.New(msg)
  225. }
  226. func ErrorMessage(err error) string {
  227. return err.Error()
  228. }
  229. func ErrorWrap(err error, msg string) error {
  230. return fmt.Errorf("%s: %w", msg, err)
  231. }
  232. func Undefined(msg string, h core.RuntimeHandle) core.Object {
  233. return core.Crash1[core.Object] (
  234. h, core.ValueUndefined,
  235. strconv.Quote(msg),
  236. )
  237. }
  238. func ReflectType() core.Object {
  239. // DummyReflectType
  240. return nil
  241. }
  242. func DebugInspect(hint string, rv core.ReflectValue, h core.RuntimeHandle) core.Object {
  243. var lg = core.MakeLogger(h)
  244. lg.Inspect(rv.Value(), rv.Type().CertainType(), hint)
  245. return rv.Value()
  246. }
  247. func DebugExpose(name string, rv core.ReflectValue, h core.RuntimeHandle) core.Observable {
  248. var lg = core.MakeLogger(h)
  249. return lg.Expose(name, rv.Value(), rv.Type().CertainType())
  250. }
  251. func DebugTrace(hint string, rv core.ReflectValue, h core.RuntimeHandle) core.Observable {
  252. var lg = core.MakeLogger(h)
  253. var ro = rv.CastToReflectObservable()
  254. return lg.Trace(ro.ObservableValue(), ro.InnerType().CertainType(), hint)
  255. }
  256. func DebugWatch(hint string, rv core.ReflectValue, h core.RuntimeHandle) core.Observable {
  257. var lg = core.MakeLogger(h)
  258. var ro = rv.CastToReflectObservable()
  259. return lg.Watch(ro.ObservableValue(), ro.InnerType().CertainType(), hint)
  260. }
  261. func Serialize(rv core.ReflectValue, h core.RuntimeHandle) core.Observable {
  262. var ctx = h.SerializationContext()
  263. return core.Observable(func(pub core.DataPublisher) {
  264. go (func() {
  265. var b, err = core.Marshal(rv, ctx)
  266. if err != nil {
  267. pub.AsyncThrow(err)
  268. } else {
  269. var s = util.WellBehavedDecodeUtf8(b)
  270. pub.AsyncReturn(core.ObjString(s))
  271. }
  272. })()
  273. })
  274. }
  275. func Deserialize(s string, rt core.ReflectType, h core.RuntimeHandle) core.Observable {
  276. var ctx = h.SerializationContext()
  277. return core.Observable(func(pub core.DataPublisher) {
  278. go (func() {
  279. var b = ([] byte)(s)
  280. var obj, err = core.Unmarshal(b, rt, ctx)
  281. if err != nil {
  282. pub.AsyncThrow(err)
  283. } else {
  284. pub.AsyncReturn(obj)
  285. }
  286. })()
  287. })
  288. }
  289. func BoolNo() bool {
  290. return false
  291. }
  292. func BoolYes() bool {
  293. return true
  294. }
  295. func BoolNot(p bool) bool {
  296. return !(p)
  297. }
  298. func BoolAnd(p bool, q bool) bool {
  299. return (p && q)
  300. }
  301. func BoolOr(p bool, q bool) bool {
  302. return (p || q)
  303. }
  304. func BoolEqual(p bool, q bool) bool {
  305. return (p == q)
  306. }
  307. func BoolAssert(ok bool, k func()(core.Object), h core.RuntimeHandle) core.Object {
  308. if ok {
  309. return k()
  310. } else {
  311. return core.Crash1[core.Object] (
  312. h, core.AssertionFailed,
  313. "given boolean value is false",
  314. )
  315. }
  316. }
  317. type CompareWithOperator func(core.Object,core.Object)(ctn.Ordering)
  318. type EqualToOperator func(core.Object,core.Object)(bool)
  319. type LessThanOperator func(core.Object,core.Object)(bool)
  320. func IntPlus(a *big.Int, b *big.Int) *big.Int {
  321. var c big.Int
  322. return c.Add(a, b)
  323. }
  324. func IntMinus(a *big.Int, b *big.Int) *big.Int {
  325. var c big.Int
  326. return c.Sub(a, b)
  327. }
  328. func IntTimes(a *big.Int, b *big.Int) *big.Int {
  329. var c big.Int
  330. return c.Mul(a, b)
  331. }
  332. func IntQuo(a *big.Int, b *big.Int, h core.RuntimeHandle) *big.Int {
  333. if b.Sign() == 0 {
  334. core.Crash(h, core.InvalidArgument, "division by zero")
  335. }
  336. var c big.Int
  337. return c.Quo(a, b)
  338. }
  339. func IntRem(a *big.Int, b *big.Int, h core.RuntimeHandle) *big.Int {
  340. if b.Sign() == 0 {
  341. core.Crash(h, core.InvalidArgument, "division by zero")
  342. }
  343. var c big.Int
  344. return c.Rem(a, b)
  345. }
  346. func IntPow(a *big.Int, b *big.Int, h core.RuntimeHandle) *big.Int {
  347. var c big.Int
  348. if b.Sign() < 0 {
  349. core.Crash(h, core.InvalidArgument, "negative integer power")
  350. }
  351. return c.Exp(a, b, nil)
  352. }
  353. func IntEqual(a *big.Int, b *big.Int) bool {
  354. return (a.Cmp(b) == 0)
  355. }
  356. func IntLessThan(a *big.Int, b *big.Int) bool {
  357. return (a.Cmp(b) < 0)
  358. }
  359. func IntCompare(a *big.Int, b *big.Int) ctn.Ordering {
  360. var result = a.Cmp(b)
  361. if result < 0 {
  362. return ctn.Smaller
  363. } else if result > 0 {
  364. return ctn.Bigger
  365. } else {
  366. return ctn.Equal
  367. }
  368. }
  369. func FloatPlus(x float64, y float64) float64 {
  370. return (x + y)
  371. }
  372. func FloatMinus(x float64, y float64) float64 {
  373. return (x - y)
  374. }
  375. func FloatTimes(x float64, y float64) float64 {
  376. return (x * y)
  377. }
  378. func FloatQuo(x float64, y float64) float64 {
  379. return (x / y)
  380. }
  381. func FloatRem(x float64, y float64) float64 {
  382. return math.Mod(x, y)
  383. }
  384. func FloatPow(x float64, y float64) float64 {
  385. return math.Pow(x, y)
  386. }
  387. func FloatEqual(x float64, y float64) bool {
  388. return (x == y)
  389. }
  390. func FloatLessThan(x float64, y float64) bool {
  391. return (x < y)
  392. }
  393. func FloatInt(x float64, h core.RuntimeHandle) *big.Int {
  394. var a, ok = util.DoubleToInteger(x)
  395. if !(ok) {
  396. core.Crash(h, core.InvalidArgument,
  397. "cannot convert abnormal float to integer")
  398. }
  399. return a
  400. }
  401. func IntFloat(a *big.Int, h core.RuntimeHandle) float64 {
  402. var x, ok = util.IntegerToDouble(a)
  403. if !(ok) {
  404. core.Crash(h, core.InvalidArgument,
  405. "cannot convert large integer to float")
  406. }
  407. return x
  408. }
  409. func FloatNormal(x float64) bool {
  410. return util.IsNormalFloat(x)
  411. }
  412. func FloatNaN(x float64) bool {
  413. return (x != x)
  414. }
  415. func FloatInfinite(x float64) bool {
  416. return math.IsInf(x, 0)
  417. }
  418. func Char(n *big.Int, h core.RuntimeHandle) rune {
  419. if n.IsInt64() {
  420. n := n.Int64()
  421. if (0 <= n && n <= 0x10FFFF) && !(0xD800 <= n && n <= 0xDFFF) {
  422. return rune(n)
  423. }
  424. }
  425. // TODO: consider returning RuneError when n is invalid
  426. var msg = fmt.Sprintf("invalid codepoint 0x%X", n)
  427. return core.Crash1[rune](h, core.InvalidArgument, msg)
  428. }
  429. func CharInt(c rune) int {
  430. return int(c)
  431. }
  432. func CharUtf8Size(c rune) int {
  433. return utf8.RuneLen(c)
  434. }
  435. func CharEqual(c rune, d rune) bool {
  436. return (c == d)
  437. }
  438. func CharLessThan(c rune, d rune) bool {
  439. return (c < d)
  440. }
  441. func CharCompare(c rune, d rune) ctn.Ordering {
  442. return ctn.DefaultCompare[rune](c, d)
  443. }
  444. func String(fragments ([] ToString)) string {
  445. var buf strings.Builder
  446. for _, f := range fragments {
  447. buf.WriteString(f())
  448. }
  449. return buf.String()
  450. }
  451. func StringFromChars(chars ([] rune)) string {
  452. return string(chars)
  453. }
  454. func Quote(s string) string {
  455. return strconv.Quote(s)
  456. }
  457. func Unquote(s string) ctn.Optional[string] {
  458. var unquoted, err = strconv.Unquote(s)
  459. if err == nil {
  460. return ctn.Just(unquoted)
  461. } else {
  462. return nil
  463. }
  464. }
  465. func StringEmpty(s string) bool {
  466. return (s == "")
  467. }
  468. func StringChars(s string) ([] rune) {
  469. return ([] rune)(s)
  470. }
  471. func StringFirstChar(s string) ctn.Optional[rune] {
  472. for _, char := range s {
  473. return ctn.Just(char)
  474. }
  475. return nil
  476. }
  477. func StringNumberOfChars(s string) int {
  478. var n = 0
  479. for range s {
  480. n++
  481. }
  482. return n
  483. }
  484. func StringUtf8Size(s string) int {
  485. return len(s)
  486. }
  487. func StringEqual(a string, b string) bool {
  488. return (a == b)
  489. }
  490. func StringLessThan(a string, b string) bool {
  491. return (a < b)
  492. }
  493. func StringCompare(a string, b string) ctn.Ordering {
  494. return ctn.StringCompare(a, b)
  495. }
  496. func StringShift(s string) ctn.Optional[ctn.Pair[rune,string]] {
  497. for _, char := range s {
  498. var rest = s[utf8.RuneLen(char):]
  499. return ctn.Just(ctn.MakePair(char, rest))
  500. }
  501. return nil
  502. }
  503. func StringReverse(s string) string {
  504. var chars = ([] rune)(s)
  505. var L = len(chars)
  506. var buf strings.Builder
  507. for i := (L-1); i >= 0; i -= 1 {
  508. buf.WriteRune(chars[i])
  509. }
  510. return buf.String()
  511. }
  512. func ListStringJoin(l core.List, sep string) string {
  513. var values = make([] string, 0)
  514. l.ForEach(func(item core.Object) {
  515. var value = core.GetString(item)
  516. values = append(values, value)
  517. })
  518. return strings.Join(values, sep)
  519. }
  520. func StringSplit(s string, sep string) core.List {
  521. return core.ToObjectList(strings.Split(s, sep))
  522. }
  523. func StringCut(s string, sep string) ctn.Optional[ctn.Pair[string,string]] {
  524. if a, b, ok := strings.Cut(s, sep); ok {
  525. return ctn.Just(ctn.MakePair(a, b))
  526. } else {
  527. return nil
  528. }
  529. }
  530. func StringHasPrefix(s string, prefix string) bool {
  531. return strings.HasPrefix(s, prefix)
  532. }
  533. func StringHasSuffix(s string, suffix string) bool {
  534. return strings.HasSuffix(s, suffix)
  535. }
  536. func StringTrimPrefix(s string, prefix string) string {
  537. return strings.TrimPrefix(s, prefix)
  538. }
  539. func StringTrimSuffix(s string, suffix string) string {
  540. return strings.TrimSuffix(s, suffix)
  541. }
  542. func StringTrim(s string, chars ([] rune)) string {
  543. return strings.Trim(s, string(chars))
  544. }
  545. func StringTrimLeft(s string, chars ([] rune)) string {
  546. return strings.TrimLeft(s, string(chars))
  547. }
  548. func StringTrimRight(s string, chars ([] rune)) string {
  549. return strings.TrimRight(s, string(chars))
  550. }
  551. func RegExpString(r *regexp.Regexp) string {
  552. return r.String()
  553. }
  554. func StringAdvance(s string, pattern *regexp.Regexp) ctn.Optional[ctn.Pair[string,string]] {
  555. var header_pattern = ("^(?:" + pattern.String() + ")")
  556. var r = assumeValidRegexp(header_pattern)
  557. if result := r.FindStringIndex(s); (result != nil) {
  558. if result[0] != 0 { panic("something went wrong") }
  559. var pos = result[1]
  560. var match = s[:pos]
  561. var rest = s[pos:]
  562. return ctn.Just(ctn.MakePair(match, rest))
  563. } else {
  564. return nil
  565. }
  566. }
  567. func StringSatisfy(s string, pattern *regexp.Regexp) bool {
  568. var full_pattern = ("^(?:" + pattern.String() + ")$")
  569. var r = assumeValidRegexp(full_pattern)
  570. if result := r.FindStringIndex(s); (result != nil) {
  571. if result[0] != 0 { panic("something went wrong") }
  572. if result[1] != len(s) { panic("something went wrong") }
  573. return true
  574. } else {
  575. return false
  576. }
  577. }
  578. func StringReplace(s string, pattern *regexp.Regexp, f func(string)(string)) string {
  579. return pattern.ReplaceAllStringFunc(s, f)
  580. }
  581. type ToString func()(string)
  582. func BoolString(p bool) string {
  583. if p {
  584. return "Yes"
  585. } else {
  586. return "No"
  587. }
  588. }
  589. func OrderingString(o ctn.Ordering) string {
  590. return o.String()
  591. }
  592. func IntString(a *big.Int) string {
  593. return a.String()
  594. }
  595. func FloatString(x float64) string {
  596. return strconv.FormatFloat(x, 'g', -1, 64)
  597. }
  598. func CharString(c rune) string {
  599. return string([] rune { c })
  600. }
  601. func ParseInt(s string) ctn.Optional[*big.Int] {
  602. var n = new(big.Int)
  603. if _, ok := n.SetString(s, 10); ok {
  604. return ctn.Just(n)
  605. } else {
  606. return nil
  607. }
  608. }
  609. func ParseFloat(s string) ctn.Optional[float64] {
  610. var x, err = strconv.ParseFloat(s, 64)
  611. if err == nil {
  612. return ctn.Just(x)
  613. } else {
  614. return nil
  615. }
  616. }
  617. func ListConcat(l core.List) core.List {
  618. var buf core.ListBuilder
  619. l.ForEach(func(item core.Object) {
  620. core.GetList(item).ForEach(func(item core.Object) {
  621. buf.Append(item)
  622. })
  623. })
  624. return buf.Collect()
  625. }
  626. func ListEmpty(l core.List) bool {
  627. return l.Empty()
  628. }
  629. func ListFirst(l core.List) ctn.Optional[core.Object] {
  630. return ctn.MakeOptional(l.First())
  631. }
  632. func ListLength(l core.List) int {
  633. return l.Length()
  634. }
  635. func ListSeq(l core.List) core.Seq {
  636. return l.ToSeq()
  637. }
  638. func ListShift(l core.List) ctn.Optional[ctn.Pair[core.Object,core.List]] {
  639. var head, tail, ok = l.Shifted()
  640. return ctn.MakeOptional(ctn.MakePair(head, tail), ok)
  641. }
  642. func ListReverse(l core.List) core.List {
  643. return l.Reversed()
  644. }
  645. func ListSort(l core.List, lt LessThanOperator) core.List {
  646. return l.Sorted(ctn.Less[core.Object](lt))
  647. }
  648. func ListTake(l core.List, n int) core.List {
  649. return l.Take(n)
  650. }
  651. func ListWithIndex(l core.List) core.List {
  652. return l.WithIndex()
  653. }
  654. func ListMap(l core.List, f func(core.Object)(core.Object)) core.List {
  655. return l.Map(f)
  656. }
  657. func ListDeflateMap(l core.List, f func(core.Object)(ctn.Optional[core.Object])) core.List {
  658. return l.DeflateMap(f)
  659. }
  660. func ListFlatMap(l core.List, f func(core.Object)(core.List)) core.List {
  661. return l.FlatMap(f)
  662. }
  663. func ListFilter(l core.List, f func(core.Object)(bool)) core.List {
  664. return l.Filter(f)
  665. }
  666. func ListScan(l core.List, b core.Object, f func(core.Object,core.Object)(core.Object)) core.List {
  667. return l.Scan(b, f)
  668. }
  669. func ListFold(l core.List, b core.Object, f func(core.Object,core.Object)(core.Object)) core.Object {
  670. return l.Fold(b, f)
  671. }
  672. func SeqEmpty(s core.Seq) bool {
  673. return s.Empty()
  674. }
  675. func SeqLast(s core.Seq) ctn.Optional[core.Object] {
  676. return ctn.MakeOptional(s.Last())
  677. }
  678. func SeqLength(s core.Seq) int {
  679. return s.Length()
  680. }
  681. func SeqList(s core.Seq) core.List {
  682. return s.ToList()
  683. }
  684. func SeqAppend(s core.Seq, item core.Object) core.Seq {
  685. return s.Appended(item)
  686. }
  687. func SeqDeflateAppend(s core.Seq, item ctn.Optional[core.Object]) core.Seq {
  688. if item, ok := item.Value(); ok {
  689. return s.Appended(item)
  690. } else {
  691. return s
  692. }
  693. }
  694. func SeqFlatAppend(s core.Seq, items core.List) core.Seq {
  695. var draft = s
  696. items.ForEach(func(item core.Object) {
  697. draft = draft.Appended(item)
  698. })
  699. return draft
  700. }
  701. func SeqSort(s core.Seq, lt LessThanOperator) core.Seq {
  702. return s.Sorted(ctn.Less[core.Object](lt))
  703. }
  704. func SeqFilter(s core.Seq, f func(core.Object)(bool)) core.Seq {
  705. return s.Filter(f)
  706. }
  707. func Queue(items core.List) core.Queue {
  708. var queue = ctn.MakeQueue[core.Object]()
  709. items.ForEach(func(item core.Object) {
  710. queue = queue.Appended(item)
  711. })
  712. return core.Queue(queue)
  713. }
  714. func QueueEmpty(q core.Queue) bool {
  715. var queue = ctn.Queue[core.Object](q)
  716. return queue.IsEmpty()
  717. }
  718. func QueueSize(q core.Queue) int {
  719. var queue = ctn.Queue[core.Object](q)
  720. return queue.Size()
  721. }
  722. func QueueFirst(q core.Queue) ctn.Optional[core.Object] {
  723. var queue = ctn.Queue[core.Object](q)
  724. return ctn.MakeOptional(queue.First())
  725. }
  726. func QueueList(q core.Queue) core.List {
  727. var queue = ctn.Queue[core.Object](q)
  728. var buf core.ListBuilder
  729. queue.ForEach(func(item core.Object) {
  730. buf.Append(item)
  731. })
  732. return buf.Collect()
  733. }
  734. func QueueShift(q core.Queue) ctn.Optional[ctn.Pair[core.Object,core.Queue]] {
  735. var queue = ctn.Queue[core.Object](q)
  736. var v, rest, ok = queue.Shifted()
  737. return ctn.MakeOptional(ctn.MakePair(v, core.Queue(rest)), ok)
  738. }
  739. func QueueAppend(q core.Queue, item core.Object) core.Queue {
  740. var queue = ctn.Queue[core.Object](q)
  741. return core.Queue(queue.Appended(item))
  742. }
  743. func Heap(items core.List, lt LessThanOperator) core.Heap {
  744. var heap = ctn.MakeHeap(ctn.Less[core.Object](lt))
  745. items.ForEach(func(item core.Object) {
  746. heap = heap.Inserted(item)
  747. })
  748. return core.Heap(heap)
  749. }
  750. func HeapEmpty(h core.Heap) bool {
  751. var heap = ctn.Heap[core.Object](h)
  752. return heap.IsEmpty()
  753. }
  754. func HeapSize(h core.Heap) int {
  755. var heap = ctn.Heap[core.Object](h)
  756. return heap.Size()
  757. }
  758. func HeapFirst(h core.Heap) ctn.Optional[core.Object] {
  759. var heap = ctn.Heap[core.Object](h)
  760. return ctn.MakeOptional(heap.First())
  761. }
  762. func HeapList(h core.Heap) core.List {
  763. var heap = ctn.Heap[core.Object](h)
  764. var buf core.ListBuilder
  765. heap.ForEach(func(item core.Object) {
  766. buf.Append(item)
  767. })
  768. return buf.Collect()
  769. }
  770. func HeapShift(h core.Heap) ctn.Optional[ctn.Pair[core.Object,core.Heap]] {
  771. var heap = ctn.Heap[core.Object](h)
  772. var v, rest, ok = heap.Shifted()
  773. return ctn.MakeOptional(ctn.MakePair(v, core.Heap(rest)), ok)
  774. }
  775. func HeapInsert(h core.Heap, item core.Object) core.Heap {
  776. var heap = ctn.Heap[core.Object](h)
  777. return core.Heap(heap.Inserted(item))
  778. }
  779. func Set(items core.List, cmp CompareWithOperator) core.Set {
  780. var set = ctn.MakeSet(ctn.Compare[core.Object](cmp))
  781. items.ForEach(func(item core.Object) {
  782. set = set.Inserted(item)
  783. })
  784. return core.Set(set)
  785. }
  786. func SetEmpty(s core.Set) bool {
  787. var set = ctn.Set[core.Object](s)
  788. return set.IsEmpty()
  789. }
  790. func SetSize(s core.Set) int {
  791. var set = ctn.Set[core.Object](s)
  792. return set.Size()
  793. }
  794. func SetList(s core.Set) core.List {
  795. var set = ctn.Set[core.Object](s)
  796. var buf core.ListBuilder
  797. set.ForEach(func(item core.Object) {
  798. buf.Append(item)
  799. })
  800. return buf.Collect()
  801. }
  802. func SetHas(s core.Set, item core.Object) bool {
  803. var set = ctn.Set[core.Object](s)
  804. return set.Has(item)
  805. }
  806. func SetDelete(s core.Set, item core.Object) core.Set {
  807. var set = ctn.Set[core.Object](s)
  808. var new_set, _ = set.Deleted(item)
  809. return core.Set(new_set)
  810. }
  811. func SetInsert(s core.Set, item core.Object) core.Set {
  812. var set = ctn.Set[core.Object](s)
  813. return core.Set(set.Inserted(item))
  814. }
  815. func Map(entries core.List, cmp CompareWithOperator) core.Map {
  816. var map_ = ctn.MakeMap[core.Object,core.Object](ctn.Compare[core.Object](cmp))
  817. entries.ForEach(func(entry core.Object) {
  818. var pair = core.FromObject[ctn.Pair[core.Object,core.Object]](entry)
  819. map_ = map_.Inserted(pair.Key(), pair.Value())
  820. })
  821. return core.Map(map_)
  822. }
  823. func MapEmpty(m core.Map) bool {
  824. var map_ = ctn.Map[core.Object,core.Object](m)
  825. return map_.IsEmpty()
  826. }
  827. func MapSize(m core.Map) int {
  828. var map_ = ctn.Map[core.Object,core.Object](m)
  829. return map_.Size()
  830. }
  831. func MapKeys(m core.Map) core.List {
  832. var map_ = ctn.Map[core.Object,core.Object](m)
  833. var buf core.ListBuilder
  834. map_.ForEach(func(k core.Object, _ core.Object) {
  835. buf.Append(k)
  836. })
  837. return buf.Collect()
  838. }
  839. func MapValues(m core.Map) core.List {
  840. var map_ = ctn.Map[core.Object,core.Object](m)
  841. var buf core.ListBuilder
  842. map_.ForEach(func(_ core.Object, v core.Object) {
  843. buf.Append(v)
  844. })
  845. return buf.Collect()
  846. }
  847. func MapEntries(m core.Map) core.List {
  848. var map_ = ctn.Map[core.Object,core.Object](m)
  849. var buf core.ListBuilder
  850. map_.ForEach(func(k core.Object, v core.Object) {
  851. buf.Append(core.ToObject(ctn.MakePair(k, v)))
  852. })
  853. return buf.Collect()
  854. }
  855. func MapHas(m core.Map, key core.Object) bool {
  856. var map_ = ctn.Map[core.Object,core.Object](m)
  857. return map_.Has(key)
  858. }
  859. func MapLookup(m core.Map, key core.Object) ctn.Optional[core.Object] {
  860. var map_ = ctn.Map[core.Object,core.Object](m)
  861. return ctn.MakeOptional(map_.Lookup(key))
  862. }
  863. func MapDelete(m core.Map, key core.Object) core.Map {
  864. var map_ = ctn.Map[core.Object,core.Object](m)
  865. var _, new_map, _ = map_.Deleted(key)
  866. return core.Map(new_map)
  867. }
  868. func MapInsert(m core.Map, entry ctn.Pair[core.Object,core.Object]) core.Map {
  869. var map_ = ctn.Map[core.Object,core.Object](m)
  870. return core.Map(map_.Inserted(entry.Key(), entry.Value()))
  871. }
  872. func Observable(l core.List) core.Observable {
  873. return core.Observable(func(pub core.DataPublisher) {
  874. pub.SyncGenerate(func(yield func(core.Object)) error {
  875. l.ForEach(yield)
  876. return nil
  877. })
  878. })
  879. }
  880. func Go(k func()(core.Object)) core.Observable {
  881. return core.Observable(func(pub core.DataPublisher) {
  882. go (func() {
  883. var v = k()
  884. pub.AsyncReturn(v)
  885. })()
  886. })
  887. }
  888. func Throw(e error) core.Observable {
  889. return core.Observable(func(pub core.DataPublisher) {
  890. pub.SyncReturn(func() (core.Object, error) {
  891. return nil, e
  892. })
  893. })
  894. }
  895. func Crash(err error, h core.RuntimeHandle) core.Observable {
  896. return core.Observable(func(pub core.DataPublisher) {
  897. pub.SyncReturn(func() (core.Object, error) {
  898. return core.Crash2[core.Object,error](
  899. h, core.ProgrammedCrash, err.Error(),
  900. )
  901. })
  902. })
  903. }
  904. func ObservableCatch(o core.Observable, f func(error,core.Observable)(core.Observable)) core.Observable {
  905. return o.Catch(f)
  906. }
  907. func ObservableRetry(o core.Observable, n int) core.Observable {
  908. return o.Retry(n)
  909. }
  910. func ObservableDistinctUntilChanged(o core.Observable, eq EqualToOperator) core.Observable {
  911. return o.DistinctUntilChanged(eq)
  912. }
  913. func DistinctUntilObjectChanged(o core.Observable) core.Observable {
  914. return o.DistinctUntilObjectChanged()
  915. }
  916. func ObjectPairEqualities(o core.Observable) core.Observable {
  917. return o.ObjectPairEqualities()
  918. }
  919. func ObservableWithLatestFrom(o core.Observable, another core.Observable) core.Observable {
  920. return o.WithLatestFrom(another)
  921. }
  922. func ObservableMapToLatestFrom(o core.Observable, another core.Observable) core.Observable {
  923. return o.MapToLatestFrom(another)
  924. }
  925. func ObservableWithCycle(o core.Observable, l core.List) core.Observable {
  926. return o.WithCycle(l)
  927. }
  928. func ObservableWithIndex(o core.Observable) core.Observable {
  929. return o.WithIndex()
  930. }
  931. func ObservableWithTime(o core.Observable) core.Observable {
  932. return o.WithTime()
  933. }
  934. func ObservableDelaySubscription(o core.Observable, ms int) core.Observable {
  935. return o.DelayRun(ms)
  936. }
  937. func ObservableDelayValues(o core.Observable, ms int) core.Observable {
  938. return o.DelayValues(ms)
  939. }
  940. func ObservableStartWith(o core.Observable, first core.Object) core.Observable {
  941. return o.StartWith(first)
  942. }
  943. func ObservableEndWith(o core.Observable, last core.Object) core.Observable {
  944. return o.EndWith(last)
  945. }
  946. func ObservableThrottle(o core.Observable, f func(core.Object)(core.Observable)) core.Observable {
  947. return o.Throttle(f)
  948. }
  949. func ObservableDebounce(o core.Observable, f func(core.Object)(core.Observable)) core.Observable {
  950. return o.Debounce(f)
  951. }
  952. func ObservableThrottleTime(o core.Observable, ms int) core.Observable {
  953. return o.ThrottleTime(ms)
  954. }
  955. func ObservableDebounceTime(o core.Observable, ms int) core.Observable {
  956. return o.DebounceTime(ms)
  957. }
  958. func ObservableCompleteOnEmit(o core.Observable) core.Observable {
  959. return o.CompleteOnEmit()
  960. }
  961. func ObservableSkip(o core.Observable, n int) core.Observable {
  962. return o.Skip(n)
  963. }
  964. func ObservableTake(o core.Observable, n int) core.Observable {
  965. return o.Take(n)
  966. }
  967. func ObservableTakeLast(o core.Observable) core.Observable {
  968. return o.TakeLast()
  969. }
  970. func ObservableTakeLastAsMaybe(o core.Observable) core.Observable {
  971. return o.TakeLast().Map(core.WrapSome).EndWith(core.WrapNone()).Take(1)
  972. }
  973. func ObservableTakeWhile(o core.Observable, f func(core.Object)(bool)) core.Observable {
  974. return o.TakeWhile(f)
  975. }
  976. func ObservableTakeWhileMaybeOK(o core.Observable) core.Observable {
  977. return o.TakeWhile(func(obj core.Object) bool {
  978. var _, ok = core.UnwrapMaybe(obj)
  979. return ok
  980. }).Map(func(obj core.Object) core.Object {
  981. var v, ok = core.UnwrapMaybe(obj)
  982. if !(ok) { panic("something went wrong") }
  983. return v
  984. })
  985. }
  986. func ObservableTakeUntil(o core.Observable, stop core.Observable) core.Observable {
  987. return o.TakeUntil(stop)
  988. }
  989. func ObservableCount(o core.Observable) core.Observable {
  990. return o.Count()
  991. }
  992. func ObservableCollect(o core.Observable) core.Observable {
  993. return o.Collect()
  994. }
  995. func ObservableBufferTime(o core.Observable, ms int) core.Observable {
  996. return o.BufferTime(ms)
  997. }
  998. func ObservablePairwise(o core.Observable) core.Observable {
  999. return o.Pairwise()
  1000. }
  1001. func ObservableBufferCount(o core.Observable, n int) core.Observable {
  1002. return o.BufferCount(n)
  1003. }
  1004. func ObservableMap(o core.Observable, f func(core.Object)(core.Object)) core.Observable {
  1005. return o.Map(f)
  1006. }
  1007. func ObservableMapTo(o core.Observable, v core.Object) core.Observable {
  1008. return o.MapTo(v)
  1009. }
  1010. func ObservableFilter(o core.Observable, f func(core.Object)(bool)) core.Observable {
  1011. return o.Filter(f)
  1012. }
  1013. func ObservableScan(o core.Observable, init core.Object, f func(core.Object,core.Object)(core.Object)) core.Observable {
  1014. return o.Scan(init, f)
  1015. }
  1016. func ObservableReduce(o core.Observable, init core.Object, f func(core.Object,core.Object)(core.Object)) core.Observable {
  1017. return o.Reduce(init, f)
  1018. }
  1019. func ObservableCombineLatest(o core.Observable, another core.Observable) core.Observable {
  1020. return o.CombineLatest(another)
  1021. }
  1022. func ListObservableCombineLatest(l ([] core.Observable)) core.Observable {
  1023. return core.CombineLatest(l...)
  1024. }
  1025. func ObservableAwait(o core.Observable, k func(core.Object)(core.Observable)) core.Observable {
  1026. return o.Await(k)
  1027. }
  1028. func ObservableAwaitNoexcept(o core.Observable, k func(core.Object)(core.Observable), h core.RuntimeHandle) core.Observable {
  1029. return o.AwaitNoexcept(h, k)
  1030. }
  1031. func ObservableThen(o core.Observable, k core.Observable) core.Observable {
  1032. return o.Then(k)
  1033. }
  1034. func ObservableWith(o core.Observable, bg core.Observable, h core.RuntimeHandle) core.Observable {
  1035. return o.With(bg, core.ErrorLogger(h))
  1036. }
  1037. func ObservableAnd(o core.Observable, bg core.Observable, h core.RuntimeHandle) core.Observable {
  1038. return o.And(bg, core.ErrorLogger(h))
  1039. }
  1040. func ListObservableMerge(l core.List) core.Observable {
  1041. return core.Merge(forEachObservable(l))
  1042. }
  1043. func ObservableMerge(o1 core.Observable, o2 core.Observable) core.Observable {
  1044. return core.Merge(core.YieldObservables(o1, o2))
  1045. }
  1046. func ObservableMergeMap(o core.Observable, f func(core.Object)(core.Observable)) core.Observable {
  1047. return o.MergeMap(f)
  1048. }
  1049. func ListObservableConcat(l core.List) core.Observable {
  1050. return core.Concat(forEachObservable(l))
  1051. }
  1052. func ObservableConcat(o1 core.Observable, o2 core.Observable) core.Observable {
  1053. return core.Concat(core.YieldObservables(o1, o2))
  1054. }
  1055. func ObservableConcatMap(o core.Observable, f func(core.Object)(core.Observable)) core.Observable {
  1056. return o.ConcatMap(f)
  1057. }
  1058. func ObservableSwitchMap(o core.Observable, f func(core.Object)(core.Observable)) core.Observable {
  1059. return o.SwitchMap(f)
  1060. }
  1061. func ObservableExhaustMap(o core.Observable, f func(core.Object)(core.Observable)) core.Observable {
  1062. return o.ExhaustMap(f)
  1063. }
  1064. func NumCPU() int {
  1065. return runtime.NumCPU()
  1066. }
  1067. func ListObservableConcurrent(l core.List, n int) core.Observable {
  1068. return core.Concurrent(n, forEachObservable(l))
  1069. }
  1070. func ObservableConcurrentMap(o core.Observable, f func(core.Object)(core.Observable), n int) core.Observable {
  1071. return o.ConcurrentMap(n, f)
  1072. }
  1073. func ListObservableForkJoin(l ([] core.Observable), n int) core.Observable {
  1074. return core.ForkJoin(n, l...)
  1075. }
  1076. func ObservableForkJoin(o core.Observable, another core.Observable, n int) core.Observable {
  1077. return o.ForkJoin(n, another)
  1078. }
  1079. func UUID() core.Observable {
  1080. return core.Observable(func(pub core.DataPublisher) {
  1081. pub.SyncReturn(func() (core.Object, error) {
  1082. var uuid = qt.UUID()
  1083. return core.ObjString(uuid), nil
  1084. })
  1085. })
  1086. }
  1087. func Random(supremum *big.Int, h core.RuntimeHandle) core.Observable {
  1088. return core.RandBigInt(supremum, h)
  1089. }
  1090. func Shuffle(l core.List, h core.RuntimeHandle) core.Observable {
  1091. return core.Rand(h, func(r *rand.Rand) core.Object {
  1092. var nodes = make([] core.ListNode, 0)
  1093. l.ForEach(func(value core.Object) {
  1094. nodes = append(nodes, core.ListNode {
  1095. Value: value,
  1096. })
  1097. })
  1098. r.Shuffle(len(nodes), func(i, j int) {
  1099. nodes[i], nodes[j] = nodes[j], nodes[i]
  1100. })
  1101. var shuffled = core.NodesToList(nodes)
  1102. return core.Obj(shuffled)
  1103. })
  1104. }
  1105. func Subject(replay int, items ([] core.Object), h core.RuntimeHandle) core.Observable {
  1106. return core.Observable(func(pub core.DataPublisher) {
  1107. pub.SyncReturn(func() (core.Object, error) {
  1108. var bus = core.CreateSubject(h, replay, items...)
  1109. return core.Obj(bus), nil
  1110. })
  1111. })
  1112. }
  1113. func SubjectObservable(b core.Subject) core.Observable {
  1114. return b.Observe()
  1115. }
  1116. func SubjectPlug(b core.Subject, input core.Observable) core.Observable {
  1117. return b.Plug(input)
  1118. }
  1119. func TimeString(t time.Time) string {
  1120. return t.String()
  1121. }
  1122. func TimeSubtractMillisecond(t time.Time, u time.Time) int {
  1123. return int(t.Sub(u).Milliseconds())
  1124. }
  1125. func ApiGet(endpoint string, rt core.ReflectType, h core.RuntimeHandle) core.Observable {
  1126. var ctx = h.SerializationContext()
  1127. return core.Observable(func(pub core.DataPublisher) {
  1128. go (func() {
  1129. // TODO: send request log to debugger
  1130. var req, err = http.NewRequestWithContext (
  1131. pub.AsyncContext(),
  1132. http.MethodGet, endpoint, nil,
  1133. )
  1134. if err != nil { pub.AsyncThrow(err); return }
  1135. { var res, err = http.DefaultClient.Do(req)
  1136. if err != nil { pub.AsyncThrow(err); return }
  1137. { var binary, err = io.ReadAll(res.Body)
  1138. if err != nil { pub.AsyncThrow(err); return }
  1139. { var obj, err = core.Unmarshal(binary, rt ,ctx)
  1140. if err != nil { pub.AsyncThrow(err); return }
  1141. pub.AsyncReturn(obj) }}}
  1142. })()
  1143. })
  1144. }
  1145. func Arguments(h core.RuntimeHandle) ([] string) {
  1146. return h.ProgramArgs()
  1147. }
  1148. func Environment() ([] string) {
  1149. return os.Environ()
  1150. }
  1151. func FontSize() int {
  1152. return qt.FontSize()
  1153. }
  1154. func ShowInfo(content string, title string) core.Observable {
  1155. return showMessageBox(
  1156. qt.MsgBoxInfo(),
  1157. qt.MsgBoxOK(), qt.MsgBoxOK(),
  1158. title, content,
  1159. func(btn qt.MsgBoxBtn) (core.Object, bool) {
  1160. return nil, (btn == qt.MsgBoxOK())
  1161. },
  1162. )
  1163. }
  1164. func ShowWarning(content string, title string) core.Observable {
  1165. return showMessageBox(
  1166. qt.MsgBoxWarning(),
  1167. qt.MsgBoxOK(), qt.MsgBoxOK(),
  1168. title, content,
  1169. func(btn qt.MsgBoxBtn) (core.Object, bool) {
  1170. return nil, (btn == qt.MsgBoxOK())
  1171. },
  1172. )
  1173. }
  1174. func ShowCritical(content string, title string) core.Observable {
  1175. return showMessageBox(
  1176. qt.MsgBoxCritical(),
  1177. qt.MsgBoxOK(), qt.MsgBoxOK(),
  1178. title, content,
  1179. func(btn qt.MsgBoxBtn) (core.Object, bool) {
  1180. return nil, (btn == qt.MsgBoxOK())
  1181. },
  1182. )
  1183. }
  1184. func ShowYesNo(content string, title string) core.Observable {
  1185. return showMessageBox(
  1186. qt.MsgBoxQuestion(),
  1187. qt.MsgBoxYes().And(qt.MsgBoxNo()),
  1188. qt.MsgBoxYes(),
  1189. title,
  1190. content,
  1191. func(btn qt.MsgBoxBtn) (core.Object, bool) {
  1192. switch btn {
  1193. case qt.MsgBoxYes(): return core.ObjBool(true), true
  1194. case qt.MsgBoxNo(): return core.ObjBool(false), true
  1195. default: return nil, false
  1196. }
  1197. },
  1198. )
  1199. }
  1200. func ShowAbortRetryIgnore(content string, title string) core.Observable {
  1201. return showMessageBox(
  1202. qt.MsgBoxCritical(),
  1203. qt.MsgBoxAbort().And(qt.MsgBoxRetry()).And(qt.MsgBoxIgnore()),
  1204. qt.MsgBoxRetry(),
  1205. title,
  1206. content,
  1207. func(btn qt.MsgBoxBtn) (core.Object, bool) {
  1208. switch btn {
  1209. case qt.MsgBoxRetry(): return core.ToObject(RI_Retry), true
  1210. case qt.MsgBoxIgnore(): return core.ToObject(RI_Ignore), true
  1211. default: return nil, false
  1212. }
  1213. },
  1214. )
  1215. }
  1216. func ShowSaveDiscardCancel(content string, title string) core.Observable {
  1217. return showMessageBox(
  1218. qt.MsgBoxWarning(),
  1219. qt.MsgBoxSave().And(qt.MsgBoxDiscard()).And(qt.MsgBoxCancel()),
  1220. qt.MsgBoxCancel(),
  1221. title,
  1222. content,
  1223. func(btn qt.MsgBoxBtn) (core.Object, bool) {
  1224. switch btn {
  1225. case qt.MsgBoxSave(): return core.ToObject(SD_Save), true
  1226. case qt.MsgBoxDiscard(): return core.ToObject(SD_Discard), true
  1227. default: return nil, false
  1228. }
  1229. },
  1230. )
  1231. }
  1232. type RetryIgnore int
  1233. const (
  1234. RI_Retry RetryIgnore = iota
  1235. RI_Ignore
  1236. )
  1237. type SaveDiscard int
  1238. const (
  1239. SD_Save SaveDiscard = iota
  1240. SD_Discard
  1241. )
  1242. func GetChoice(prompt string, items ([] ComboBoxItem), title string, h core.RuntimeHandle) core.Observable {
  1243. if len(items) == 0 {
  1244. core.Crash(h, core.InvalidArgument, "item list cannot be empty")
  1245. }
  1246. return showComboBoxInputBox(items, title, prompt, h)
  1247. }
  1248. func GetLine(prompt string, initial string, title string) core.Observable {
  1249. return showInputBox(qt.InputText(), false, nil, initial, title, prompt, func(s string, _ int, _ float64) core.Object {
  1250. return core.ObjString(s)
  1251. })
  1252. }
  1253. func GetText(prompt string, initial string, title string) core.Observable {
  1254. return showInputBox(qt.InputText(), true, nil, initial, title, prompt, func(s string, _ int, _ float64) core.Object {
  1255. return core.ObjString(s)
  1256. })
  1257. }
  1258. func GetInt(prompt string, title string) core.Observable {
  1259. return showInputBox(qt.InputInt(), false, nil, nil, title, prompt, func(_ string, i int, _ float64) core.Object {
  1260. return core.ObjInt(i)
  1261. })
  1262. }
  1263. func GetFloat(prompt string, title string) core.Observable {
  1264. return showInputBox(qt.InputDouble(), false, nil, nil, title, prompt, func(_ string, _ int, x float64) core.Object {
  1265. return core.ObjFloat(x)
  1266. })
  1267. }
  1268. func Action(icon Icon, text string, shortcuts ([] string), repeat bool, enable core.Observable, h core.RuntimeHandle) core.Hook {
  1269. return core.MakeHookWithEffect(h, func() (core.Action, core.Observable, func()) {
  1270. var action, delete_ = core.WrapAction(func(ctx qt.Pkg) qt.Action {
  1271. return qt.CreateAction(convertIcon(icon, h), text, shortcuts, repeat, ctx)
  1272. })
  1273. var bind_enable = enable.ConcatMap(func(obj core.Object) core.Observable {
  1274. return core.SetActionEnabled(action, core.GetBool(obj), h)
  1275. })
  1276. return action, bind_enable, delete_
  1277. })
  1278. }
  1279. func ActionTriggers(a core.Action, h core.RuntimeHandle) core.Observable {
  1280. return core.ConnectActionTrigger(a, h)
  1281. }
  1282. type ActionCheckBox_T struct { Checked core.Observable }
  1283. func ActionCheckBox(a core.Action, initial bool, h core.RuntimeHandle) core.Hook {
  1284. return core.ActionCheckBox(a, initial, h, func(checked core.Observable) core.Object {
  1285. return core.ToObject(ActionCheckBox_T { checked })
  1286. })
  1287. }
  1288. type ActionComboBox_T struct { SelectedItem core.Observable }
  1289. func ActionComboBox(items ([] ActionComboBoxItem), h core.RuntimeHandle) core.Hook {
  1290. if len(items) == 0 {
  1291. core.Crash(h, core.InvalidArgument, "item list cannot be empty")
  1292. }
  1293. var adapted = ctn.MapEach(items, adaptActionComboBoxItem)
  1294. return core.ActionComboBox(adapted, h, func(selected_ core.Observable) core.Object {
  1295. var selected = selected_.Map(func(obj core.Object) core.Object {
  1296. var index = core.GetInt(obj)
  1297. return items[index].Value
  1298. })
  1299. return core.ToObject(ActionComboBox_T { selected })
  1300. })
  1301. }
  1302. type MenuBar struct {
  1303. Menus [] Menu
  1304. }
  1305. func convertMenuBar(b MenuBar, h core.RuntimeHandle) qt.MenuBar {
  1306. if len(b.Menus) == 0 {
  1307. return qt.MenuBar {}
  1308. }
  1309. var menu_bar = qt.CreateMenuBar()
  1310. for _, m := range b.Menus {
  1311. menu_bar.AddMenu(convertMenu(m, h))
  1312. }
  1313. return menu_bar
  1314. }
  1315. type ToolBar struct {
  1316. Mode ToolBarMode
  1317. Items [] ToolBarItem
  1318. }
  1319. type ToolBarMode int
  1320. const (
  1321. TBM_IconOnly ToolBarMode = iota
  1322. TBM_TextOnly
  1323. TBM_TextBesideIcon
  1324. TBM_TextUnderIcon
  1325. )
  1326. type ToolBarItem struct {
  1327. pseudounion.Tag
  1328. Menu; Action(core.Action); Separator; Widget(core.Widget); Spacer
  1329. }
  1330. func convertToolBar(b ToolBar, h core.RuntimeHandle) qt.ToolBar {
  1331. if len(b.Items) == 0 {
  1332. return qt.ToolBar {}
  1333. }
  1334. var tool_bar = qt.CreateToolBar(convertToolBarMode(b.Mode))
  1335. for _, item := range b.Items {
  1336. addToolBarItem(item, tool_bar, h)
  1337. }
  1338. return tool_bar
  1339. }
  1340. func convertToolBarMode(m ToolBarMode) qt.ToolButtonStyle {
  1341. switch m {
  1342. case TBM_IconOnly: return qt.ToolButtonIconOnly()
  1343. case TBM_TextOnly: return qt.ToolButtonTextOnly()
  1344. case TBM_TextBesideIcon: return qt.ToolButtonTextBesideIcon()
  1345. case TBM_TextUnderIcon: return qt.ToolButtonTextUnderIcon()
  1346. default:
  1347. panic("impossible branch")
  1348. }
  1349. }
  1350. func addToolBarItem(i ToolBarItem, b qt.ToolBar, h core.RuntimeHandle) {
  1351. switch I := pseudounion.Load(i).(type) {
  1352. case Menu:
  1353. b.AddMenu(convertMenu(I, h))
  1354. case core.Action:
  1355. b.AddAction(I.Deref(h))
  1356. case Separator:
  1357. b.AddSeparator()
  1358. case core.Widget:
  1359. b.AddWidget(I.Deref(h))
  1360. case Spacer:
  1361. b.AddSpacer(I.Width, I.Height, I.Expand)
  1362. default:
  1363. panic("impossible branch")
  1364. }
  1365. }
  1366. func BindContextMenu(w core.Widget, m Menu, h core.RuntimeHandle) core.Observable {
  1367. return core.BindContextMenu(w, convertMenu(m, h), h)
  1368. }
  1369. type Menu struct {
  1370. Icon Icon
  1371. Name string
  1372. Items [] MenuItem
  1373. }
  1374. type MenuItem struct {
  1375. pseudounion.Tag
  1376. Menu; Action(core.Action); Separator
  1377. }
  1378. type Separator struct {}
  1379. func convertMenu(m Menu, h core.RuntimeHandle) qt.Menu {
  1380. var menu = qt.CreateMenu(convertIcon(m.Icon, h), m.Name)
  1381. for _, item := range m.Items {
  1382. addMenuItem(item, menu, h)
  1383. }
  1384. return menu
  1385. }
  1386. func addMenuItem(i MenuItem, m qt.Menu, h core.RuntimeHandle) {
  1387. switch I := pseudounion.Load(i).(type) {
  1388. case Menu:
  1389. m.AddMenu(convertMenu(I, h))
  1390. case core.Action:
  1391. m.AddAction(I.Deref(h))
  1392. case Separator:
  1393. m.AddSeparator()
  1394. default:
  1395. panic("impossible branch")
  1396. }
  1397. }
  1398. func WidgetShowAndActivate(w core.Widget, h core.RuntimeHandle) core.Observable {
  1399. return core.Observable(func(pub core.DataPublisher) {
  1400. pub.SyncReturn(func() (core.Object, error) {
  1401. var W = w.Deref(h)
  1402. W.Show()
  1403. W.MoveToScreenCenter()
  1404. W.ActivateWindow()
  1405. return nil, nil
  1406. })
  1407. })
  1408. }
  1409. func WidgetBindInlineStyleSheet(w core.Widget, o core.Observable, h core.RuntimeHandle) core.Observable {
  1410. return core.BindInlineStyleSheet(w, o, h)
  1411. }
  1412. func WidgetComboBoxSelectedItem(w core.Widget, items ([] ComboBoxItem), h core.RuntimeHandle) core.Observable {
  1413. var signal = core.MakeSignalWithValueGetter("currentIndexChanged(int)", true, func(W qt.Widget) core.Object {
  1414. return core.ObjInt(int(W.GetPropInt32("currentIndex")))
  1415. })
  1416. return signal.Connect(w, h).Map(func(obj core.Object) core.Object {
  1417. var index = core.GetInt(obj)
  1418. return items[index].Value
  1419. })
  1420. }
  1421. func WidgetCreateWidget(layout Layout, margin_x int, margin_y int, policy_x SizePolicy, policy_y SizePolicy, h core.RuntimeHandle) core.Hook {
  1422. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1423. return qt.CreateWidget(convertLayout(layout, h), margin_x, margin_y, convertSizePolicy(policy_x), convertSizePolicy(policy_y), ctx)
  1424. })
  1425. }
  1426. func WidgetCreateScrollArea(scroll Scroll, layout Layout, h core.RuntimeHandle) core.Hook {
  1427. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1428. return qt.CreateScrollArea(convertScroll(scroll), convertLayout(layout, h), ctx).Widget
  1429. })
  1430. }
  1431. func WidgetCreateGroupBox(title string, layout Layout, h core.RuntimeHandle) core.Hook {
  1432. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1433. return qt.CreateGroupBox(title, convertLayout(layout, h), ctx).Widget
  1434. })
  1435. }
  1436. func WidgetCreateSplitter(list ([] core.Widget), h core.RuntimeHandle) core.Hook {
  1437. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1438. var converted = make([] qt.Widget, len(list))
  1439. for i := range list {
  1440. converted[i] = list[i].Deref(h)
  1441. }
  1442. return qt.CreateSplitter(converted, ctx).Widget
  1443. })
  1444. }
  1445. func WidgetCreateMainWindow(menu_bar MenuBar, tool_bar ToolBar, layout Layout, margin_x int, margin_y int, width int, height int, icon Icon, h core.RuntimeHandle) core.Hook {
  1446. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1447. return qt.CreateMainWindow(convertMenuBar(menu_bar, h), convertToolBar(tool_bar, h), convertLayout(layout, h), margin_x, margin_y, width, height, convertIcon(icon, h), ctx).Widget
  1448. })
  1449. }
  1450. func WidgetCreateDialog(layout Layout, margin_x int, margin_y int, width int, height int, icon Icon, h core.RuntimeHandle) core.Hook {
  1451. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1452. return qt.CreateDialog(convertLayout(layout, h), margin_x, margin_y, width, height, convertIcon(icon, h), ctx).Widget
  1453. })
  1454. }
  1455. func WidgetCreateLabel(align Align, selectable bool) core.Hook {
  1456. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1457. return qt.CreateLabel("", convertAlign(align), selectable, ctx).Widget
  1458. })
  1459. }
  1460. func WidgetCreateIconLabel(icon Icon, size int, h core.RuntimeHandle) core.Hook {
  1461. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1462. return qt.CreateIconLabel(convertIcon(icon, h), size, ctx).Widget
  1463. })
  1464. }
  1465. func WidgetCreateElidedLabel() core.Hook {
  1466. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1467. return qt.CreateElidedLabel("", ctx).Widget
  1468. })
  1469. }
  1470. func WidgetCreateTextView(format TextFormat) core.Hook {
  1471. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1472. return qt.CreateTextView("", convertTextFormat(format), ctx).Widget
  1473. })
  1474. }
  1475. func WidgetCreateCheckBox(text string, checked bool) core.Hook {
  1476. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1477. return qt.CreateCheckBox(text, checked, ctx).Widget
  1478. })
  1479. }
  1480. func WidgetCreateComboBox(items ([] ComboBoxItem), h core.RuntimeHandle) core.Hook {
  1481. if len(items) == 0 {
  1482. core.Crash(h, core.InvalidArgument, "item list cannot be empty")
  1483. }
  1484. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1485. var items = ctn.MapEach(items, func(item ComboBoxItem) qt.ComboBoxItem {
  1486. return convertComboBoxItem(item, h)
  1487. })
  1488. return qt.CreateComboBox(items, ctx).Widget
  1489. })
  1490. }
  1491. func WidgetCreatePushButton(icon Icon, text string, tooltip string, h core.RuntimeHandle) core.Hook {
  1492. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1493. return qt.CreatePushButton(convertIcon(icon, h), text, tooltip, ctx).Widget
  1494. })
  1495. }
  1496. func WidgetCreateLineEdit(text string) core.Hook {
  1497. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1498. return qt.CreateLineEdit(text, ctx).Widget
  1499. })
  1500. }
  1501. func WidgetCreatePlainTextEdit(text string) core.Hook {
  1502. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1503. return qt.CreatePlainTextEdit(text, ctx).Widget
  1504. })
  1505. }
  1506. func WidgetCreateSlider(value int, min int, max int) core.Hook {
  1507. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1508. return qt.CreateSlider(min, max, value, ctx).Widget
  1509. })
  1510. }
  1511. func WidgetCreateProgressBar(max int, format string) core.Hook {
  1512. return createWidget(func(ctx qt.Pkg) qt.Widget {
  1513. return qt.CreateProgressBar(format, max, ctx).Widget
  1514. })
  1515. }
  1516. func Connect(s core.Signal, w core.Widget, h core.RuntimeHandle) core.Observable {
  1517. return s.Connect(w, h)
  1518. }
  1519. func Listen(s core.Events, w core.Widget, h core.RuntimeHandle) core.Observable {
  1520. return s.Listen(w, h)
  1521. }
  1522. func SignalToggled() core.Signal {
  1523. return core.MakeSignal("toggled(bool)")
  1524. }
  1525. func SignalClicked() core.Signal {
  1526. return core.MakeSignal("clicked(bool)")
  1527. }
  1528. func SignalTextChanged0() core.Signal {
  1529. return core.MakeSignal("textChanged()")
  1530. }
  1531. func SignalTextChanged1() core.Signal {
  1532. return core.MakeSignal("textChanged(const QString&)")
  1533. }
  1534. func SignalReturnPressed() core.Signal {
  1535. return core.MakeSignal("returnPressed()")
  1536. }
  1537. func SignalRejected() core.Signal {
  1538. return core.MakeSignal("rejected()")
  1539. }
  1540. func SignalValueChanged() core.Signal {
  1541. return core.MakeSignal("valueChanged(int)")
  1542. }
  1543. func EventsClose() core.Events {
  1544. return core.MakeEvents(qt.EventClose(), true)
  1545. }
  1546. func Read(p core.Prop, s core.Signal) core.Signal {
  1547. return p.Read(s)
  1548. }
  1549. func Bind(p core.Prop, o core.Observable, w core.Widget, h core.RuntimeHandle) core.Observable {
  1550. return p.Bind(o, w, h)
  1551. }
  1552. func ClearTextLater(w core.Widget, o core.Observable, h core.RuntimeHandle) core.Observable {
  1553. return o.ConcatMap(func(obj core.Object) core.Observable {
  1554. return core.Observable(func(pub core.DataPublisher) {
  1555. pub.SyncReturn(func() (core.Object, error) {
  1556. w.Deref(h).ClearTextLater()
  1557. return obj, nil
  1558. })
  1559. })
  1560. })
  1561. }
  1562. func PropEnabled() core.Prop {
  1563. return core.MakeProp(core.PropBool, "enabled")
  1564. }
  1565. func PropWindowTitle() core.Prop {
  1566. return core.MakeProp(core.PropString, "windowTitle")
  1567. }
  1568. func PropText() core.Prop {
  1569. return core.MakeProp(core.PropString, "text")
  1570. }
  1571. func PropChecked() core.Prop {
  1572. return core.MakeProp(core.PropBool, "checked")
  1573. }
  1574. func PropPlainText() core.Prop {
  1575. return core.MakeProp(core.PropString, "plainText")
  1576. }
  1577. func PropValue() core.Prop {
  1578. return core.MakeProp(core.PropInt, "value")
  1579. }
  1580. type Switchable_T struct {
  1581. Widget core.Widget
  1582. }
  1583. func Switchable(widgets core.Observable, h core.RuntimeHandle) core.Hook {
  1584. return core.DynamicWidget(widgets, h, func(w core.Widget) core.Object {
  1585. return core.ToObject(Switchable_T { w })
  1586. })
  1587. }
  1588. type Reloadable_T struct {
  1589. Widget core.Widget
  1590. }
  1591. func Reloadable(hooks core.Observable, h core.RuntimeHandle) core.Hook {
  1592. var widgets = hooks.SwitchMap(func(obj core.Object) core.Observable {
  1593. var hook = core.FromObject[core.Hook](obj)
  1594. return hook.Job
  1595. })
  1596. return core.DynamicWidget(widgets, h, func(w core.Widget) core.Object {
  1597. return core.ToObject(Reloadable_T { w })
  1598. })
  1599. }
  1600. type ListView_T struct {
  1601. Widget core.Widget
  1602. Extension core.Observable
  1603. Current core.Observable
  1604. Selection core.Observable
  1605. }
  1606. func ListView(data core.Observable, key func(core.Object)(string), p core.ItemViewProvider, headers ([] HeaderView), stretch int, select_ ItemSelect, h core.RuntimeHandle) core.Hook {
  1607. var config = core.ListViewConfig {
  1608. CreateInterface: func(ctx qt.Pkg) qt.Lwi {
  1609. return qt.LwiCreateFromDefaultListWidget (
  1610. len(headers),
  1611. convertItemSelect(select_),
  1612. getHeaderWidgets(headers, h, ctx),
  1613. stretch,
  1614. ctx,
  1615. )
  1616. },
  1617. ReturnObject: func(w core.Widget, e core.Observable, c core.Observable, s core.Observable) core.Object {
  1618. return core.ToObject(ListView_T {
  1619. Widget: w,
  1620. Extension: e,
  1621. Current: c,
  1622. Selection: s,
  1623. })
  1624. },
  1625. }
  1626. return core.ListView(config, data, key, p, h)
  1627. }
  1628. type ListEditView_T struct {
  1629. Widget core.Widget
  1630. Output core.Observable
  1631. Extension core.Observable
  1632. EditOps core.Subject
  1633. }
  1634. func ListEditView(initial core.List, p core.ItemEditViewProvider, headers ([] HeaderView), stretch int, select_ ItemSelect, h core.RuntimeHandle) core.Hook {
  1635. var config = core.ListEditViewConfig {
  1636. CreateInterface: func(ctx qt.Pkg) qt.Lwi {
  1637. return qt.LwiCreateFromDefaultListWidget (
  1638. len(headers),
  1639. convertItemSelect(select_),
  1640. getHeaderWidgets(headers, h, ctx),
  1641. stretch,
  1642. ctx,
  1643. )
  1644. },
  1645. ReturnObject: func(w core.Widget, o core.Observable, e core.Observable, O core.Subject) core.Object {
  1646. return core.ToObject(ListEditView_T {
  1647. Widget: w,
  1648. Output: o,
  1649. Extension: e,
  1650. EditOps: O,
  1651. })
  1652. },
  1653. }
  1654. return core.ListEditView(config, initial, p, h)
  1655. }
  1656. type ColumnView_T struct {
  1657. Widget core.Widget
  1658. }
  1659. type RowView_T struct {
  1660. Widget core.Widget
  1661. }
  1662. func ColumnView(data core.Observable, key func(core.Object)(string), p0 func(core.Observable,core.ItemInfo)(core.Hook), h core.RuntimeHandle) core.Hook {
  1663. return boxLayoutView(true, data, key, p0, h)
  1664. }
  1665. func RowView(data core.Observable, key func(core.Object)(string), p0 func(core.Observable,core.ItemInfo)(core.Hook), h core.RuntimeHandle) core.Hook {
  1666. return boxLayoutView(false, data, key, p0, h)
  1667. }
  1668. func boxLayoutView(column bool, data core.Observable, key func(core.Object)(string), p0 func(core.Observable,core.ItemInfo)(core.Hook), h core.RuntimeHandle) core.Hook {
  1669. var kind = (func() qt.BoxLayoutListWidgetKind {
  1670. if column { return qt.LwiColumn() } else
  1671. { return qt.LwiRow() }
  1672. })()
  1673. var create_object = func(w core.Widget) core.Object {
  1674. if column { return core.ToObject(ColumnView_T { w }) } else
  1675. { return core.ToObject(RowView_T { w }) }
  1676. }
  1677. var config = core.ListViewConfig {
  1678. CreateInterface: func(ctx qt.Pkg) qt.Lwi {
  1679. return qt.LwiCreateFromBoxLayoutListWidget(kind, ctx)
  1680. },
  1681. ReturnObject: func(w core.Widget, _,_,_ core.Observable) core.Object {
  1682. return create_object(w)
  1683. },
  1684. }
  1685. var p = core.ItemViewProvider(func(item core.Observable, info core.ItemInfo) core.Hook {
  1686. return core.MapHook(p0(item,info), func(wrapper Wrapper) core.ItemView {
  1687. var widgets = pseudounion.Store[core.Widgets](wrapper.Widget)
  1688. return core.ItemView { Widgets: widgets }
  1689. })
  1690. })
  1691. return core.ListView(config, data, key, p, h)
  1692. }
  1693. type Icon struct {
  1694. Name string
  1695. }
  1696. func convertIcon(icon Icon, h core.RuntimeHandle) string {
  1697. var name = icon.Name
  1698. if strings.HasPrefix(name, qt.FileIconNamePrefix) {
  1699. var rel_path = strings.TrimPrefix(name, qt.FileIconNamePrefix)
  1700. var abs_path = filepath.Join(filepath.Dir(h.ProgramPath()), rel_path)
  1701. return (qt.FileIconNamePrefix + abs_path)
  1702. } else {
  1703. return name
  1704. }
  1705. }
  1706. type SizePolicy int
  1707. const (
  1708. SP_Rigid SizePolicy = iota
  1709. SP_Controlled
  1710. SP_Incompressible; SP_IncompressibleExpanding
  1711. SP_Free; SP_FreeExpanding
  1712. SP_Bounded
  1713. )
  1714. func convertSizePolicy(p SizePolicy) qt.SizePolicy {
  1715. switch p {
  1716. case SP_Rigid: return qt.SizePolicyRigid()
  1717. case SP_Controlled: return qt.SizePolicyControlled()
  1718. case SP_Incompressible: return qt.SizePolicyIncompressible()
  1719. case SP_IncompressibleExpanding: return qt.SizePolicyIncompressibleExpanding()
  1720. case SP_Free: return qt.SizePolicyFree()
  1721. case SP_FreeExpanding: return qt.SizePolicyFreeExpanding()
  1722. case SP_Bounded: return qt.SizePolicyBounded()
  1723. default:
  1724. panic("impossible branch")
  1725. }
  1726. }
  1727. type Align int
  1728. const (
  1729. A_Default Align = iota
  1730. A_Center
  1731. A_Left; A_Right; A_Top; A_Bottom
  1732. A_LeftTop; A_LeftBottom; A_RightTop; A_RightBottom
  1733. )
  1734. func convertAlign(a Align) qt.Alignment {
  1735. switch a {
  1736. case A_Default: return qt.AlignDefault()
  1737. case A_Center: return qt.AlignHCenter().And(qt.AlignVCenter())
  1738. case A_Left: return qt.AlignLeft().And(qt.AlignVCenter())
  1739. case A_Right: return qt.AlignRight().And(qt.AlignVCenter())
  1740. case A_Top: return qt.AlignTop().And(qt.AlignHCenter())
  1741. case A_Bottom: return qt.AlignBottom().And(qt.AlignHCenter())
  1742. case A_LeftTop: return qt.AlignLeft().And(qt.AlignTop())
  1743. case A_LeftBottom: return qt.AlignLeft().And(qt.AlignBottom())
  1744. case A_RightTop: return qt.AlignRight().And(qt.AlignTop())
  1745. case A_RightBottom: return qt.AlignRight().And(qt.AlignBottom())
  1746. default:
  1747. panic("impossible branch")
  1748. }
  1749. }
  1750. type Scroll int
  1751. const (
  1752. S_BothDirection Scroll = iota
  1753. S_VerticalOnly
  1754. S_HorizontalOnly
  1755. )
  1756. func convertScroll(s Scroll) qt.ScrollDirection {
  1757. switch s {
  1758. case S_BothDirection: return qt.ScrollBothDirection()
  1759. case S_VerticalOnly: return qt.ScrollVerticalOnly()
  1760. case S_HorizontalOnly: return qt.ScrollHorizontalOnly()
  1761. default:
  1762. panic("impossible branch")
  1763. }
  1764. }
  1765. type TextFormat int
  1766. const (
  1767. TF_Plain TextFormat = iota
  1768. TF_Html
  1769. TF_Markdown
  1770. )
  1771. func convertTextFormat(f TextFormat) qt.TextFormat {
  1772. switch f {
  1773. case TF_Plain: return qt.TextFormatPlain()
  1774. case TF_Html: return qt.TextFormatHtml()
  1775. case TF_Markdown: return qt.TextFormatMarkdown()
  1776. default:
  1777. panic("impossible branch")
  1778. }
  1779. }
  1780. type Layout struct {
  1781. pseudounion.Tag
  1782. Row; Column; Grid
  1783. }
  1784. type Row struct { Items ([] LayoutItem); Spacing int }
  1785. type Column struct { Items ([] LayoutItem); Spacing int }
  1786. type Grid struct { Spans ([] Span); RowSpacing int; ColumnSpacing int }
  1787. type Span struct {
  1788. Item LayoutItem
  1789. Row int; Column int; RowSpan int; ColumnSpan int; Align Align
  1790. }
  1791. type LayoutItem struct {
  1792. pseudounion.Tag
  1793. Layout; Widget(core.Widget); Spacer; String(string)
  1794. }
  1795. type Spacer struct { Width int; Height int; Expand bool }
  1796. type Wrapper struct { Widget core.Widget }
  1797. func convertLayout(l Layout, h core.RuntimeHandle) qt.Layout {
  1798. var q_span qt.GridSpan
  1799. var q_align = qt.AlignDefault()
  1800. switch L := pseudounion.Load(l).(type) {
  1801. case Row:
  1802. var layout = qt.CreateLayoutRow(L.Spacing)
  1803. for _, item := range L.Items {
  1804. addLayoutItem(item, layout, q_span, q_align, h)
  1805. }
  1806. return layout
  1807. case Column:
  1808. var layout = qt.CreateLayoutColumn(L.Spacing)
  1809. for _, item := range L.Items {
  1810. addLayoutItem(item, layout, q_span, q_align, h)
  1811. }
  1812. return layout
  1813. case Grid:
  1814. var layout = qt.CreateLayoutGrid(L.RowSpacing, L.ColumnSpacing)
  1815. for _, span := range L.Spans {
  1816. var item = span.Item
  1817. q_span.Row = span.Row
  1818. q_span.Column = span.Column
  1819. q_span.RowSpan = span.RowSpan
  1820. q_span.ColumnSpan = span.ColumnSpan
  1821. q_align = convertAlign(span.Align)
  1822. addLayoutItem(item, layout, q_span, q_align, h)
  1823. }
  1824. return layout
  1825. default:
  1826. panic("impossible branch")
  1827. }
  1828. }
  1829. func addLayoutItem(i LayoutItem, l qt.Layout, span qt.GridSpan, align qt.Alignment, h core.RuntimeHandle) {
  1830. switch I := pseudounion.Load(i).(type) {
  1831. case Layout:
  1832. l.AddLayout(convertLayout(I, h), span, align)
  1833. case Spacer:
  1834. l.AddSpacer(I.Width, I.Height, I.Expand, span, align)
  1835. case string:
  1836. l.AddLabel(I, span, align)
  1837. case core.Widget:
  1838. l.AddWidget(I.Deref(h), span, align)
  1839. default:
  1840. panic("impossible branch")
  1841. }
  1842. }
  1843. type ComboBoxItem struct {
  1844. Icon Icon; Name string; Value core.Object; Selected bool
  1845. }
  1846. func convertComboBoxItem(item ComboBoxItem, h core.RuntimeHandle) qt.ComboBoxItem {
  1847. return qt.ComboBoxItem {
  1848. Icon: convertIcon(item.Icon, h),
  1849. Name: item.Name,
  1850. Selected: item.Selected,
  1851. }
  1852. }
  1853. type ActionComboBoxItem struct {
  1854. Action core.Action; Value core.Object; Selected bool
  1855. }
  1856. func adaptActionComboBoxItem(item ActionComboBoxItem) core.ActionComboBoxItem {
  1857. return core.ActionComboBoxItem {
  1858. Action: item.Action,
  1859. Selected: item.Selected,
  1860. }
  1861. }
  1862. type HeaderView struct {
  1863. pseudounion.Tag
  1864. String string; Widget core.Widget
  1865. }
  1866. func getHeaderWidgets(headers ([] HeaderView), h core.RuntimeHandle, ctx qt.Pkg) ([] qt.Widget) {
  1867. return ctn.MapEach(headers, func(v HeaderView) qt.Widget {
  1868. switch V := pseudounion.Load(v).(type) {
  1869. case string:
  1870. var label = qt.CreateLabelLite(V, ctx)
  1871. var spacing = 0
  1872. var margin_x, margin_y = 6, 4
  1873. var policy_x, policy_y = qt.SizePolicyFree(), qt.SizePolicyFree()
  1874. var row = qt.CreateLayoutRow(spacing)
  1875. row.AddWidget(label.Widget, qt.GridSpan{}, qt.AlignDefault())
  1876. return qt.CreateWidget(row, margin_x, margin_y, policy_x, policy_y, ctx)
  1877. case core.Widget:
  1878. return V.Deref(h)
  1879. default:
  1880. panic("impossible branch")
  1881. }
  1882. })
  1883. }
  1884. type ItemSelect int
  1885. const (
  1886. IS_None ItemSelect = iota
  1887. IS_Single
  1888. IS_Multiple
  1889. IS_MaybeMultiple
  1890. )
  1891. func convertItemSelect(m ItemSelect) qt.ItemSelectionMode {
  1892. switch m {
  1893. case IS_None: return qt.ItemNoSelection()
  1894. case IS_Single: return qt.ItemSingleSelection()
  1895. case IS_Multiple: return qt.ItemMultiSelection()
  1896. case IS_MaybeMultiple: return qt.ItemExtendedSelection()
  1897. default:
  1898. panic("impossible branch")
  1899. }
  1900. }
  1901. func assumeValidRegexp(pattern string) *regexp.Regexp {
  1902. var value, err = regexp.Compile(pattern)
  1903. if err != nil { panic("something went wrong") }
  1904. return value
  1905. }
  1906. func forEachObservable(l core.List) func(func(core.Observable)) {
  1907. return func(yield func(core.Observable)) {
  1908. l.ForEach(func(item core.Object) {
  1909. yield(core.GetObservable(item))
  1910. })
  1911. }
  1912. }
  1913. func createWidget(k func(qt.Pkg)(qt.Widget)) core.Hook {
  1914. return core.MakeHook(func() (core.Widget, func()) {
  1915. return core.WrapWidget(k)
  1916. })
  1917. }
  1918. func showComboBoxInputBox(items ([] ComboBoxItem), title string, prompt string, h core.RuntimeHandle) core.Observable {
  1919. if len(items) == 0 {
  1920. panic("invalid argument")
  1921. }
  1922. return core.Observable(func(pub core.DataPublisher) {
  1923. var items_ = ctn.MapEach(items, func(item ComboBoxItem) qt.ComboBoxItem {
  1924. return convertComboBoxItem(item, h)
  1925. })
  1926. var dialog = qt.CreateComboBoxDialog(items_, title, prompt)
  1927. dialog.Consume(func(index int, ok bool) {
  1928. var yield, complete = pub.AsyncGenerate(); defer complete()
  1929. if ok {
  1930. yield(items[index].Value)
  1931. }
  1932. })
  1933. })
  1934. }
  1935. func showInputBox(mode qt.InputDialogMode, multilineText bool, choiceItems ([] string), value interface{}, title string, prompt string, f func(string,int,float64)(core.Object)) core.Observable {
  1936. return core.Observable(func(pub core.DataPublisher) {
  1937. var dialog = qt.CreateInputDialog(mode, value, title, prompt)
  1938. if multilineText {
  1939. dialog.UseMultilineText()
  1940. }
  1941. if len(choiceItems) > 0 {
  1942. dialog.UseChoiceItems(choiceItems)
  1943. }
  1944. dialog.Consume(func(s string, i int, x float64, ok bool) {
  1945. var yield, complete = pub.AsyncGenerate(); defer complete()
  1946. if ok {
  1947. yield(f(s,i,x))
  1948. }
  1949. })
  1950. })
  1951. }
  1952. func showMessageBox(icon qt.MsgBoxIcon, buttons qt.MsgBoxBtn, default_ qt.MsgBoxBtn, title string, content string, f func(qt.MsgBoxBtn)(core.Object,bool)) core.Observable {
  1953. return core.Observable(func(pub core.DataPublisher) {
  1954. var msgbox = qt.CreateMessageBox(icon, buttons, title, content)
  1955. msgbox.SetDefaultButton(default_)
  1956. msgbox.Consume(func(btn qt.MsgBoxBtn) {
  1957. var yield, complete = pub.AsyncGenerate(); defer complete()
  1958. if obj, ok := f(btn); ok {
  1959. yield(obj)
  1960. }
  1961. })
  1962. })
  1963. }