uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 420
Obunachilar
Ma'lumot yo'q24 soatlar
+27 kunlar
-230 kunlar
Postlar arxiv
ToCode
1 420
# ืฉืœื•ืฉ ืกื™ื‘ื•ืช ืœื‘ื—ื•ืจ ื‘ Tauri ืœื‘ื ื™ื™ืช ืืคืœื™ืงืฆื™ื™ืช ื” Desktop ื”ื‘ืื” ืฉืœื›ื ื˜ืื•ืจื™ ื”ื•ื ื›ืœื™ ืฉืžืืคืฉืจ ืœื›ืชื•ื‘ ืืคืœื™ืงืฆื™ื™ืช Desktop ื‘ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื•ื•ื‘. ื•ืื ื”ืžืฉืคื˜ ื”ื–ื” ืžื–ื›ื™ืจ ืœื›ื ื›ืœื™ ืื—ืจ ืฉืžืชื—ืจื– ืขื "ืขืคืจื•ืŸ", ื”ื ื” ืฉืœื•ืฉ ืกื™ื‘ื•ืช ืฉื‘ื’ืœืœืŸ ืื ื™ ืžืชื›ื ืŸ ืœื‘ื—ื•ืจ ื‘ื˜ืื•ืจื™ ืœืคืจื•ื™ืงื˜ ื” Desktop ื”ื‘ื ืฉืœื™: 1. ื’ื•ื“ืœ ื”ืงื•ื‘ืฅ - ื™ื™ืฉื•ื ืืœืงื˜ืจื•ืŸ ืคืฉื•ื˜ ื™ืชื—ื™ืœ ื‘ 50 ืžื’ื” ื•ื™ื›ื•ืœ ืœื”ื’ื™ืข ื‘ืงืœื•ืช ืœื›ืžื” ืžืื•ืช. ื˜ืื•ืจื™ ืœื ื›ื•ืœืœ ืืช ื›ืจื•ืžื™ื•ื ื•ืžืฉืชืžืฉ ื‘ Web View ืฉื›ื‘ืจ ืงื™ื™ื ื‘ืžืขืจื›ืช ื”ื”ืคืขืœื”, ืœื›ืŸ ื™ื™ืฉื•ืžื™ื ืคืฉื•ื˜ื™ื ืœื•ืงื—ื™ื ื‘ืกืš ื”ื›ืœ 3-4 ืžื’ื”. 2. ืจืืกื˜ - ื˜ืื•ืจื™ ืžืฉืชืžืฉ ื‘ Rust ื‘ืฉื‘ื™ืœ ืœืชืงืฉืจ ืขื ืžืขืจื›ืช ื”ื”ืคืขืœื” ื•ื‘ื ื•ื™ ืขืœ ืชื”ืœื™ืš Rust ืฉืžืคืขื™ืœ ืืช ื” Web View ืฉืœ ืžืขืจื›ืช ื”ื”ืคืขืœื” ื•ืฉื ืคื•ืชื— ืืช ืงื‘ืฆื™ ื” HTML/CSS/JS ืฉืœื›ื. 3. ืื‘ื˜ื—ืช ืžื™ื“ืข - ืœื‘ืขื™ื•ืช XSS ื‘ืืคืœื™ืงืฆื™ื•ืช ืืœืงื˜ืจื•ืŸ ื”ื™ื• ื”ืฉืœื›ื•ืช ื”ืจืกื ื™ื•ืช, ื›ื™ื•ื•ืŸ ืฉืงื•ื“ ื” JavaScript ืงื™ื‘ืœ ื’ื™ืฉื” ืžืœืื” ืœืžื—ืฉื‘ (ื“ืจืš APIs ืฉืœ ืืœืงื˜ืจื•ืŸ). ื˜ืื•ืจื™ ืœื•ืงื— ื’ื™ืฉื” ื™ื•ืชืจ ืžืื•ื‘ื˜ื—ืช ื•ื ื•ืชืŸ ืœืงื•ื“ ื” JavaScript ื’ื™ืฉื” ืจืง ืœ APIs ืฉื‘ื—ืจื ื• ื‘ืฆื•ืจื” ืžืคื•ืจืฉืช. ืจื•ืฆื™ื ืœืจืื•ืช ืื™ืš ื”ืืคืœื™ืงืฆื™ื” ืฉืœื›ื ืชืขื‘ื•ื“ ื‘ืชื•ืจ Desktop App? ื”ืžื“ืจื™ืš ื›ืืŸ ืžืกื‘ื™ืจ ืื™ืš ืœื”ื•ืกื™ืฃ ืืช ื˜ืื•ืจื™ ืœื›ืœ Web Application ื›ื“ื™ ืœื”ืคื•ืš ืื•ืชื• ืœืืคืœื™ืงืฆื™ื™ืช Desktop, ื•ืœื“ืขืชื™ ื”ื•ื ืžืงื•ื ื˜ื•ื‘ ืœื”ืชื—ื™ืœ ืœืฉื—ืง ืขื ื”ื›ืœื™: https://tauri.app/v1/guides/getting-started/setup/integrate

ToCode
1 420
# ืฉืชื™ ืžื•ื˜ื™ื‘ืฆื™ื•ืช ื™ืฉ ืžื•ื˜ื™ื‘ืฆื™ื” ืฉื ื•ืฆืจืช ืžืคื—ื“- ืœื“ื•ื’ืžื” ื”ืจื‘ื” ืื ืฉื™ื ืื—ืจื™ ืจืื™ื•ืŸ ืขื‘ื•ื“ื” ื™ื•ืฆืื™ื ืขื ื”ืจื’ืฉื” ืฉืœ "ืื ื™ ืœื ื™ื•ื“ืข ื›ืœื•ื", ื•ืื– ื›ืžื• ืžืงื‘ืœื™ื ื–ืจื™ืงืช ืžืจืฅ ืœืœืžื•ื“ ื›ืžื” ืฉื™ื•ืชืจ ื›ื“ื™ ืœื‘ื•ื ืžื•ื›ื ื™ื ืœืจืื™ื•ืŸ ื”ื‘ื. ื”ื‘ืขื™ื” ืฉื–ืจื™ืงืช ื”ืžืจืฅ ื”ื–ืืช ืœื ืžื—ื–ื™ืงื” ืžืขืžื“ ื”ืจื‘ื” ื–ืžืŸ. ืžื•ื˜ื™ื‘ืฆื™ื” ืฉื ื•ื‘ืขืช ืžืคื—ื“ ื ื’ืžืจืช ื›ืฉื”ืคื—ื“ ื ื’ืžืจ, ื•ืคื—ื“ ื”ื•ื ืจื’ืฉ ื–ืžื ื™. (ื›ืฉื”ืคื—ื“ ื”ื•ืคืš ืœื›ืจื•ื ื™ ื”ื•ื ื›ื‘ืจ ื ืงืจื ื—ืจื“ื”, ื•ื—ืจื“ื” ืœื ืžื ื™ืขื” ืืฃ ืื—ื“ ืœืคืขื•ืœื”). ื”ืกื•ื’ ื”ืฉื ื™ ืฉืœ ืžื•ื˜ื™ื‘ืฆื™ื” ื ื•ืฆืจ ืžื”ืฉืจืื” (Inspiration)- ืื ืฉื™ื ื›ืžื•ื ื• ืขื•ืฉื™ื ื“ื‘ืจื™ื ื‘ืฆื•ืจื” ื›ื–ืืช. ื”ื‘ื—ื™ืจื” ืฉืœ ืžืชื›ื ืชื™ื ืจื‘ื™ื ืœืœืžื•ื“ ื˜ื›ื ื•ืœื•ื’ื™ื” ื—ื“ืฉื” ื›ื™ "ื–ื” ืžืขื ื™ื™ืŸ" ืื• "ื–ื” ื›ืœื™ ืฉื—ืฉื•ื‘ ืœื”ื›ื™ืจ" ื”ื™ื ืกื•ื’ ื›ื–ื” ืฉืœ ืžื•ื˜ื™ื‘ืฆื™ื”. ืืฃ ืื—ื“ ืœื ื™ืคื˜ืจ ืื•ืชืš ืื ืœื ืชืœืžื“ Web Assembly, ืื‘ืœ ื”ืจื‘ื” ืžืชื›ื ืชื™ ื•ื•ื‘ ื›ื‘ืจ ืจื•ืื™ื ืืช ื”ืคื•ื˜ื ืฆื™ืืœ ื•ืžืชื—ื™ืœื™ื ืœืœืžื•ื“ ืืช ื”ื˜ื›ื ื•ืœื•ื’ื™ื”. ืฉื ื™ ื”ืกื•ื’ื™ื ื—ืฉื•ื‘ื™ื ืื‘ืœ ืจืง ืืช ื”ืกื•ื’ ื”ืฉื ื™ ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื—ืคืฉ ื‘ืื•ืคืŸ ืืงื˜ื™ื‘ื™. ื›ืฉืืชื ืจื•ืฆื™ื ืœื”ืชืงื“ื, ืฉื•ื•ื” ืœื”ืชืืžืฅ ื•ืœืžืฆื•ื ื”ืฉืจืื” ื˜ื•ื‘ ื™ื•ืชืจ.

ToCode
1 420
import textReducer from './slices/text';
import saveForLaterReducer from './slices/save_for_later';
import { actions } from './slices/save_for_later';
import { actions as textActions } from './slices/text';

export const store = configureStore({
  reducer: {
    text: textReducer,
    saveForLater: saveForLaterReducer,
  },
})

setTimeout(() => {
  store.dispatch(actions.enqueue(textActions.change("New text from server")));
}, 5000);

// Infer the `RootState` and `AppDispatch` types from the store itself
export type RootState = ReturnType<typeof store.getState>
// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}
export type AppDispatch = typeof store.dispatch
ื‘ืฉื‘ื™ืœ ื”ื“ื•ื’ืžื” ื‘ืžืงื•ื ืœื™ืฆื•ืจ Web Socket ื‘ืกืš ื”ื›ืœ ื”ืคืขืœืชื™ Timer, ืื‘ืœ ื‘ืชื•ื›ื ื™ืช ืืžื™ืชื™ืช ื” setTimeout ื™ื•ื—ืœืฃ ื‘ Web Socket. ื”ื—ืœืง ื”ืื—ืจื•ืŸ ื‘ืคืื–ืœ ื”ื•ื ื”ืงื•ื‘ืฅ App.tsx ืฉืžืฆื™ื’ ืืช ื”ืžืžืฉืง. ื‘ืžืžืฉืง ืฉืœื™ ื™ืฉ ื‘ืกืš ื”ื›ืœ ืชื™ื‘ืช ื˜ืงืกื˜ ืฉืžืฉืชืžืฉ ื™ื›ื•ืœ ืœืฉื ื•ืช ื‘ื” ืืช ื”ื˜ืงืกื˜:
import './App.css'
import { useSelector, useDispatch } from 'react-redux'
import { RootState, AppDispatch } from './redux/store';
import { actions } from './redux/slices/text';
import { runPending } from './redux/slices/run_pending_thunk';
const useApplicationDispatch: () => AppDispatch = useDispatch;

function App() {
  const dispatch = useApplicationDispatch();
  const text = useSelector((state: RootState) => state.text.value);
  const hasPendingActions = useSelector((state: RootState) => state.saveForLater.pending.length > 0);

  const sync = () => {
    dispatch(runPending());
  }

  return (
    <div className="App">
      {hasPendingActions && (
      <p>
        New text from server available.
        <button onClick={sync}>Click To Sync</button>
      </p>)}
      <input type="text" value={text} onChange={(e) => dispatch(actions.change(e.target.value))} />
    </div>
  )
}

export default App
ื›ืฉื™ืฉ Actions ื‘ืชื•ืจ ื™ื•ืคื™ืข ืžืฉืคื˜ ืฉืื•ืžืจ ืฉื™ืฉ ืžื™ื“ืข ื—ื“ืฉ ืžื”ืฉืจืช ื•ื›ืคืชื•ืจ ืกื™ื ื›ืจื•ืŸ. ืœื—ื™ืฆื” ืขืœ ื”ื›ืคืชื•ืจ ืชืคืขื™ืœ ืืช ื” thunk ืฉื™ืขืฉื” dispatch ืœื›ืœ ื” actions ื‘ืชื•ืจ ื•ื™ืžื—ืง ืื•ืชื. ื .ื‘. ื”ืจื‘ื” ืคืขืžื™ื ืœื ื ืจืฆื” ืœืฉืžื•ืจ ืืช ื›ืœ ื” Actions ืžื”ืฉืจืช ืืœื ืจืง ืืช ื” Action ื”ืื—ืจื•ืŸ ืฉื”ื’ื™ืข ืžืกื•ื’ ืžืกื•ื™ื, ื›ื™ Action ื—ื“ืฉ ื™ื•ืชืจ ื”ื•ืคืš ืืช ืืœื” ืฉืœืคื ื™ื• ืœืœื ืจืœื•ื•ื ื˜ื™ื™ื. ืœื•ื’ื™ืงื” ื›ื–ืืช ืชื™ื›ืชื‘ ื‘ืชื•ืš ื” saveForLater Reducer ื‘ืคื•ื ืงืฆื™ื” enqueue:
enqueue(state, action: PayloadAction<Action>) {
  state.pending.push(action.payload);
}
ืคื•ื ืงืฆื™ื” ื–ื• ืชื•ื›ืœ ืœื‘ื“ื•ืง ืื ื” Action ืฉื”ื’ื™ืข ืžื™ื™ืชืจ Action-ื™ื ื™ืฉื ื™ื ื™ื•ืชืจ ื•ืœืขื“ื›ืŸ ืืช ื”ืžืขืจืš.

ToCode
1 420
# ืขื™ื“ื›ื•ืŸ ืืคืœื™ืงืฆื™ื™ืช ืจื™ืืงื˜ ืื—ืจื™ ืงื‘ืœืช ืื™ืจื•ืข ืžื”ืฉืจืช ืžืขืจื›ื•ืช ื•ื•ื‘ ืžืกื•ืจืชื™ื•ืช ื”ื™ื• ืฆืจื™ื›ื•ืช ืœื”ืชืžื•ื“ื“ ืจืง ืขื ืื™ืจื•ืขื™ื ืฉืžื’ื™ืขื™ื ืžื”ืžืฉืชืžืฉ ืฉืขื›ืฉื™ื• ื’ื•ืœืฉ ื‘ืืชืจ. ื‘ืขื•ืœื ื”ืžื•ื“ืจื ื™ ื•ื”ืžืกื•ื›ื ืจืŸ ืฉืœื ื•, ืžืขืจื›ื•ืช ื•ื•ื‘ ื›ื‘ืจ ืฆืจื™ื›ื•ืช ืœื”ืชืžื•ื“ื“ ื’ื ืขื ืคืขื•ืœื•ืช ืžืฉืชืžืฉ ื•ื’ื ืขื ืื™ืจื•ืขื™ื ืฉืžื’ื™ืขื™ื ืžืจื—ื•ืง, ื”ืจื‘ื” ืคืขืžื™ื ืžื”ืฉืจืช, ื•ืœืกื ื›ืจืŸ ื‘ื™ืŸ ื”ืฉื ื™ื™ื. ื‘ื•ืื• ื ืจืื” ืœืžื” ื–ื” ืงืฉื” ื•ื“ืจืš ืื—ืช ืœื”ืชืžื•ื“ื“ ืขื ื”ืืชื’ืจ ื‘ืืคืœื™ืงืฆื™ื™ืช ืจื™ืืงื˜. ## ืœืžื” ื–ื” ืงืฉื” ืžืขื‘ืจ ืœืจืžื” ื”ื˜ื›ื ื™ืช ืฉืœ ืœื”ืฉืื™ืจ Web Socket ืคืชื•ื— ืฉืžืงื‘ืœ ื”ื•ื“ืขื•ืช ืžื”ืฉืจืช, ืืชื’ืจ ื™ื•ืชืจ ื’ื“ื•ืœ ื”ื•ื ื”ืืชื’ืจ ื”ืžืžืฉืงื™: ื‘ืจื’ืข ืฉื™ืฉ ืฉื ื™ ืžืงื•ืจื•ืช ืฉืœ ืื™ืจื•ืขื™ื, ืžืฉืชืžืฉ ื™ื›ื•ืœ ืœื”ืชื‘ืœื‘ืœ ื›ื™ ื“ื‘ืจื™ื ืžืฉืชื ื™ื ืขืœ ื”ืžืกืš ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช. ื’ื•ื’ืœ ื•ื•ืจื“ ืœืžืฉืœ ืคื•ืชืจื™ื ืืช ื”ื‘ืขื™ื” ื‘ืืžืฆืขื•ืช ื”ืฆื’ืช ืกืžื ื™ ืขื›ื‘ืจ ืœื›ืœ ื”ืžืฉืชืžืฉื™ื ืฉืขื›ืฉื™ื• ืขื•ื‘ื“ื™ื ืขืœ ืื•ืชื• ื”ืžืกืžืš. ื›ืฉืื ื™ ืžืขื“ื›ืŸ ืืช ื”ืžืกืžืš ื•ื”ื•ื ืžืฉืชื ื” ืœื™ ืžื•ืœ ื”ืขื™ื ื™ื™ื, ืื ื™ ืžื‘ื™ืŸ ืฉืื ื™ ืขื•ื‘ื“ ืขื ืขื•ื“ ืžื™ืฉื”ื• ื•ื”ืฉื™ื ื•ื™ ืžื’ื™ืข ืžื”ื‘ืŸ ืื“ื ื”ืฉื ื™. ื‘ื’'ื™ืžื™ื™ืœ ื”ื”ืชื ื”ื’ื•ืช ืฉื•ื ื” - ืื ืื ื™ ื›ื•ืชื‘ ืชื’ื•ื‘ื” ืœืžื™ื™ืœ ื•ื‘ืืžืฆืข ื”ื›ืชื™ื‘ื” ืžื’ื™ืขื” ืชื’ื•ื‘ื” ื—ื“ืฉื” ืžืžื™ืฉื”ื• ืื—ืจ ืœืื•ืชื• ืžื™ื™ืœ, ื’'ื™ืžื™ื™ืœ ื™ืกืžืŸ ืœื™ ืฉื™ืฉ ืชื’ื•ื‘ื” ื—ื“ืฉื” ื•ื™ื‘ืงืฉ ืžืžื ื™ ืœืœื—ื•ืฅ ืขืœ ื›ืคืชื•ืจ ื›ื“ื™ ืœื˜ืขื•ืŸ ืื•ืชื”. ื”ื ืžื‘ื™ื ื™ื ืฉืฉื™ื ื•ื™ ื”ืžืกืš ื›ืฉืื ื™ ืœื ืžืฆืคื” ืœืฉื™ื ื•ื™ ืขืœื•ืœ ืœื”ื™ื•ืช ืžื‘ืœื‘ืœ ื•ืœื›ืŸ ื‘ื—ืจื• ืœืžืžืฉ ืืช ื”ืฉื™ื ื•ื™ ืจืง ืื—ืจื™ ืคืขื•ืœื” ื™ื–ื•ืžื”. ## ืื™ืš ืขื•ืฉื™ื ืืช ื–ื” ื‘ืจื™ืืงื˜ ื‘ืืคืœื™ืงืฆื™ื™ืช React ื• Redux, ืžื™ืžื•ืฉ ืžื ื’ื ื•ืŸ ื“ื•ืžื” ื”ื•ื ืžืื•ื“ ืคืฉื•ื˜. ื–ื” ืžื” ืฉื ืขืฉื” ื‘ื’ื“ื•ืœ: 1. ื ื™ืฆื•ืจ Web Socket ืฉื™ืงืฉื™ื‘ ืœื”ื•ื“ืขื•ืช ืžื”ืฉืจืช. 2. ื›ืœ ืคืขื ืฉื ืงื‘ืœ ื”ื•ื“ืขื” ื ืงืจื ืœ dispatch, ืื‘ืœ ื‘ืžืงื•ื ืœืฉืœื•ื— ืืช ื” Action ืฉื”ื™ื” ืžืฉื ื” ืืช ื”ืžืกืš, ื ืฉืœื— Action ืื—ืจ ืฉืขื•ื˜ืฃ ืื•ืชื• ื•ืฉื•ืžืจ ืื•ืชื• ื‘ืชื•ืจ ื”ื•ื“ืขื•ืช. 3. ื”ืืคืœื™ืงืฆื™ื” ื™ื›ื•ืœื” ืœื”ืกืชื›ืœ ืื ื™ืฉ Actions ื‘ืชื•ืจ, ื•ืื ื›ืŸ ืœื”ืฆื™ื’ ืœืžืฉืชืžืฉ ื”ื•ื“ืขื” ืฉืื•ืžืจืช ืฉื™ืฉ ืžื™ื“ืข ื—ื“ืฉ ืžื”ืฉืจืช ื•ืฆืจื™ืš ืœืœื—ื•ืฅ ื›ื“ื™ ืœืจืขื ืŸ. ื‘ืœื—ื™ืฆื” ืขืœ ื”ื›ืคืชื•ืจ ืื ื—ื ื• ืคื•ืชื—ื™ื ืืช ื”ืขื˜ื™ืคื” ื•ืžืคืขื™ืœื™ื dispatch ืขืœ ื›ืœ ื” Actions ืฉืฉืžื•ืจื™ื ื‘ืชื•ืจ. ## ืงื•ื“ ืœื“ื•ื’ืžื” ืื ื™ ื™ื•ืฆืจ ืืคืœื™ืงืฆื™ื™ืช React/Redux ื—ื“ืฉื” ื•ื‘ืชื•ื›ื” ื™ื•ืฆืจ ืฉื ื™ ืกืœื™ื™ืกื™ื. ื”ืกืœื™ื™ืก ื”ืจืืฉื•ืŸ ื™ื—ื–ื™ืง ืืช ื”ืžื™ื“ืข ืฉืœ ื”ืืคืœื™ืงืฆื™ื”, ืื ื™ ืงื•ืจื ืœื• text ื•ื–ื” ื”ืงื•ื“ ืฉืœื•:
// file: src/redux/slices/text
import { createSlice } from '@reduxjs/toolkit'
import type { PayloadAction } from '@reduxjs/toolkit'

export interface TextState {
  value: string
}

const initialState: TextState = {
  value: "Hello World",
}

export const slice = createSlice({
  name: 'text',
  initialState,
  reducers: {
    change(state, action: PayloadAction<string>) {
      state.value = action.payload;
    }
  },
})

// Action creators are generated for each case reducer function
export const actions = slice.actions
export default slice.reducer
ื”ืกืœื™ื™ืก ื”ืฉื ื™ ืื—ืจืื™ ืขืœ ืฉืžื™ืจืช Actions ืฉืžื’ื™ืขื™ื ืžื”ืฉืจืช ื‘ืฆื“ ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” "ืœื”ืจื™ืฅ" ืื•ืชืŸ ืžืื•ื—ืจ ื™ื•ืชืจ. ืื ื™ ืืงืจื ืœื• save_for_later ื•ื–ื” ื”ืงื•ื“ ื‘ืงื•ื‘ืฅ:
// file: src/redux/slices/save_for_later.ts

import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import type { Action } from '@reduxjs/toolkit'
import { clearPending } from './run_pending_thunk';

export interface SaveForLaterState {
  pending: Array<Action>;
}

const initialState: SaveForLaterState = {
  pending: [],
}

export const slice = createSlice({
  name: 'saveForLater',
  initialState,
  reducers: {
    enqueue(state, action: PayloadAction<Action>) {
      state.pending.push(action.payload);
    }
  },
  extraReducers: (build) => {
    build.addCase(clearPending, () => {
      return initialState;
    })
  }
})

// Action creators are generated for each case reducer function
export const actions = slice.actions
export default slice.reducer
ื‘ื ื•ืกืฃ ืื ื™ ื™ื•ืฆืจ ืงื•ื‘ืฅ ืขื Thunk ืฉื™ื”ื™ื” ืื—ืจืื™ ืขืœ ืคืชื™ื—ืช ื›ืœ ื” Actions ืžืชื•ืš ื”ืชื•ืจ ื›ืฉื”ืžืฉืชืžืฉ ืœื•ื—ืฅ ืขืœ ื›ืคืชื•ืจ ื”ืกื™ื ื›ืจื•ืŸ:
// file: src/redux/slices/run_pending_thunk.ts

import { createAction, createAsyncThunk } from "@reduxjs/toolkit";
import { RootState } from "../store";

export const clearPending = createAction('saveForLater/clearPending');

export const runPending = createAsyncThunk<void, void, {state: RootState }>('saveForLater', async (arg: void, { getState, dispatch }) => {
  const pending = getState().saveForLater.pending;
  pending.forEach(dispatch);
  dispatch(clearPending());
});
ื”ืงื•ื‘ืฅ store.ts ื ืจืื” ื›ืš:
// file: src/redux/store.ts

import { configureStore } from '@reduxjs/toolkit'

ToCode
1 420
# ื—ื“ืฉ ื‘ Ruby: ืื•ื‘ื™ืงื˜ ืžื™ื“ืข ืจื•ื‘ื™ 3.2 ื™ืฆืื” ืœื ืžื–ืžืŸ ื•ื›ื•ืœื ืžื“ื‘ืจื™ื ืขืœ ื”ืชืžื™ื›ื” ื‘ Web Assembly ืฉื”ื™ื ื”ื•ืกื™ืคื” - ื•ื–ื” ื‘ืืžืช ืคื™ืฆ'ืจ ืžื“ืœื™ืง ืฉืคื•ืชื— ื”ืจื‘ื” ืืคืฉืจื•ื™ื•ืช, ืื‘ืœ ืœื ื‘ื˜ื•ื— ืื™ืš ื”ื•ื ื”ื•ืœืš ืœืขื–ื•ืจ ืœื™ ื‘ื›ืชื™ื‘ืช ืงื•ื“ ื‘ื™ื•ื ื™ื•ื. ืคื™ืฆ'ืจ ืื—ืจ ืฉื–ื›ื” ืœืงืฆืช ืคื—ื•ืช ื›ื•ืชืจื•ืช ื ืจืื” ืœื™ ื”ืจื‘ื” ื™ื•ืชืจ ืฉื™ืžื•ืฉื™ ื•ืขืœื™ื• ื”ืคื•ืกื˜ ื”ื™ื•ื ื•ื”ื•ื ื ืงืจื ืคืฉื•ื˜ Data. ื›ืŸ ื“ื•ืžื” ืžืื•ื“ ืœ Data Class ืฉืœ ืคื™ื™ืชื•ืŸ. ืื™ืš ื–ื” ืขื•ื‘ื“? ืื– Data ืžืกืคืง ื“ืจืš ืœื”ื’ื“ื™ืจ ืื•ื‘ื™ืงื˜ ืžื™ื“ืข ืฉืœื ื ื™ืชืŸ ืœืฉื™ื ื•ื™, ืืคืฉืจ ืœื”ืฉื•ื•ืช ื‘ื™ืŸ ืื•ื‘ื™ืงื˜ื™ ืžื™ื“ืข ื›ืืœื” ื•ื”ื•ื ืฉื•ืžืจ ืขืœ ื”ื™ื™ืฆื•ื’ ืฉืœื• ื‘ื›ืœ ืžืงื•ื. ื–ื” ืงืฆืช ื“ื•ืžื” ืœ Struct ืื‘ืœ ืขื ืคื—ื•ืช ืืคืฉืจื•ื™ื•ืช ื•ืžืžืฉืง ืงืœ ื™ื•ืชืจ. ืœื“ื•ื’ืžื” ืื ืื ื™ ืจื•ืฆื” ืœื™ื™ืฆื’ ื‘ืžืขืจื›ืช ืžืฉืชืžืฉ ืฉื™ืฉ ืœื• ืžื–ื”ื” ืžืกืคืจื™ ื•ื›ืชื•ื‘ืช ืื™ืžื™ื™ืœ ื›ื“ื™ ืœื”ืขื‘ื™ืจ ื‘ื™ืŸ ื›ืžื” ืžืงื•ืžื•ืช ื‘ืžืขืจื›ืช ืื ื™ ื™ื›ื•ืœ ื‘ืจื•ื‘ื™ 3.2 ืœื›ืชื•ื‘ ืžืฉื”ื• ื›ื–ื”:
User = Data.define(:name, :email)

u1 = User.new(name: 'dave', email: 'dave@e.com')
u2 = User.new(name: 'john', email: 'john@e.com')

puts u1.email

puts "u1 == u2 ? #{u1 == u2}"
ืขื“ ืœืคื” ื”ื›ืœ ืงืœ ื•ื“ื•ืžื” ืœ Struct, ืื‘ืœ ื™ืฉ ืฉื ื™ ื”ื‘ื“ืœื™ื ืžืจื›ื–ื™ื™ื: 1. ืื•ื‘ื™ืงื˜ื™ Data ืœื ืžื’ื“ื™ืจื™ื ืืช to_a ืœื›ืŸ ืื™ ืืคืฉืจ ืœื”ืžื™ืจ Data Object ืœืžืขืจืš ืฉืœ ื›ืœ ื”ืขืจื›ื™ื ืฉื‘ื• (ื›ืžื•ื‘ืŸ ืฉืื™ืŸ ื‘ืขื™ื” ืœื”ืคืขื™ืœ to_h ื›ื“ื™ ืœืงื‘ืœ Hash) 2. ืื•ื‘ื™ืงื˜ื™ Data ืœื ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™, ื•ื›ืš ืฉื•ืžืจื™ื ืขืœื™ื ื• ืฉืœื ื ืขืฉื” ื˜ืขื•ื™ื•ืช ืžื•ื–ืจื•ืช - ืœืžืฉืœ ื ืงื‘ืœ ืื•ื‘ื™ืงื˜ Data ื‘ืื™ื–ื• ืคื•ื ืงืฆื™ื”, ื ืฉื ื” ืื•ืชื• ื•ื›ืš ื ื’ืจื•ื ืœื ื–ืง ื‘ืžืงื•ื ืื—ืจ ื‘ืงื•ื“. ืกืš ื”ื›ืœ ืฉื™ื ื•ื™ ืงื˜ืŸ ืฉื™ื›ื•ืœ ืœื”ืคื•ืš ืงื•ื“ ืจื•ื‘ื™ ืœืงืฆืช ื™ื•ืชืจ ื ืขื™ื.

ToCode
1 420
# ื ื›ืฉืœืชื™ ื‘ืžื‘ื—ืŸ ืคื™ืฉื™ื ื’ (ืื•: ืœืžื” ืœื™ื ืงื™ื ื‘ืžื™ื™ืœ ื–ื” ื›ืœ ื›ืš ืžืกื•ื‘ืš) ืžื™ื™ืงืจื•ืกื•ืคื˜ ื”ื—ืœื™ื˜ื• ืœืขืฉื•ืช ืœื™ ืžื‘ื—ืŸ ืคื™ืฉื™ื ื’ ื•ืฉืœื—ื• ืœื™ ืžื™ื™ืœ ืฉืžืกืคืจ ืœื™ ืฉื—ื‘ืจ ืฉื™ืชืฃ ืื™ืชื™ ื”ืขืจื•ืช ืขืœ ืคืจื•ื™ืงื˜. ื”ื›ืจืชื™ ืืช ืฉื ื”ื—ื‘ืจ ืื‘ืœ ื”ื™ื” ื ืจืื” ืœื™ ืžื•ื–ืจ ืฉื”ื•ื ืžืฉืชืฃ ื”ืขืจื•ืช ืขืœ ืคืจื•ื™ืงื˜ ื›ื™ ืื ื—ื ื• ืœื ืขื•ื‘ื“ื™ื ืขืœ ืืฃ ืคืจื•ื™ืงื˜ ื™ื—ื“ ืขื›ืฉื™ื•, ืœื›ืŸ ืœื—ืฆืชื™ ืขืœ ื”ืงื™ืฉื•ืจ ื›ื“ื™ ืœืจืื•ืช ืขืœ ืžื” ืžื“ื•ื‘ืจ ื•ื”ื’ืขืชื™ ืœื“ืฃ ืฉืžืกื‘ื™ืจ ืฉื–ื” ื”ื™ื” ืจืง ืชืจื’ื™ืœ ืคื™ืฉื™ื ื’ ื•ื‘ืขืฆื ืืฃ ืื—ื“ ืœื ืฉื™ืชืฃ ืื™ืชื™ ื›ืœื•ื. ืœืงื— ื›ืžื” ืจื’ืขื™ื ืœื”ืชืื•ืฉืฉ ืžื”ืื›ื–ื‘ื”, ืื—ืจื™ื”ื ื ื™ืกื™ืชื™ ืœืฉื—ื–ืจ ืื™ืš ื–ื” ืงืจื” ื•ืœืžื” ืœื™ื ืงื™ื ื‘ืžื™ื™ืœ ื–ื” ื›ืœ ื›ืš ืžืกื•ื‘ืš. ื ืชื—ื™ืœ ื‘ืืžืช ื”ืคืฉื•ื˜ื” - ืœื™ื ืงื™ื ื‘ืžื™ื™ืœ ื‘ืืžืช ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืžืกื•ื›ื ื™ื. ืืœื” ื”ื“ื‘ืจื™ื ื”ืจืขื™ื ื”ืžืจื›ื–ื™ื™ื ืฉื™ื›ื•ืœื™ื ืœืงืจื•ืช ื›ืฉืื ื—ื ื• ืœื•ื—ืฆื™ื ืขืœ ืœื™ื ืง ื‘ืœื™ ืœื“ืขืช ืœืืŸ ื”ื•ื ืžื•ื‘ื™ืœ: 1. ื™ืฉ ืื ืฉื™ื ืฉืคืฉื•ื˜ ืจื•ืฆื™ื ืœื“ืขืช ืฉืžื™ืฉื”ื• ืงื•ืจื ืืช ื”ืžื™ื™ืœื™ื ืฉืœื”ื, ื›ื“ื™ ืฉื™ื•ื›ืœื• ืœืฉืœื•ื— ืขื•ื“ ื•ืขื•ื“ ืžื™ื™ืœื™ื. ืœื—ื™ืฆื” ืขืœ ืœื™ื ืง ืžืืฉืจืช ืœืื•ืชื ืื ืฉื™ื ืฉื›ืชื•ื‘ืช ื”ืžื™ื™ืœ ืฉืœื›ื ืืžื™ืชื™ืช ื•ืืชื ืื ืฉื™ื ืืžื™ืชื™ื™ื ืฉืงื•ืจืื™ื ื“ื•ืืจ ื‘ื›ืชื•ื‘ืช ื”ื–ืืช. 2. ื™ืฉ ืืชืจื™ื ืขื ื‘ืื’ื™ื, ื‘ืžื™ื•ื—ื“ ื‘ืื’ื™ื ื›ืžื• XSS ื• CSRF. ื‘ืื’ ื“ืžื™ื•ื ื™ ื›ื–ื” ื™ื›ื•ืœ ืœื’ืจื•ื ืœื›ื ืœืขืฉื•ืช ื‘ืœื™ ื›ื•ื•ื ื” ืคืขื•ืœื” ื‘ืืชืจ ืฉืืชื ื›ื‘ืจ ืžื—ื•ื‘ืจื™ื ืืœื™ื• ืžื˜ืื‘ ืื—ืจ. ืœื“ื•ื’ืžื” ื ื“ืžื™ื™ืŸ ืฉืื ื™ ืžื—ื•ื‘ืจ ืœืคื™ื™ืคืืœ ืฉืœื™ ืžื˜ืื‘ ืื—ืจ, ื•ื‘ืคื™ื™ืคืืœ ื™ืฉ ื›ืคืชื•ืจ ืฉืฉื•ืœื— ื›ืกืฃ ืœื—ื‘ืจ, ืื– ื‘ื’ืœืœ ื‘ืื’ ื‘ืืชืจ ืชื•ืงืฃ ื™ื›ื•ืœ ืœืฉืœื•ื— ืืœื™ื™ ืœื™ื ืง ืœื“ืฃ ืžื™ื•ื—ื“ ื‘ืคื™ื™ืคืืœ ืฉื›ืฉืื ื™ ืื›ื ืก ืืœื™ื• ืืชืจ ืคื™ื™ืคืืœ ื™ื—ืฉื•ื‘ ืฉืœื—ืฆืชื™ ืขืœ ื›ืคืชื•ืจ ืœืฉืœื™ื—ืช ื›ืกืฃ ืœืื•ืชื• ืชื•ืงืฃ. 3. ื™ืฉ ื‘ืื’ื™ื ื‘ื“ืคื“ืคื ื™ื. ื‘ืจื•ืจ ืฉืื ื—ื‘ืจืช ื’ื•ื’ืœ ืื• ืžื™ื™ืงืจื•ืกื•ืคื˜ ื™ืฉืžืขื• ืขืœ ื‘ืื’ ื‘ื“ืคื“ืคืŸ ืฉืœื”ืŸ ื”ืŸ ื™ืคื™ืฆื• ืžื™ื“ ืชื™ืงื•ืŸ, ืื‘ืœ ื”ืจื‘ื” ืคืขืžื™ื ืืชื ืœื ืžืฉื“ืจื’ื™ื ื’ื™ืจืกื” ื‘ื“ืคื“ืคืŸ ืžื™ื“ ื›ืฉื”ื•ื ืžื‘ืงืฉ ืœืฉื“ืจื’, ื•ืขื•ื“ ื™ื•ืชืจ ื”ืจื‘ื” ืคืขืžื™ื ืื ืฉื™ื ืฉื•ืžืจื™ื ื‘ืกื•ื“ ืืช ื”ื‘ืื’ื™ื ื•ืœื ืžืกืคืจื™ื ืขืœื™ื”ื ืœื™ืฆืจื ื™ื•ืช ื”ื“ืคื“ืคื ื™ื. ื‘ืื’ ื‘ื“ืคื“ืคืŸ ื™ื›ื•ืœ ืœื’ืจื•ื ืœื“ืคื“ืคืŸ ืฉืœื›ื ืœื”ืจื™ืฅ ืชื•ื›ื ื™ืช ื–ื“ื•ื ื™ืช ืจืง ื‘ื’ืœืœ ืฉืœื—ืฆืชื ืขืœ ืœื™ื ืง. ื‘ื”ืชื—ืฉื‘ ื‘ื›ืœ ื”ืกื›ื ื•ืช ื”ืืœื” ืืคืฉืจ ื”ื™ื” ืœื“ืžื™ื™ืŸ ืฉื ื”ื™ื” ื™ื•ืชืจ ื–ื”ื™ืจื™ื ื‘ืœื—ื™ืฆื•ืช ืขืœ ืœื™ื ืงื™ื, ืื‘ืœ ื™ืฉ ื‘ืขื™ื” - ืœื—ื™ืฆื” ืขืœ ืœื™ื ืงื™ื ืขื“ื™ื™ืŸ ืžื”ื•ื•ื” ื—ืœืง ืžืจื›ื–ื™ ื‘ืขื‘ื•ื“ื” ื”ื™ื•ื ื™ื•ืžื™ืช ืฉืœื ื• ื•ื‘ืื™ื ื˜ืจืงืฆื™ื” ืขื ื”ืžื—ืฉื‘. ื›ืžื” ื“ื•ื’ืžืื•ืช ืžืชื™ื‘ืช ื”ืžื™ื™ืœ ืฉืœื™: 1. ื”ื–ืžื ื” ืœืฉื™ื—ื•ืช ืขื‘ื•ื“ื” ื‘ื–ื•ื ืื• ื‘ื˜ื™ืžืก ืžื’ื™ืขื•ืช ืœืžื™ื™ืœ, ื•ื ื›ื ืกื™ื ืืœื™ื”ืŸ ื‘ืืžืฆืขื•ืช ืœื—ื™ืฆื” ืขืœ ื”ืœื™ื ืง. 2. ืขื“ื›ื•ื ื™ื ืขืœ PR ื‘ื’ื™ื˜ื”ืื‘ ืžื’ื™ืขื™ื ืœืžื™ื™ืœ ืขื ืœื™ื ืง ืœ PR. 3. ื ื™ื•ื–ืœื˜ืจื™ื ืฉื ืฉืœื—ื™ื ืœืžื™ื™ืœ ืžื’ื™ืขื™ื ืžืœืื™ื ื‘ืœื™ื ืงื™ื, ื•ืื ื—ื ื• ืจื’ื™ืœื™ื ืœืœื—ื•ืฅ ืขืœ ืœื™ื ืงื™ื ืœืžืืžืจื™ื ืฉืžืขื ื™ื™ื ื™ื ืื•ืชื ื•. 4. ืื—ืจื™ ืงื ื™ื” ื‘ืืžื–ื•ืŸ ืชืงื‘ืœื• ืžื™ื™ืœ ืขื ืคืจื˜ื™ ื”ื–ืžื ื” ื•ืืคืฉืจื•ืช ืœืœื—ื•ืฅ ืขืœ ืœื™ื ืง ื›ื“ื™ ืœื”ื™ื›ื ืก ืœื“ืฃ ื”ื”ื–ืžื ื” ืฉื”ืจื’ืข ื‘ื™ืฆืขืชื. 5. ื—ื‘ืจื•ืช ืจื‘ื•ืช ื™ืฉืœื—ื• ื—ืฉื‘ื•ื ื™ืช ื‘ืชื•ืจ ืงื•ื‘ืฅ ืžืฆื•ืจืฃ, ืื‘ืœ ื—ื‘ืจื•ืช ืจื‘ื•ืช ืื—ืจื•ืช ื™ืฉืœื—ื• ืื•ืชื” ื‘ืชื•ืจ ืœื™ื ืง ืœืงื•ื‘ืฅ PDF ื‘ืจืฉืช. ื ืกื• ื™ื•ื ืื—ื“ ืœืจืฉื•ื ืืช ื›ืœ ื”ืœื™ื ืงื™ื ืฉืืชื ืœื•ื—ืฆื™ื ืขืœื™ื”ื ืžื”ืžื™ื™ืœ ื•ืชื’ืœื• ืฉื–ื” ืœื ืžืฉื”ื• ืฉืืคืฉืจ ืœืขืฆื•ืจ. ื‘ื ื•ืกืฃ ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉื›ืชื•ื‘ืช ืžื™ื™ืœ ืฉื•ืœื— ื”ื™ื ืœื ื“ืจืš ืืžื™ื ื” ืœืืžืช ืืช ืžืงื•ืจ ื”ืžื™ื™ืœ, ื•ืžื™ื™ืœื™ื ื–ื“ื•ื ื™ื™ื ื™ื›ื•ืœื™ื ืœื”ื’ื™ืข ื’ื ืžืชื™ื‘ื•ืช ื“ื•ืืจ ืฉืœ ืื ืฉื™ื ืฉืื ื—ื ื• ืกื•ืžื›ื™ื ืขืœื™ื”ื. ื‘ื ื•ืกืฃ ืืคื™ืœื• ืื ื‘ืžื™ื™ืœ ื›ืชื•ื‘ ื‘ืคื™ืจื•ืฉ ื”ืœื™ื ืง, ื”ืœื—ื™ืฆื” ืขืœื™ื• ื™ื›ื•ืœื” ืœื”ื•ื‘ื™ืœ ืœืžืงื•ื ืื—ืจ ืžื–ื” ืฉื›ืชื•ื‘ (ื›ื™ ื”ื˜ืงืกื˜ ืฉืœ ื”ืœื™ื ืง ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื•ื ื” ืžื›ืชื•ื‘ืช ื”ื™ืขื“) ื•ืœื ื ืจืื” ืืช ื–ื” ืขื“ ืฉื ืœื—ืฅ. ืืคื™ืœื• ืื ื ื ืกื” ืœื”ืขืชื™ืง ืืช ื”ืœื™ื ืง ื”ืฆื™ื“ื” ื•ืœืกืจื•ืง ืื•ืชื• ื‘ืขื™ืŸ ืœืคื ื™ ืฉื ื™ื›ื ืก ืœืืชืจ ื–ื” ืœื ืžืกืคื™ืง ื˜ื•ื‘, ื›ื™ ืœื™ื ืง ืœืืชืจ ื–ื“ื•ื ื™ ื™ื›ื•ืœ ืœื”ื™ืจืื•ืช ื‘ื“ื™ื•ืง ื›ืžื• ืœื™ื ืง ืœืืชืจ ืจื’ื™ืœ, ืื• ืฉื”ืœื™ื ืง ื™ื›ื™ืœ ืฉื’ื™ืืช ื›ืชื™ื‘ ืงื˜ื ื” ืฉื‘ืงืจื™ืื” ืจื’ื™ืœื” ืœื ื ืฉื™ื ืœื‘ ืืœื™ื”. ื•ื›ืžื•ื‘ืŸ ืœื™ื ืงื™ื ื‘ืื™ืžื™ื™ืœ ื”ืจื‘ื” ืคืขืžื™ื ืฉื•ืœื—ื™ื ืืชื›ื ื“ืจืš "ืœื™ื ืง ืžืชื•ื•ืš" ืฉืœ ื—ื‘ืจืช ื”ื“ื™ื•ื•ืจ ื›ื“ื™ ืฉื™ื•ื›ืœื• ืœื“ืขืช ืžื™ ืœื—ืฅ ืขืœ ืื™ื–ื” ืœื™ื ืง. ืคื™ืชืจื•ืŸ? ืื ื™ ืœื ืจื•ืื” ื‘ืื•ืคืง. ื‘ืจืžื” ื”ืคืจืงื˜ื™ืช ื”ืขืฆื•ืช ื”ื ืคื•ืฆื•ืช ืขื“ื™ื™ืŸ ื ื›ื•ื ื•ืช - ืœื ืœืœื—ื•ืฅ ืขืœ ืœื™ื ืงื™ื ืžื–ืจื™ื, ืœื ืœืคืชื•ื— ืžื™ื™ืœ ืžืื ืฉื™ื ืฉืœื ืžื›ื™ืจื™ื ื•ื›ื•', ืื‘ืœ ื‘ืจืžืช ื”ืื‘ื˜ื—ื” ื–ื” ืจื—ื•ืง ืž 100%. ื™ืฉ ื’ื ืœื ืžืขื˜ ืชื•ื›ื ื•ืช ืฉืชืคืงื™ื“ืŸ ืœื–ื”ื•ืช ืคื™ืฉื™ื ื’ ืื• ืœื™ื ืงื™ื ื—ืฉื•ื“ื™ื, ืื‘ืœ ืงืฉื” ืœืจืื•ืช ืืช ืจื•ื‘ื ื• ืขื•ื‘ืจื™ื ืœื”ืชืงื™ืŸ ื•ืœืฉืœื ืขืœ ืคื™ืชืจื•ื ื•ืช ื›ืืœื”. ืคื™ืชืจื•ืŸ ื‘ืจืžืช ืกืคืง ื”ืžื™ื™ืœ ื™ื›ื•ืœ ืœืขื–ื•ืจ ืื‘ืœ ื’ื ื–ื” ืœื ืžื•ืฉืœื ื›ื™ ืœื™ื ืงื™ื ืžื’ื™ืขื™ื ื’ื ื“ืจืš ื”ื•ื•ื˜ืกืืค ืื• ื˜ืœื’ืจื.

ToCode
1 420
[?dir :entry/name ?name]
       [?dir :entry/type :entry-dir]
       (inside ?child ?dir)
       [?child :entry/size ?size]] (d/db conn) rules)

ToCode
1 420
2. ื™ืฉ ื™ื—ืก ื‘ืžืขืจื›ืช ืฉื ืงืจื inside. ื›ืฉืžืฉื”ื• inside ืžืฉื”ื• ืื—ืจ ื–ื” ืื•ืžืจ ืฉื”ื•ื belongs-to ื”ื“ื‘ืจ ื”ืื—ืจ, ืื• ืฉื” parent ืฉืœื• ื”ื•ื inside ื”ื“ื‘ืจ ื”ืื—ืจ. ื•ื›ืŸ ื”ื”ื’ื“ืจื” ืจืงื•ืจืกื™ื‘ื™ืช ื•ื”ื›ืœ ื‘ืกื“ืจ. ืขื›ืฉื™ื• ื”ืฉืื™ืœืชื” ืžืฉืชืžืฉืช ื‘ื”ื’ื“ืจื” ื›ื“ื™ ืœืžืฆื•ื ืืช ื›ืœ ื”ืชื™ืงื™ื•ืช ื•ื”ื’ื“ืœื™ื ืฉืœื”ืŸ:
(d/q '[:find ?name (sum ?size)
       :in $ %
       :where
       [?dir :entry/name ?name]
       [?dir :entry/type :entry-dir]
       (inside ?child ?dir)
       [?child :entry/size ?size]] (d/db conn) rules)
       
;; returns [["" 48381165] ["a" 94853] ["d" 24933642] ["e" 584]]
       
ื•ืžื›ืืŸ ืืคืฉืจ ืœืงื—ืช ืืช ื”ืจืฉื™ืžื” ื•ืœื”ืฉืชืžืฉ ื‘ืงื•ื“ ื›ื“ื™ ืœืขื ื•ืช ืขืœ ื”ืฉืืœื•ืช. ืงื•ื“ ื”ืชื•ื›ื ื™ืช ื”ืžืœื ื‘ืงืœื•ื–'ืจ ื”ื•ื:
(ns main
  (:require [datomic.api :as d]))

(def db-uri "datomic:mem://fs99")

(d/create-database db-uri)

(def conn (d/connect db-uri))

(def schema
  [
   {:db/ident :entry/type
    :db/valueType :db.type/ref
    :db/cardinality :db.cardinality/one}
   {:db/ident :entry/name
    :db/valueType :db.type/string
    :db/cardinality :db.cardinality/one}
   {:db/ident :entry/link-to
    :db/valueType :db.type/ref
    :db/cardinality :db.cardinality/one}
   {:db/ident :entry-link}
   {:db/ident :entry-file}
   {:db/ident :entry-dir}
   {:db/ident :entry/parent
    :db/valueType :db.type/ref
    :db/cardinality :db.cardinality/one}
   {:db/ident :entry/size
    :db/valueType :db.type/long
    :db/cardinality :db.cardinality/one}
   {:db/ident :fs/id
    :db/cardinality :db.cardinality/one
    :db/unique :db.unique/identity
    :db/valueType :db.type/string}
   {:db/ident :fs/cwd
    :db/cardinality :db.cardinality/one
    :db/valueType :db.type/ref}
   ])

@(d/transact conn schema)

(defn cwd []
  (let [db (d/db conn)]
    (d/q '[:find ?cwd .
           :where
           [?fs :fs/id "/"]
           [?fs :fs/cwd ?cwd]] db)))

(defn file [name size]
  @(d/transact conn [
                     {:entry/type :entry-file
                      :entry/name name
                      :entry/size size
                      :entry/parent (cwd)}
                     ]))

(defn dir [name]
  @(d/transact conn [
                     {:entry/type :entry-link
                      :entry/parent "d"
                      :entry/name ".."
                      :entry/link-to (cwd)}
                     {:entry/type :entry-link
                      :entry/parent "d"
                      :entry/name "."
                      :entry/link-to "d"}
                     {:db/id "d"
                      :entry/type :entry-dir
                      :entry/name name
                      :entry/parent (cwd)}
                     ]))


(defn cd [name]
  (let [db (d/db conn)
        to (d/q '[:find ?e .
                  :in $ ?cwd ?name
                  :where
                  [?e :entry/name ?name]
                  [?e :entry/parent ?cwd]]
                db
                (cwd) name)
        toe (d/entity db to)
        tod (if (= (:entry/type toe) :entry-link)
              (:db/id (first (filter #(= (:entry/type %1) :entry-dir) (iterate :entry/link-to toe))))
              to)]
    @(d/transact conn [{:fs/id "/"
                        :fs/cwd tod}])))

(def data [
           {:db/id "root" :entry/name "" :entry/type :entry-dir}
           {:fs/id "/" :fs/cwd "root"}
           ])

@(d/transact conn data)

(dir "a")
(file "b.txt" 14848514)
(file "c.dat" 8504156)
(dir "d")
(cd "a")
(dir "e")
(file "f" 29116)
(file "g" 2557)
(file "h.lst" 62596)
(cd "e")
(file "i" 584)
(cd "..")
(cd "..")
(cd "d")
(file "j" 4060174)
(file "d.log" 8033020)
(file "d.ext" 5626152)
(file "k" 7214296)

(d/q '[:find ?name :where
       [?e :entry/type :entry-file]
       [?e :entry/name ?name]] (d/db conn))

(def rules
'[[(belongs-to ?entry ?parent)
   [?entry :entry/parent ?parent]]
  [(inside ?entry ?parent)
   (belongs-to ?entry ?parent)]
  [(inside ?entry ?parent)
   (belongs-to ?entry ?middle)
   (inside ?middle ?parent)]])

(d/q '[:find ?name (sum ?size)
       :in $ %
       :where

ToCode
1 420
[?fs :fs/cwd ?cwd]] db)))
ื•ื”ื ื” ืื™ื ื˜ืจืงืฆื™ื” ืจืืฉื•ื ื” ืขื Datomic. ื”ืชื™ืงื™ื” ื”ื ื•ื›ื—ื™ืช ื ืฉืžืจืช ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื‘ืชื•ืจ ื”ืขืจืš ืฉืœ ืžืืคื™ื™ืŸ :fs/cwd. ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืชื•ืžืš ื‘ืžืกืคืจ ืžืขืจื›ื•ืช ืงื‘ืฆื™ื ื‘ืžืงื‘ื™ืœ ืื‘ืœ ื‘ืชื•ื›ื ื™ืช ืฉืœื™ ื”ืฉืชืžืฉืชื™ ืจืง ื‘ืžืขืจื›ืช ืงื‘ืฆื™ื ืื—ืช ื•ื ืชืชื™ ืœื” ืืช ื”ืžื–ื”ื” /. ื‘ื”ืžืฉืš ื ืฆื˜ืจืš ืœืจืื•ืช ืื™ืš ืœื”ื›ื ื™ืก ืืช ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ื”ื–ื• ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื. ื”ืคื•ื ืงืฆื™ื” ื”ื‘ืื” ื”ื™ื file ื•ื”ื™ื ื™ื•ืฆืจืช ืงื•ื‘ืฅ ื‘ืชื™ืงื™ื” ื”ื ื•ื›ื—ื™ืช:
(defn file [name size]
  @(d/transact conn [
                     {:entry/type :entry-file
                      :entry/name name
                      :entry/size size
                      :entry/parent (cwd)}
                     ]))
ื”ืคืงื•ื“ื” transact ืฉืœ Datomic ืžื’ื“ื™ืจื” ื˜ืจื ื–ืืงืฆื™ื” ื•ื–ื• ื‘ืขืฆื ืขื•ื‘ื“ื” ื—ื“ืฉื” ืฉืื ื™ ืžื›ื ื™ืก ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื - ื”ืขื•ื‘ื“ื” ืฉื™ืฉ ื“ื‘ืจ ื‘ืฉื name, ืฉื” parent ืฉืœื• ื”ื•ื ื”ืชื™ืงื™ื” ื”ื ื•ื›ื—ื™ืช, ืฉื”ื’ื•ื“ืœ ืฉืœื• ื”ื•ื size ื•ืฉื”ืกื•ื’ ืฉืœื• ื”ื•ื :entry-file. ื”ืคื•ื ืงืฆื™ื” ื”ื‘ืื” ื”ื™ื dir ื•ื”ื™ื ืงืฆืช ื™ื•ืชืจ ืžืกื•ื‘ื›ืช ืž file, ื‘ื’ืœืœ ืฉื‘ื›ืœ ืชื™ืงื™ื” ื™ืฉ ืœื ื• ืฉื ื™ ืœื™ื ืงื™ื ืžื™ื•ื—ื“ื™ื - ื”ืงื™ืฉื•ืจ . ืฉืžื—ื‘ืจ ืื•ืชื” ืœืขืฆืžื” ื•ื”ืงื™ืฉื•ืจ .. ืฉืžื—ื‘ืจ ืื•ืชื” ืœืชื™ืงื™ื” ืฉืžืขืœื™ื”:
(defn dir [name]
  @(d/transact conn [
                     {:entry/type :entry-link
                      :entry/parent "d"
                      :entry/name ".."
                      :entry/link-to (cwd)}
                     {:entry/type :entry-link
                      :entry/parent "d"
                      :entry/name "."
                      :entry/link-to "d"}
                     {:db/id "d"
                      :entry/type :entry-dir
                      :entry/name name
                      :entry/parent (cwd)}
                     ]))
ืœื›ืŸ ื”ื˜ืจื ื–ืืงืฆื™ื” ื”ืคืขื ืžืกืคืจืช ืฉืœื•ืฉ ืขื•ื‘ื“ื•ืช ื—ื“ืฉื•ืช: 1. ื™ืฉ ืชื™ืงื™ื” ื‘ืฉื name ื•ื”ื”ื•ืจื” ืฉืœื” ื”ื•ื parent 2. ื™ืฉ ืœื™ื ืง ื‘ืฉื . ื•ื”ื”ื•ืจื” ืฉืœื• ื”ื•ื ื”ืชื™ืงื™ื” ื”ื—ื“ืฉื” ืฉืชื™ื•ื•ืฆืจ. ื”ืœื™ื ืง ืžื•ื‘ื™ืœ ืœืื•ืชื” ืชื™ืงื™ื” ื—ื“ืฉื”. 3. ื™ืฉ ืœื™ื ืง ื‘ืฉื .. ื•ื”ื”ื•ืจื” ืฉืœื• ื”ื•ื ื”ืชื™ืงื™ื” ื”ื—ื“ืฉื” ืฉืชื™ื•ื•ืฆืจ. ื”ืœื™ื ืง ืžื•ื‘ื™ืœ ืœ parent. ื”ื’ื“ืจืช ื”ืžื–ื”ื” d ื‘ืชื•ืš ื”ื˜ืจื ื–ืืงืฆื™ื” ื”ื™ื ืฉืžืืคืฉืจืช ื‘ืงืœื•ืช ืœื›ืžื” ืขื•ื‘ื“ื•ืช ืœื”ืชื™ื—ืก ืœืื•ืชื” ื™ืฉื•ืช. ื•ื”ืคื•ื ืงืฆื™ื” ื”ืžืกื•ื‘ื›ืช ื‘ื™ื•ืชืจ ื‘ืงื•ื“ ื”ื™ื ืคื•ื ืงืฆื™ื™ืช cd. ืžืงื•ืจ ื”ืกื™ื‘ื•ืš ื”ื•ื ื”ืชืžื™ื›ื” ื‘ืœื™ื ืงื™ื, ื›ื™ ืื ืื ื™ ืขื•ืฉื” cd ืœืœื™ื ืง ืื ื™ ืžืฆืคื” ืœื”ื’ื™ืข ืœื“ื‘ืจ ืฉื”ืœื™ื ืง ืžืฆื‘ื™ืข ืืœื™ื•. ื”ืงื•ื“ ื‘ื“ื•ื’ืžื” ืชื•ืžืš ื’ื ื‘ืœื™ื ืง ืฉืžืคื ื” ืœืœื™ื ืง, ืื‘ืœ ื™ื™ื›ืฉืœ ื‘ืฆื•ืจื” ืื•ืžืœืœื” ืขื ืžืขื’ืœื™ื:
(defn cd [name]
  (let [db (d/db conn)
        to (d/q '[:find ?e .
                  :in $ ?cwd ?name
                  :where
                  [?e :entry/name ?name]
                  [?e :entry/parent ?cwd]]
                db
                (cwd) name)
        toe (d/entity db to)
        tod (if (= (:entry/type toe) :entry-link)
              (:db/id (first (filter #(= (:entry/type %1) :entry-dir) (iterate :entry/link-to toe))))
              to)]
    @(d/transact conn [{:fs/id "/"
                        :fs/cwd tod}])))
ื‘ Datomic, ื‘ืฉื‘ื™ืœ ืœืงื—ืช ืžืฉื”ื• ืฉื—ื•ื–ืจ ืž find ื•ืœื—ืคืฉ ืžืืคื™ื™ื ื™ื ื ื•ืกืคื™ื ืฉืœื• ืื ื™ ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” ืฉื ืงืจืืช entity. ื”ืคื•ื ืงืฆื™ื” ืžื—ื–ื™ืจื” ืื•ื‘ื™ืงื˜ ืžื™ื“ืข ืžืœื ืžื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืฉื›ื‘ืจ ื›ื•ืœืœ ื’ื ืืช ื›ืœ ื”ืื•ื‘ื™ืงื˜ื™ื ืฉืžืงื•ืฉืจื™ื ืืœื™ื•, ื•ื›ืš ืืคืฉืจ "ืœื˜ื™ื™ืœ" ื‘ืขืฅ ืขื“ ืฉืžืืคื™ื™ืŸ link-to ืžื‘ื™ื ืื•ืชื™ ืœืชื™ืงื™ื”. ืื—ืจื™ ืฉื”ื’ื“ืจื ื• ืืช ืคื•ืงื ืฆื™ื•ืช ื”ืขื–ืจ ืืคืฉืจ ืœืืชื—ืœ ืืช ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ืขื:
(def data [
           {:db/id "root" :entry/name "" :entry/type :entry-dir}
           {:fs/id "/" :fs/cwd "root"}
           ])

@(d/transact conn data)
ื•ืœื”ืคืขื™ืœ ืืช ื”ืชื•ื›ื ื™ืช. ## ื”ืฆื’ืช ื›ืœ ื”ืชื™ืงื™ื•ืช ื•ื”ื’ื“ืœื™ื ื‘ืฆื•ืจื” ืจืงื•ืจืกื™ื‘ื™ืช ื›ืœ ื”ืขื‘ื•ื“ื” ื”ืงืฉื” ืขื“ ืœืคื” ืžื‘ื™ืื” ืื•ืชื ื• ืœืฉืื™ืœืชื” ื”ืื—ืจื•ื ื” ื•ื”ืžืขื ื™ื™ื ืช ืžื›ื•ืœืŸ. ืื ื™ ืจื•ืฆื” ืœืžืฆื•ื ืืช ื›ืœ ื”ืชื™ืงื™ื•ืช ื•ืœื›ืœ ืชื™ืงื™ื” ืืช ื”ื’ื•ื“ืœ ืฉืœื”, ืฉืžื•ืจื›ื‘ ืžื”ื’ื•ื“ืœ ืฉืœ ื›ืœ ื”ื™ืœื“ื™ื ืฉืœื”. ื‘ืฉื‘ื™ืœ ื–ื” ืื ื™ ืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืœ Datomic ืžื” ื–ื” ื ืงืจื ืฉืžืฉื”ื• ื ืžืฆื ืจืงื•ืจืกื™ื‘ื™ืช ื‘ืชื•ืš ืชื™ืงื™ื”:
(def rules
'[[(belongs-to ?entry ?parent)
   [?entry :entry/parent ?parent]]
  [(inside ?entry ?parent)
   (belongs-to ?entry ?parent)]
  [(inside ?entry ?parent)
   (belongs-to ?entry ?middle)
   (inside ?middle ?parent)]])
ื”ื‘ื™ื˜ื•ื™ rules ืžื™ื™ืฆื’ ืกื˜ ืฉืœ ืดื—ื•ืงื™ืืด ืฉืื™ืชื ืืคืฉืจ ืœื’ื–ื•ืจ ืžื™ื“ืข ื—ื“ืฉ ืžื”ืขื•ื‘ื“ื•ืช ืฉืœื ื•. ืžืฉืžืขื•ืช ื”ื—ื•ืงื™ื ืฉื”ื’ื“ืจืชื™ ื”ื™ื: 1. ื™ืฉ ื™ื—ืก ื‘ืžืขืจื›ืช ืฉื ืงืจื belongs-to. ื›ืฉืžืฉื”ื• belongs-to ืžืฉื”ื• ืื—ืจ ื–ื” ืื•ืžืจ ืฉืžืฉื”ื• ืื—ืจ ื”ื•ื ื” parent ืฉืœ ืžืฉื”ื•.

ToCode
1 420
# ืคื™ืชืจื•ืŸ ืชืจื’ื™ืœ Advent Of Code ื™ื•ื 7 ื‘ืขื–ืจืช Datomic ืœืคื ื™ ื›ืžื” ื™ืžื™ื ืกื™ืคืจืชื™ ื›ืืŸ ืขืœ Datomic, ื‘ืกื™ืก ื ืชื•ื ื™ื ืฉืžืื—ืกืŸ "ืขื•ื‘ื“ื•ืช" ื•ืžืฆื™ืข ืฉืคืช ืฉืื™ืœืชื•ืช ื‘ืฉื Datalog ื›ื“ื™ ืœื—ืคืฉ ืžื™ื“ืข ื•ืžืกืงื ื•ืช ืฉืงืฉื•ืจ ืœืขื•ื‘ื“ื•ืช ืืœื”. ืื—ื“ ื”ืฉื™ืžื•ืฉื™ื ื”ืžื“ืœื™ืงื™ื ื‘ Datomic ื”ื•ื ื”ื™ื›ื•ืœืช ืœื—ืคืฉ ื‘ืฆื•ืจื” ืจืงื•ืจืกื™ื‘ื™ืช ื‘ืžื‘ื ื™ ื ืชื•ื ื™ื ืžืงื•ืฉืจื™ื ื›ืžื• ื’ืจืคื™ื ืื• ืขืฆื™ื. ื‘ื–ื›ื•ืช Datalog, ืฉืื™ืœืชื•ืช ืฉื”ื™ื• ื™ื›ื•ืœื•ืช ืœื”ื™ื•ืช ืžืกื•ื‘ื›ื•ืช ืžืื•ื“ ื‘ SQL ื”ื•ืคื›ื•ืช ืœื›ืžื” ืฉื•ืจื•ืช. ื‘ืคื•ืกื˜ ื–ื” ื ืจืื” ื“ื•ื’ืžื” ืœืื—ืกื•ืŸ ืžื™ื“ืข ืขืœ ืžืขืจื›ืช ืงื‘ืฆื™ื ื‘ Datomic, ื•ืื™ืš ืื—ืกื•ืŸ ื›ื–ื” ืขื•ื–ืจ ืœื ื• ืœื—ืฉื‘ ืžื”ืจ ื’ื“ืœื™ื ื‘ืฆื•ืจื” ืจืงื•ืจืกื™ื‘ื™ืช. ## ื”ืืชื’ืจ ืœืงื—ืชื™ ืืช ื”ืชืจื’ื™ืœ ืฉืคื•ืจืกื ื‘ Advent Of Code Day 7 ื‘ืฉื‘ื™ืœ ื“ื•ื’ืžื” ืœืžืฉื™ืžื” ืขืœ ื’ืจืคื™ื. ื”ืชืจื’ื™ืœ ื‘ื’ื“ื•ืœ ื ื•ืชืŸ ืœื ื• ืžื™ื“ืข ืขืœ ืงื‘ืฆื™ื, ืชื™ืงื™ื•ืช ื•ื’ื“ืœื™ื ื•ืื—ืจื™ ื–ื” ืฉื•ืœื— ืื•ืชื ื• ืœื—ืคืฉ ืชื™ืงื™ื•ืช ื‘ื’ื“ืœื™ื ืžืกื•ื™ืžื™ื. ื”ืžื™ื“ืข ืžื’ื™ืข ื‘ืคื•ืจืžื˜ ื”ื‘ื:
$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k
ืฉื ืจืื” ื›ืžื• ืœืงื•ื— ืžืฉื•ืจืช ืคืงื•ื“ื” ื‘ื™ื•ื ื™ืงืก. ื™ืฉ ืœื ื• ื›ืืŸ ืฉื•ืจื•ืช ืžื›ืžื” ืกื•ื’ื™ื: 1. ืฉื•ืจื•ืช ืฉืžืชื—ื™ืœื•ืช ื‘ื“ื•ืœืจ ืžืกืžื ื•ืช ืฉืคื” ื™ืฉ "ืคืงื•ื“ื”" ื•ืื—ืจื™ื” ื™ื‘ื•ืื• ื”ืฉื•ืจื•ืช ืฉืžืชืื™ืžื•ืช ืœืคืœื˜ ืฉืœื”. ืื—ืจื™ ืคืงื•ื“ืช ls ื ืงื‘ืœ ืืช ืจืฉื™ืžืช ื”ืงื‘ืฆื™ื ื•ื”ืชื™ืงื™ื•ืช ื‘ืชื™ืงื™ื” ื”ื ื•ื›ื—ื™ืช, ืื—ืจื™ ืคืงื•ื“ืช cd ืื™ืŸ ืคืœื˜ ืื‘ืœ ื”ืชื™ืงื™ื” ืชืฉืชื ื”. 2. ืฉื•ืจื•ืช ืฉืžืชื—ื™ืœื•ืช ื‘ืžืกืคืจ ืžืกืžื ื•ืช ืฉื™ืฉ ืงื•ื‘ืฅ ื‘ื’ื•ื“ืœ ืžืกื•ื™ื ื‘ืชื™ืงื™ื” ื”ื ื•ื›ื—ื™ืช. ื”ืžืกืคืจ ื”ื•ื ื”ื’ื•ื“ืœ ื•ื”ื˜ืงืกื˜ ื”ื•ื ืฉื ื”ืงื•ื‘ืฅ. 3. ืฉื•ืจื•ืช ืฉืžืชื—ื™ืœื•ืช ื‘ืžื™ืœื” dir ืื•ืžืจื•ืช ืฉื™ืฉ ืชื™ืงื™ื” ื‘ืฉื ืžืกื•ื™ื ื‘ืชื™ืงื™ื” ื”ื ื•ื›ื—ื™ืช. ืื—ืจื™ ืฉื ืคืขื ื— ืืช ื”ืงืœื˜ ื ืฆื˜ืจืš ืœืขื ื•ืช ืขืœ ืฉืชื™ ืฉืืœื•ืช ืฉืงืฉื•ืจื•ืช ืœื’ื“ืœื™ื: 1. ื ืจืฆื” ืœืžืฆื•ื ืืช ืกื›ื•ื ื”ื’ื“ืœื™ื ื‘ื›ืœ ื”ืชื™ืงื™ื•ืช ืฉื’ื•ื“ืœืŸ ืงื˜ืŸ ืื• ืฉื•ื•ื” ืœ 100000 2. ื ืจืฆื” ืœืžืฆื•ื ืืช ื”ืชื™ืงื™ื” ื”ืงื˜ื ื” ื‘ื™ื•ืชืจ ืฉื’ื•ื“ืœื” ื’ื“ื•ืœ ืž 8381165 ื‘ืฉื‘ื™ืœ ืœื”ืชืžืงื“ ื‘ Datomic ื•ืœื ื‘ืคื™ืขื ื•ื— ืงืœื˜ ืื• ืœื•ืœืื•ืช, ืื ื™ ืืขืฉื” ื›ืžื” ื”ื ื—ื•ืช ื‘ืชืจื’ื™ืœ: ืืช ื”ืงืœื˜ ืื ื™ ืื›ืชื•ื‘ ื™ืฉื™ืจื•ืช ืœืชื•ืš ื”ืชื•ื›ื ื™ืช ื•ืื ื™ ืืกืชืคืง ื‘ืœืžืฆื•ื ืืช ื›ืœ ื”ืชื™ืงื™ื•ืช ื•ืืช ื”ื’ื•ื“ืœ (ื”ืจืงื•ืจืกื™ื‘ื™) ืฉืœ ื›ืœ ืชื™ืงื™ื”, ื›ืœื•ืžืจ ื”ื’ื•ื“ืœ ืฉืœ ื”ืชื™ืงื™ื” ื•ืฉืœ ื›ืœ ื”ืงื‘ืฆื™ื ื•ื”ืชื™ืงื™ื•ืช ืฉื‘ืชื•ื›ื”. ## ืกื›ื™ืžื” ืœื™ื™ืฆื•ื’ ื”ืžื™ื“ืข ื‘ืกื™ืก ื ืชื•ื ื™ื Datomic ืžืฉืชืžืฉ ื‘ืกื›ื™ืžื” ื›ื“ื™ ืœื”ื’ื™ื“ ืื™ื–ื” ืขื•ื‘ื“ื•ืช ืืคืฉืจ ืœื”ื›ื ื™ืก ืœืžืขืจื›ืช. ื”ืกื›ื™ืžื” ืฉืœื™ ื ืจืื™ืช ื›ืš:
(def schema
  [
   {:db/ident :entry/type
    :db/valueType :db.type/ref
    :db/cardinality :db.cardinality/one}
   {:db/ident :entry/name
    :db/valueType :db.type/string
    :db/cardinality :db.cardinality/one}
   {:db/ident :entry/link-to
    :db/valueType :db.type/ref
    :db/cardinality :db.cardinality/one}
   {:db/ident :entry-link}
   {:db/ident :entry-file}
   {:db/ident :entry-dir}
   {:db/ident :entry/parent
    :db/valueType :db.type/ref
    :db/cardinality :db.cardinality/one}
   {:db/ident :entry/size
    :db/valueType :db.type/long
    :db/cardinality :db.cardinality/one}
   {:db/ident :fs/id
    :db/cardinality :db.cardinality/one
    :db/unique :db.unique/identity
    :db/valueType :db.type/string}
   {:db/ident :fs/cwd
    :db/cardinality :db.cardinality/one
    :db/valueType :db.type/ref}
   ])
ื‘ืžืขืจื›ืช ื™ืฉ ืฉื ื™ ืกื•ื’ื™ื ืฉืœ "ื“ื‘ืจื™ื", ืœื“ื‘ืจ ืื—ื“ ืืคืฉืจ ืœืงืจื•ื "ืžืขืจื›ืช ืงื‘ืฆื™ื", ื•ื–ื” ืžืฉื”ื• ืฉืฉื•ืžืจ ืืช ื”ืชื™ืงื™ื” ื”ื ื•ื›ื—ื™ืช. ืœื“ื‘ืจ ื”ืฉื ื™ ืงืจืืชื™ entry ื•ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืงื•ื‘ืฅ, ืชื™ืงื™ื” ืื• ืœื™ื ืง ื‘ืชื•ืš ืžืขืจื›ืช ื”ืงื‘ืฆื™ื. ืœื›ืœ entry ื™ืฉ ืฉื, ื™ืฉ ืืช ื”ืกื•ื’ ืฉืœื• ื•ื™ืฉ parent ืฉื–ื” ื” entry ืฉืžื›ื™ืœ ืื•ืชื•. ## ื”ื›ื ืกืช ืžื™ื“ืข ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืื—ืจื™ ืฉื™ืฉ ืœื ื• ืกื›ื™ืžื” ืืคืฉืจ ืœื ืกื•ืช ืœื”ื›ื ื™ืก ืืช ื”ืžื™ื“ืข. ื›ื‘ืจ ืืžืจืชื™ ืฉืื ื™ ืขื•ืฉื” ืคื” ื”ื ื—ื” ื•ืœื ืื›ืชื•ื‘ ืืช ื”ืงื•ื“ ืฉื™ืคืขื ื— ืืช ื”ืงืœื˜ ื”ืืžื™ืชื™, ืื‘ืœ ื›ืŸ ืจืฆื™ืชื™ ืฉืชื•ื›ื ื™ืช ื”ืงืœื•ื–'ืจ ืฉืื›ืชื•ื‘ ื›ื“ื™ ืœื”ื›ื ื™ืก ืืช ื”ืžื™ื“ืข ืชื”ื™ื” ื›ืžื” ืฉื™ื•ืชืจ ื“ื•ืžื” ืœืงืœื˜ ื”ืืžื™ืชื™, ื‘ืจืžื” ืฉืœ ืžืฉื”ื• ืฉืืคืฉืจ ืœื™ืฆื•ืจ ืื•ื˜ื•ืžื˜ื™ืช ืขื sed. ืื—ืจื™ ืžื—ืฉื‘ื” ื”ืœื›ืชื™ ืขืœ ื”ืžื‘ื ื” ื”ื‘ื:
(dir "a")
(file "b.txt" 14848514)
(file "c.dat" 8504156)
(dir "d")
(cd "a")
(dir "e")
(file "f" 29116)
(file "g" 2557)
(file "h.lst" 62596)
(cd "e")
(file "i" 584)
(cd "..")
(cd "..")
(cd "d")
(file "j" 4060174)
(file "d.log" 8033020)
(file "d.ext" 5626152)
(file "k" 7214296)
ื‘ืฉื‘ื™ืœ ืฉื–ื” ื™ืขื‘ื•ื“ ืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืืช ื”ืคื•ื ืงืฆื™ื•ืช dir, file ื• cd. ื‘ืฉื‘ื™ืœืŸ ื’ื™ืœื™ืชื™ ืฉืžืื•ื“ ืขื•ื–ืจ ืœื”ื’ื“ื™ืจ ืคื•ื ืงืฆื™ื” ื‘ืฉื cwd ืฉืžื—ื–ื™ืจื” ืืช ื”ืชื™ืงื™ื” ื”ื ื•ื›ื—ื™ืช. ื ืชื—ื™ืœ ืขื ื”ืงื•ื“ ืฉืœื” ื›ื™ ื›ืœ ื”ืคื•ื ืงืฆื™ื•ืช ื”ืื—ืจื•ืช ื™ืฉืชืžืฉื• ื‘ื”:
(defn cwd []
  (let [db (d/db conn)]
    (d/q '[:find ?cwd .
           :where
           [?fs :fs/id "/"]

ToCode
1 420
# ื›ืฉื™ืฉ ืœืš ืคื˜ื™ืฉ ื‘ื”ื™ื ืชืŸ ื‘ืขื™ื”, ื›ืœื™ ื”ืขื‘ื•ื“ื” ืฉืื ื—ื ื• ื‘ื•ื—ืจื™ื ื™ื”ื™ื” ื›ืžืขื˜ ืชืžื™ื“ ืžืชื•ืš ืกื˜ ื”ื›ืœื™ื ืฉืื ื—ื ื• ืžื›ื™ืจื™ื. ืœื›ืŸ ื”ืžืฉืคื˜ ื”ืžืคื•ืจืกื ื™ื”ื™ื” ื ื›ื•ืŸ ื™ื•ืชืจ ืื ื ื ืกื— "ื›ืฉืจืื™ืช ืจืง ืคื˜ื™ืฉื™ื ื‘ืขื‘ืจ, ื›ืœ ื“ื‘ืจ ื ืจืื” ื›ืžื• ืžืกืžืจ". ื•ื›ืืŸ ื™ืฉ ื’ื ืฉืชื™ ื”ื–ื“ืžื ื•ื™ื•ืช ืœืœืžื™ื“ื”- 1. ื›ื“ืื™ ืœื—ืคืฉ ืื ืฉื™ื ืฉืจืื• ื“ื‘ืจื™ื ืื—ืจื™ื ืžืžืš. ื›ื›ืœ ืฉื ืžืฆื ื›ืืœื” ื›ืš ื ื›ื™ืจ ืฉื™ื˜ื•ืช ื—ื“ืฉื•ืช ืœืคืชื•ืจ ื‘ืขื™ื•ืช ื•ื“ืจื›ื™ ืžื—ืฉื‘ื” ืฉืื•ืœื™ ืœื ื—ืฉื‘ื ื• ืขืœื™ื”ืŸ. 2. ื›ื“ืื™ ืœืœืžื•ื“ ื›ืœื™ื ื—ื“ืฉื™ื, ื’ื ืื ื”ื ืœื ื™ืชื ื• ืืช ื”ืคื™ืชืจื•ืŸ ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ ืœื‘ืขื™ื”, ื•ืืคื™ืœื• ืฉื•ื•ื” ืœืคืชื•ืจ ืืช ืื•ืชื” ื‘ืขื™ื” ื›ืžื” ืคืขืžื™ื ืขื ื›ืœื™ื ืื—ืจื™ื. ื›ื™ ืื ืกื˜ ื”ื›ืœื™ื ืฉืื ื—ื ื• ืžื›ื™ืจื™ื ืงื•ื‘ืข ืืช ืกื˜ ื”ืคื™ืชืจื•ื ื•ืช ืฉื ื•ื›ืœ ืœื”ืฆื™ืข, ื™ื•ืชืจ ื›ืœื™ื ืžื•ื‘ื™ืœื™ื ื™ืฉื™ืจื•ืช ืœืคื™ืชืจื•ื ื•ืช ื™ื•ืชืจ ืžืขื ื™ื™ื ื™ื.

ToCode
1 420
ื•ืžืขื ื™ื™ืŸ ืœืฉื™ื ืœื‘ ืฉื’ื ื”ืกื›ื™ืžื” ื”ื™ื ืคืฉื•ื˜ ืื•ืกืฃ ืฉืœ ืขื•ื‘ื“ื•ืช, ื•ืื™ืŸ ื”ื‘ื“ืœ ื‘ื™ืŸ ืœืฉื“ืจ ืืช ื”ืขื•ื‘ื“ื•ืช ืœื’ื‘ื™ ื”ืคื•ืกื˜ื™ื ืื• ื”ืžื ื•ื™ื™ื ืœื‘ื™ืŸ ืฉื™ื“ื•ืจ ื”ืขื•ื‘ื“ื•ืช ืฉืœ ื”ืกื›ื™ืžื”. ืขื›ืฉื™ื• ื‘ื•ืื• ื ืจืื” ืงืฆืช ืฉืื™ืœืชื•ืช. ื”ืฉืื™ืœืชื” ื”ืจืืฉื•ื ื” ืžื—ื–ื™ืจื” ืืช ื”ื›ื•ืชืจื•ืช ืฉืœ ื›ืœ ื”ืคื•ืกื˜ื™ื:
(d/q '[:find ?title :where [_ :post/title ?title]] (d/db conn))

;; returns: #{["second post"] ["rust"] ["first post"]}
ืืคืฉืจ ื’ื ืœืงื‘ืœ ืืช ื›ืœ ื”ืคื•ืกื˜ื™ื ื™ื—ื“ ืขื ื” slug ืฉืœ ื›ืœ ืคื•ืกื˜:
(d/q '[:find ?title ?slug :where
       [?p :post/title ?title]
       [?p :post/slug ?slug]] (d/db conn))
       
;; returns #{["rust" "rust"] ["second post" "second"] ["first post" "first"]}
ื•ืคื” ื›ื“ืื™ ืœืฉื™ื ืœื‘ ืœืฉื™ืžื•ืฉ ื‘ืžืฉืชื ื” ?p - ื‘ืขืฆื ื‘ื™ืงืฉืชื™ ืžื“ื˜ื•ืžื™ืง ืœื”ื—ื–ื™ืจ ืžื™ื“ืข ืขืœ ื™ืฉื•ื™ื•ืช ืœืคื™ ืฉืชื™ ืขื•ื‘ื“ื•ืช ืขืœ ื”ื™ืฉื•ื™ื•ืช, ื’ื ืฉืœื™ืฉื•ืช ื™ืฉ :post/title ื•ื’ื ืฉื™ืฉ ืœื” :post/slug. ื‘ื’ืœืœ ืฉืฉื ื™ ื”ืชื ืื™ื ืžืชื™ื—ืกื™ื ืœืื•ืชื• ืžืฉืชื ื” ?p ืงื™ื‘ืœืชื™ ืจืง ื™ืฉื•ื™ื•ืช ืฉืžื—ื–ื™ืงื•ืช ืขื•ื‘ื“ื•ืช ืžืฉื ื™ ื”ืกื•ื’ื™ื. ืื ื”ื™ื™ืชื™ ืžืฉืชืžืฉ ืฉื ื‘ _ ื‘ืžืงื•ื, ื”ื™ื™ืชื™ ืžืงื‘ืœ ืžืฉื”ื• ืฉื“ื•ืžื” ืœ Outer Join ื‘ SQL, ื›ืœื•ืžืจ ืืช ื›ืœ ื” title-ื™ื ืฉืœ ื›ืœ ื”ื™ืฉื•ื™ื•ืช ื•ืื—ืจื™ ื–ื” ืืช ื›ืœ ื” slug-ื™ื ืฉืœ ื›ืœ ื”ื™ืฉื•ื™ื•ืช, ื›ืœื•ืžืจ ืืช ื”ืจืฉื™ืžื”:
(d/q '[:find ?title ?slug :where
       [_ :post/title ?title]
       [_ :post/slug ?slug]] (d/db conn))

;; returns
;; #{["rust" "first"] ["rust" "rust"] ["first post" "second"] ["second post" "rust"] ["first post" "rust"] ["second post" "first"] ["second post" "second"] ["rust" "second"] ["first post" "first"]}
ืฉืื™ืœืชื” ื™ื•ืชืจ ืžืขื ื™ื™ื ืช ืชื—ื–ื™ืจ ืืช ื›ืœ ื”ืคื•ืกื˜ื™ื ืฉืžืขื ื™ื™ื ื™ื ืžืฉืชืžืฉ ืžืกื•ื™ื:
(d/q '[:find ?title :where
       [?p :post/title ?title]
       [?p :post/categories ?c]
       [?s :subscriber/email "all@demomail.com"]
       [?s :subscriber/categories ?c]] (d/db conn))

;; returns #{["second post"] ["rust"] ["first post"]}
ื–ื” ืขื•ื‘ื“ ื›ื™ ื”ืžืฉืชื ื” ?c ืžื•ืคื™ืข ื’ื ื‘ืจืฉื™ืžืช ื”ืงื˜ื’ื•ืจื™ื•ืช ืฉืœ ื”ืคื•ืกื˜ ื•ื’ื ื‘ืจืฉื™ืžืช ื”ืงื˜ื’ื•ืจื™ื•ืช ืฉืœ ื”ืžื ื•ื™. ื“ื˜ื•ืžื™ืง ืžื‘ื™ืŸ ืฉื–ื” ืื•ืชื• ืžืฉืชื ื” ื•ืœื›ืŸ ืžื—ืคืฉ ืคื•ืกื˜ื™ื ืฉืฉืœื™ืฉื™ื™ืช ื”ืงื˜ื’ื•ืจื™ื•ืช ืฉืœื”ืŸ ื›ื•ืœืœืช ืื™ื–ื•ืฉื”ื™ ืงื˜ื’ื•ืจื™ื” ืžื‘ื™ืŸ ื”ืงื˜ื’ื•ืจื™ื•ืช ืฉืœ ื”ืžื ื•ื™. ื‘ืฉื‘ื™ืœ ืœืกืžืŸ ืฉืžื ื•ื™ ืžืกื•ื™ื ืงื™ื‘ืœ ืคื•ืกื˜ ืžืกื•ื™ื ืื ื™ ืžืฉืชืžืฉ ื‘ื˜ืจื ื–ืืงืฆื™ื” ื”ื‘ืื”:
@(d/transact conn [
                   {:subscriber/email "clojure@demomail.com"
                    :subscriber/received {:db/id [:post/slug "first"]}}])
ื•ื‘ื’ืœืœ ื” Cardinality ืฉืœ ื”ืžืืคื™ื™ืŸ received ื“ื˜ื•ืžื™ืง ื™ื•ื“ืข ืœื”ื•ืกื™ืฃ ืืช ื”ืคื•ืกื˜ ืฉื‘ื™ืงืฉืชื™ ืœืจืฉื™ืžื” ืฉื ื‘ืžืงื•ื ืœื”ื—ืœื™ืฃ ืขืจืš ื‘ื•ื“ื“. ืขื›ืฉื™ื• ืืคืฉืจ ืœื”ืžืฉื™ืš ื•ืœืฉืื•ืœ ืื™ื–ื” ืคื•ืกื˜ื™ื ืžืฉืชืžืฉ ืžืกื•ื™ื ื›ื‘ืจ ืงื™ื‘ืœ:
(d/q '[:find ?title :where
       [?p :post/title ?title]
       [?s :subscriber/email "clojure@demomail.com"]
       [?s :subscriber/received ?p]] (d/db conn))

;; #{["first post"]}
ื•ื™ื•ืชืจ ืžืขื ื™ื™ืŸ, ืื™ื–ื” ืคื•ืกื˜ื™ื ืฉื”ืžืฉืชืžืฉ ืจืฉื•ื ืœืงื‘ืœ ื”ื•ื ืขื“ื™ื™ืŸ ืœื ืงื™ื‘ืœ:
(d/q '[:find ?post-slug
       :where
       [?subscriber :subscriber/email "clojure@demomail.com"]
       [?subscriber :subscriber/categories ?cat]
       [?post :post/categories ?cat]
       (not-join [?subscriber ?post]
                 [?subscriber :subscriber/received ?post])
       [?post :post/slug ?post-slug]] (d/db conn))
       
;; returns #{["second"]}
ืฉืคืช ื”ืฉืื™ืœืชื•ืช datalog ืžืชื’ืœื” ื›ืฉืคื” ืžืื•ื“ ื™ื“ื™ื“ื•ืชื™ืช ื•ืงืจื™ืื”, ื‘ืžื™ื•ื—ื“ ื‘ื”ืฉื•ื•ืื” ืœ SQL. ื•ื›ืŸ ื–ื• ืฉืคื” ื—ื“ืฉื” ื•ืฆืจื™ืš ืœืœืžื•ื“ ืื•ืชื”, ืื‘ืœ ืื ื™ ืžืงื•ื•ื” ืฉื›ื‘ืจ ืžื”ื“ื•ื’ืžืื•ืช ื”ืงื˜ื ื•ืช ื›ืืŸ ืืคืฉืจ ืœืจืื•ืช ืืช ื”ื›ื— ืฉืœื”. ## ืžื” ื”ืœืื” ื”ืžืงื•ื ื”ื›ื™ ื˜ื•ื‘ ืœืœืžื•ื“ ื‘ื• ืขื•ื“ ืขืœ Datomic ื”ื•ื ื”ืชื™ืขื•ื“ ืฉืœื”ื, ืฉืงืฆืช ืงืฆืจ ื‘ื“ื•ื’ืžืื•ืช ืื‘ืœ ื›ื•ืœืœ ืื™ื ืกื•ืฃ ื”ืกื‘ืจื™ื ืžืงื™ืคื™ื: https://docs.datomic.com/on-prem/getting-started/brief-overview.html. ืื ืืชื ื‘ืขื ื™ื™ืŸ ื”ืจืฆืื•ืช ื‘ื™ื•ื˜ื™ื•ื‘ ืื– ื›ืืŸ ืจื™ืง ื”ื™ืงื™ ืžืกื‘ื™ืจ ืขืœ ื“ื˜ื•ืžื™ืง: https://www.youtube.com/watch?v=9TYfcyvSpEQ ื•ื›ืืŸ ื™ืฉ ื”ืจืฆืื” ื™ื•ืชืจ ื˜ื›ื ื™ืช ืขืœ ืื™ืš ืขื•ื‘ื“ื™ื ืื™ืชื• ื•ืื™ืš ืžื ื”ืœื™ื ืžื™ื“ืข: https://www.youtube.com/watch?v=yWdfhQ4_Yfw ื•ืื—ืจื•ื ื” ืขืœ ืฉืคืช ื”ืฉืื™ืœืชื•ืช datalog: https://www.youtube.com/watch?v=bAilFQdaiHk